Help us understand the problem. What is going on with this article?

LINE Notifyを使って、PHPとcurlでLINEに通知を送る

More than 1 year has passed since last update.

LINEに通知を送る

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

目次

  • 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の通知

スクリーンショット 2018-04-23 19.25.54.png

コードの解説

$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に記されています。

参照した記事

Guzzleを使う方法を公開しました

Guzzleというライブラリを利用するとシンプルに書けました。
LINE Notifyを使って、PHPとGuzzleでLINEに通知を送る

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away