LINE BOTを使ってみよう。(CallBackプログラム:受信編)
導入では、APIを使用するための設定等を行いました。
今回は、ラインでメッセージを投函したらサーバ側で、そのメッセージを受け取るためのプログラムを作ろうと思います。
メッセージの仕組みは line developer を確認してください。
プログラムを作る前に、もうひと手順必要な作業があります。
自分のラインにお友達登録をしなくては、メッセージが送れません。
はじめにお友達登録
お友達と録するにはLINE@MANAGER の画面で
[アカウント設定] ⇒ [基本設定] に、QRコード、お友達登録ボタンがあります。
こんなの
メッセージ受信
ラインから投函されたメッセージを受け取るには
file_get_contents('php://input');
を使用します。
取得できたメッセージはJSON エンコードされた文字列になっているのでjson_decodeする必要があります。
まずは、単純なテキストメッセージのサンプルです。
"events":[ { "type":"message", "replyToken":"**********************************", "source":{ "userId":"****************************************", "type":"user" }, "timestamp":1519880034171, "message":{ "type":"text", "id":"7551938268202", "text":"さんぷるめっせーじ" } } ]
簡単に構造を説明しますと。
type | [メッセージ][友達加入][退会][ロック]を表す |
---|---|
replyToken | 応答用のID |
source ⇒ userId | 送ってきた人のLINE ID |
message ⇒ type | オブジェクトの種類(テキスト、画像など) |
message ⇒ id | オブジェクトに振られたID |
message ⇒ text | 送ってきた人が入力した文字 |
これさえ理解したら使えます。
項目の説明
1行目のtype
これは、送られてきたメッセージが、ユーザからのメッセージなのか?LINEからの通知なのかを判断します。
種類は以下の通りです。
message | 送ってきた人からのメッセージ |
---|---|
follow | LINEグループの入会 |
leave | LINEグループの退会 |
unfollow | アカウントロック |
LINEにお友達登録された時は、「follow」が届きます。しかし、退会したときは「leave」が送れてきません。
退会方法の設定が悪いのか?いささか疑問です。
※退会手順は、LINEのユーザ画面から長押しでアカウントロック。そのあと設定のアカウントロック一覧から削除をしてみました。
message ⇒ typeの種類
次に、見なくてはいけないところは、実際のメッセージです。
ラインでは、テキスト以外に、画像、音声、動画、ファイルなどを送れます。
その判断は、[message] ⇒ [type]でどんな形式であるかで判断し、それぞれに合ったロジックを作ります。
text | テキスト文 |
---|---|
image | 画像 |
sticker | スタンプ |
file | ファイル |
video | 動画 |
audio | 音声 |
location | 位置情報 |
rich | リッチメッセージ |
各Typeの受信方法
画像、動画、音声は、コマンドを発行して情報を取得します。
テキストは、メッセージに、そのままありますので問題ありません。
スタンプはスタンプIDでのやり取りだけですので、そう難しくはありません。
※位置情報、リッチは試していません。
画像、動画、音声の取得
これら、3種類はAPIを発行して取得を行います。
// HTTPリクエスト GET https://api.line.me/v2/bot/message/{messageId}/content
APIヘルプは こちら
curl_initで取得したハンドルをファイル出力します。
もし、取得したとき失敗していたら、戻り値はJSON エンコードされた文字列が設定されていますのでエラーメッセージを確認してください。
プログラムはこんな感じ
$ch = curl_init("https://api.line.me/v2/bot/message/".$obj_id."/content"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8', 'Authorization: Bearer ' . $this->AccessToken )); $result = curl_exec($ch); curl_close($ch); $msg = json_decode($result); if ( $msg->message != "" ){ // エラー処理 } // ファイルの作成 $fileInfo = LINE_IMG_PATH."/".$obj_id.".jpg"; $fp = fopen( $fileInfo, 'wb' ); if ($fp){ if (flock($fp, LOCK_EX)){ if ( fwrite($fp, $result ) === FALSE ){ // エラー処理 } flock($fp, LOCK_UN); }else{ // エラー処理 } } fclose($fp);
スタンプの取得
APIで使用できるスタンプには制限があります。
LINEをインストールしたときに標準で入っているスタンプしかやり取りできません。
(フリー、購入したスタンプは使用できないのです。)
使用できるスタンプは こちら をご確認ください。
実際のスタンプのIDは以下の項目に設定されています。
[message] ⇒ [stickerId]
[message] ⇒ [packageId]
作ったプログラム(CallBack.php)をLINE@MANAGERに登録
line developers サイトから「Webhook URL」にCallBackプログラムのURLを設定します。
設定後、右側に「接続確認」ボタンが表示されます。
これは、設定したCallBackプログラムが正常にCallできるかのチェックです。
実際の動きは、テスト用のパラメータを付加した形でプログラムをCallすることになります。
ということは、CallBackプログラムではテスト用のメッセージが来たら適切な処理をしなければいけないという事です。
私は、次の様にして判断処理を入れておきました。
// 接続テストの場合は処理中止 if ( $replyToken == "00000000000000000000000000000000" ){ // 接続テスト実施 のログを出力 return; }
受信処理の基本はこのような感じです。
次は、送信処理を作っていくことにします。
[前の記事]LINE BOTを使ってみよう。(導入編)
[次の記事]LINE BOTを使ってみよう。(CallBackプログラム:テキスト送信編)