PHP + curlでLINEに通知する(LINE Notify)
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の通知
コードの解説
$tokenに取得したトークンを代入する
トークンの取得の方法は下記記事をご参照ください。 [超簡単]LINE notify を使ってみる
$messageに通知する内容を書く
LINEの通知画像に出ている**[bot]**は、 トークンを発行する際に自分で設定する文字列です。
また、配列$dataにパラメータを追加することで、画像を送ることもできます。 (対応しているパラメータについてはLINE Notify API Documentを参照)
curlのオプションの説明
| オプション | 解説 | |:-----------------|-------------------| | 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のデバッグに役立つ情報も書き添えておきます。
送信したリクエスト文字列を取得する
手順
- 配列$optionに
CURLINFO_HEADER_OUT => true
を追加する 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に記されています。
参照した記事
- LINEの公式ドキュメントです LINE Notify API Document
Happy Coding 🎉