記事一覧
Topに戻る
  • TOP
  • PHP
  • PHP + curlでLINEに通知する(LINE Notify)

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

更新日:

by @Panda_Program

目次

LINEに通知を送る

filegetcontents()を使う記事はあったのですが、自分の環境では動かなかったため、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 🎉