LINE BOTを使ってみよう。(CallBackプログラム:受信編)

2018-04-11PHP

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