メッセージを受信する
続いて、メッセージを受信する場合について紹介します。LINEシステムからのメッセージは、HTTP POSTにて送信されてきます。受信したデータは次のような流れで処理をしていきます。
- リクエストの正当性の確認
- 受信したメッセージのイベント種別毎に処理を行う
メッセージのイベント種類
LINEでの利用者が行うさまざまな操作等もメッセージとして受信することは前述しましたが、具体的には以下のようなイベント種別があります。
イベント種別 | システムID | 説明 |
---|---|---|
メッセージイベント | message | 利用者からの送信メッセージを受信したイベント |
送信取消イベント | unsend | 利用者からの送信メッセージを受信したイベント |
フォローイベント | follow | 友だち登録をしたとき、またはブロックを解除したときのイベント |
フォロー解除イベント | unfollow | 利用者がチャネルをブロックしたときのイベント |
ポストバックイベント | postback | 利用者がメッセージないのボタンやリンクをタップした時やサービス側で設定したメニューなどをタップした時のイベント |
動画視聴完了イベント | videoPlayComplete | 送信した動画視聴が完了した時のイベント |
システムIDは後述するメッセージデータ内で種別を識別する際の値になります。
また、これ以外にもグループトークでのイベントやIoTデバイス連携などをしている場合など、他のイベント種別もありますので、くわしくはMessaging APIのドキュメントを参照してください。
リクエストの正当性を確認する
LINEシステムからのリクエストを受け付ける際に、そのリクエストが正当なリクエストなのかはセキュリティ上非常に大切なことです。Webhookという仕組みでデータを受信するので、知らないサーバから不正なデータが送信されてくることもあり得ます。
そこで、正当なリクエストを確認するためには、リクエストヘッダのx-line-signatureの値とDevelopersコンソールで取得できるチャネルシークレットを利用したハッシュ値を使って確認します。
リスト5は、この確認処理をPHPで行う場合のコード例です。
$client_secret = "チャネルシークレット値を設定"; $data = file_get_contents('php://input'); // (1) $hash = hash_hmac('sha256',$data,$client_secret,true); // (2) $base64_hash = base64_encode($hash); // (3) if($_SERVER['HTTP_X_LINE_SIGNATURE'] != $base64_hash){ // 不正なリクエストなので何もしない return; }
(1)では、リクエストデータを取得します。そして、(2)でHMAC-SHA256のハッシュ値を作成します。続いて、その値を(3)のようにbase64エンコーディングした値が、x-line-signatureの値と同じであれば、正当なリクエストであると確認できます。
受信するメッセージのデータ構造
続いて受信するメッセージのデータの構造を把握する必要があります。リスト6は、利用者がテキストを送信した場合のデータ例です。
{ "destination": "U50802.................fcae6b4", "events": [ { "type": "message", "message": { "type": "text", "id": "17674856903126", "text": "こんにちは" }, "webhookEventId": "01GSPF...............VGZMDT", "deliveryContext": { "isRedelivery": false }, "timestamp": 1676865863299, "source": { "type": "user", "userId": "U7bba01a.............91864b0" }, "replyToken": "a1e2a97c.........cb55b59cbf", "mode": "active" } ] }
受信したメッセージ本体は、eventsに格納されます。ここで、eventsは配列形式になっているように必ずしも、1つではありません。また、同じイベント種別のデータとも限りませんので、例えば、メッセージイベントとフォローイベントが一緒に送られてくることもあります。
そして、events内では、以下のようなプロパティが共通として用意されています。
プロパティ | 説明 |
---|---|
type | イベント種別毎のID |
message | 送信メッセージのデータ。内容はイベント種別毎に異なります。 |
mode | 通常はactiveという値が設定されます。モジュールチャネルという法人ユーザが利用できるオプションを使っていない場合には特に関係ありません。 |
webhookEventId | イベントを一意に識別するIDです。 |
deliveryContext.isRedelivery | 再送信されたかどうか。trueなら再送信データ。 |
timestamp | イベントの発生時刻(ミリ秒)です。 |
source | イベントの発生元。typeがuserの場合には、userIdにユーザIDがあるのでその他のシステムとユーザ連携が可能です。 |
replyToken | メッセージ返信APIを使う場合に利用する値です。この値を使った送信の場合には、料金としてカウントされないメッセージ送信ができます。 |
この受信したメッセージに応じてシステム側で処理を行っていきます。
メッセージに返信テキストを送信する
最も基本的な処理である受信したメッセージに対してテキストメッセージを返信するケースを紹介します。前述した、プッシュメッセージAPIを利用すれば返信する事はできますが、それでは料金にカウントされてしまいます。そこで、返信では、応答メッセージを送るAPIを利用します。
基本的には同じですが、toでユーザを指定する代わりに受信したメッセージ内にあるreplyTokenを使って、リスト7のように送信メッセージを作成します。
{ "replyToken" : "<replyTokenの値>", "messages" : [ { "type" => "text", "text" => "お問合せありがとうございます" } ] }
あとは、これまでと同様にリスト8のように送信可能です。
$json_messages = json_encode("...."); // 送信するメッセージ $options = [ 'http' => [ 'method' => 'POST', 'header' => [ sprintf('Authorization: Bearer %s','<チャネルアクセストークン>'), 'Content-type: application/json', ], 'content' => $json_messages, // 省略 ), // 省略 )] $response = file_get_contents('https://api.line.me/v2/bot/message/reply',false,stream_context_create($options)); $json = json_decode($response,true);
最後に
受信する環境を構築するには少々面倒な部分もありますが、実際の処理自体は簡単なので、メッセージの送信や受信で悩むことはないはずです。しかし、今回は深く紹介できませんでしたが、メッセージデータをどのように作成するか、または、利用するかというところが、LINEシステムを構築する上でもっとも重要な要素と言えるでしょう。
特に、メッセージ内に用意したボタン等を通じて、ユーザ側の用途を限定したコミュニケーションをとっていくようなシステムを作りたい場合にはより重要になります。
次回は、そのような用途を想定した簡単なLIFFアプリとメッセージを連携したLINEアプリを紹介します。