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プログラム:テキスト送信編)








