PHP + curlでLINEに通知する(LINE Notify)

@Panda_Program

LINEに通知を送る

file_get_contents()を使う記事はあったのですが、自分の環境では動かなかったため、curlを使う方法を調べてみました。

(追記)Guzzleというライブラリを利用するとシンプルに書けました。

関連記事: LINE Notifyを使って、PHPとGuzzleでLINEに通知を送る

目次

  • curlを使ったコード
  • コードの解説
  • 参照した記事

curlを使ったコード

<?php
$token = 'トークン';

// リクエストヘッダの作成
$message = 'Lineに通知を送ります';
$query = http_build_query(['message' => $message]);
$header = [
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $token,
        'Content-Length: ' . strlen($query)
];

$ch = curl_init('https://notify-api.line.me/api/notify');
$options = [
    CURLOPT_RETURNTRANSFER  => true,
    CURLOPT_POST            => true,
    CURLOPT_HTTPHEADER      => $header,
    CURLOPT_POSTFIELDS      => $query
];

curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);

実行した結果

リクエストに成功すると、curl_exec($ch){"status":200,"message":"ok"}"と返ってきます。

LINEの通知

LINEに通知しますというメッセージ

コードの解説

$tokenに取得したトークンを代入する

トークンの取得の方法は下記記事をご参照ください。 [超簡単]LINE notify を使ってみる

$messageに通知する内容を書く

LINEの通知画像に出ている**[bot]**は、 トークンを発行する際に自分で設定する文字列です。

また、配列$dataにパラメータを追加することで、画像を送ることもできます。 (対応しているパラメータについてはLINE Notify API Documentを参照)

curlのオプションの説明

curl_setopt(PHPマニュアル)より引用

| オプション | 解説 | |:-----------------|-------------------| | CURLOPT_RETURNTRANSFER |TRUE を設定すると、curl_exec() の返り値を 文字列で返します| | CURLOPT_POST| TRUE を設定すると、HTTP POST を行います。POST は、 application/x-www-form-urlencoded 形式で 行われます| | CURLOPT_HTTPHEADER | 設定する HTTP ヘッダフィールドの配列| | CURLOPT_POSTFIELDS| HTTP "POST" で送信するすべてのデータ|

デバッグのTips

上記コードをコピペしてトークンを書き換えるだけで通知がくるようにはなりますが、 念のためcurlのデバッグに役立つ情報も書き添えておきます。

送信したリクエスト文字列を取得する

手順

  1. 配列$optionに CURLINFO_HEADER_OUT => true を追加する
  2. var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT)) でリクエスト文字列を表示

実行結果

POST /api/notify HTTP/1.1
Host: notify-api.line.me
Accept: */*
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer トークン
Content-Length: 84

Content-Typeやトークンが送信されているのがわかります。 トークンが無効である場合は下記のステータスコードが返って来ます。 {"status":401,"message":"Invalid access token"} その場合はトークンを再発行しましょう。

サーバーからのレスポンスを表示する 手順 var_dump($response); を追記する

実行結果

"HTTP/1.1 200 OK
Server: nginx
Date: Mon, 23 Apr 2018 09:53:55 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=3
X-RateLimit-Limit: 1000
X-RateLimit-ImageLimit: 50
X-RateLimit-Remaining: 989
X-RateLimit-ImageRemaining: 50
X-RateLimit-Reset: 1524480281
  • Date: Mon, 23 Apr 2018 09:53:55 GMT

DateがGMTになっていることがわかります。 日時が入った通知を送信する場合、下記のコードでタイムゾーンを設定する必要があります。 date_default_timezone_set('Asia/Tokyo');

  • X-RateLimit-Limit: 1000

これは1時間のAPI callの回数の上限を表します。 一時間で1000回までcallできるということです。 X-RateLimitの見方は、LINE Notify API DocumentのAPI Rate Limitに記されています。

参照した記事

Happy Coding 🎉

パンダのイラスト
パンダ

記事が面白いと思ったらツイートやはてブをお願いします!皆さんの感想が執筆のモチベーションになります。最後まで読んでくれてありがとう。

  • Share on Hatena
  • Share on Twitter
  • Share on Line
  • Copy to clipboard