![見出し画像](https://assets.st-note.com/production/uploads/images/36766355/rectangle_large_type_2_ea5fffb3d4e198bd94a7dc6270060adc.jpg?width=1200)
書籍「チャットボットをつくろう」写経 6日目 メッセージ送信とPHP実装まとめ
書籍の4章、5章を写経。写経中の疑問点や注意点をまとめておく。
最新の LINE Messaging API 情報
手持ちの書籍が2017年発行の第1版の為、最新のAPIの情報を確認しながら写経する。4,5章までは写経のまま動作したが、APIにより動作しない場合があるかもしれない。
ニュース: #Messaging API の記事リンク
最新のニュース:
Messaging APIの一部のエンドポイントのドメイン名
2019年11月8日、2020年3月19日、および2020年8月12日にお知らせしたとおり、Messaging APIの一部のエンドポイントのドメイン名は「api.line.me」から「api-data.line.me」に変更されました。
当初は、2020年4月30日を移行期限にしていましたが、利用状況を踏まえて移行期間を2020年10月30日までに延長しています。
Botサーバーのプログラムは、エンドポイントのドメイン名が変更されることを前提で実装する必要がありそう。
LINEメッセージの送信仕様まとめ
Messaging API は応答メッセージとプッシュメッセージがあるが、4,5章までは応答メッセージを利用したBotになる。
Messaging APIでは、大きく分けて2種類の送信方法(応答メッセージ、プッシュメッセージ)を利用できます。
※出典:LINE Developers より
応答メッセージの仕様は下記のようになっている。PHPで実装する場合も下記の仕様通りのリクエストをPOSTでLINE Messaging API のエンドポイントに送信すれば良い。
ヘッダー情報:
'Content-Type: application/json'
'Authorization: Bearer {channel access token}'
リクエストボディ:
"replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA"
"messages": [メッセージ配列]
メッセージ配列の中は、メッセージタイプ別のメッセージオブジェクトをセットする。
・メッセージオブジェクト
https://developers.line.biz/ja/reference/messaging-api/#message-objects
・テキストメッセージ
https://developers.line.biz/ja/reference/messaging-api/#text-message
一番シンプルなテキストメッセージは下記のJSONフォーマットとなる。
タイプ:"text"
テキスト:送信する文字列
{
"type": "text",
"text": "Hello, world"
}
PHPによるJSON文字列の生成方法
配列でデータを作成してJSONにエンコードする。
https://developers.line.biz/ja/reference/messaging-api/#send-reply-message
Shellによるコード例のボディ部のJSONが下記。
{
"replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"messages":[
{
"type":"text",
"text":"Hello, user"
},
{
"type":"text",
"text":"May I help you?"
}
]
}
// 出典:LINE Developers
PHPで上記のJSONを表すと下記のようになる。
[
'replyToken' => '{replytoken}',
'messages' => [
[
'type' => 'text',
'text' => 'Hello, user'
],
[
'type' => 'text',
'text' => 'May I help you?'
]
]
]
PHPによるテキストメッセージ送信の実装方法
PHPでリクエストを送信するには cURL 関数を使う。
cURLの使い方は下記の通り。
基本的な curl の使用法
https://www.php.net/manual/ja/curl.examples-basic.php
1. セッション初期化:curl_init()
https://www.php.net/manual/ja/function.curl-init.php
※例)curl_init("https://api.line.me/v2/bot/message/reply")
2. オプション設定:curl_setopt()
https://www.php.net/manual/ja/function.curl-setopt.php
3. 実行:curl_exec()
https://www.php.net/manual/ja/function.curl-exec.php
4. セッション終了:curl_close()
https://www.php.net/manual/ja/function.curl-close.php
リクエストの例を参考に cURL の設定を下記のようにする。
オプション設定
・POST通信→ CURLOPT_POST に TRUEを設定
・ヘッダー→ CURLOPT_HTTPHEADER にヘッダーを配列で設定
['Content-Type: application/json', 'Authorization: Bearer {channel access token}']
・ボディ→ CURLOPT_POSTFIELDS に LINE メッセージタイプ毎のJSON文字列を設定
WebhookイベントによるLINEメッセージ受信からメッセージ送信の流れ
LINEの公式ドキュメントによると、Webhookイベントを受けて、LINEメッセージ受信からLINEにメッセージを送信する流れは下記の通りになる。
1. 署名の検証(リクエストがLINEプラットフォームから送信されたことを確認する)
2. レスポンスの返却(200 OKを返す)
https://developers.line.biz/ja/reference/messaging-api/#response
3. リクエストのevent配列からメッセージごとに処理する
4. LINEにメッセージの送信
イベント処理の非同期化について
https://developers.line.biz/ja/reference/messaging-api/#webhooks
ここにある通り、LINE Webhook イベント処理には非同期処理が推奨されている。書籍では cURL関数を利用しているが、cURL関数の非同期版が提供されているので、そちらを利用して書き換える。
基本的な利用方法は下記の通り。
https://www.php.net/manual/ja/function.curl-multi-init.php
<事前処理>
1. curl_init():cURLハンドル生成
2. curl_setopt():通信オプションをセット
<非同期処理追加>
3. curl_multi_init():cURLマルチハンドル生成
4. curl_multi_add_handle():cURLマルチハンドルにcRULハンドルを追加
<処理実行>
5. curl_multi_exec():cURLマルチハンドルに追加した処理を実行
6. curl_multi_exec() の still_runningフラグの値が 0 になるまでループ(do ~ while)
<処理結果取得>
7. curl_getinfo() :レスポンスコードを取得
8. curl_multi_getcontent() :内容を取得
9. curl_multi_remove_handle() :cURLマルチハンドルに登録したcURLハンドルの削除
10. curl_close():cURLセッションクローズ
<後処理>
11. curl_multi_close():cURLマルチハンドルクローズ
並列処理の実装
書籍内でcURLを使って実装している部分を、前段の1~11の手順で書き換えて動作を確認した。
参考
LINE Messaging API の記事
LINE Developers のニュース記事の中で、Messaging API タグのもの