SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

LINEで始めるアプリ開発

LINEでメッセージの送受信を行おう! Messaging APIの基本的な使い方から解説

LINEで始めるアプリ開発 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

メッセージを受信する

 続いて、メッセージを受信する場合について紹介します。LINEシステムからのメッセージは、HTTP POSTにて送信されてきます。受信したデータは次のような流れで処理をしていきます。

  • リクエストの正当性の確認
  • 受信したメッセージのイベント種別毎に処理を行う

メッセージのイベント種類

 LINEでの利用者が行うさまざまな操作等もメッセージとして受信することは前述しましたが、具体的には以下のようなイベント種別があります。

表3:メッセージの主なイベント種別
イベント種別 システムID 説明
メッセージイベント message 利用者からの送信メッセージを受信したイベント
送信取消イベント unsend 利用者からの送信メッセージを受信したイベント
フォローイベント follow 友だち登録をしたとき、またはブロックを解除したときのイベント
フォロー解除イベント unfollow 利用者がチャネルをブロックしたときのイベント
ポストバックイベント postback 利用者がメッセージないのボタンやリンクをタップした時やサービス側で設定したメニューなどをタップした時のイベント
動画視聴完了イベント videoPlayComplete 送信した動画視聴が完了した時のイベント

 システムIDは後述するメッセージデータ内で種別を識別する際の値になります。

 また、これ以外にもグループトークでのイベントやIoTデバイス連携などをしている場合など、他のイベント種別もありますので、くわしくはMessaging APIのドキュメントを参照してください。

リクエストの正当性を確認する

 LINEシステムからのリクエストを受け付ける際に、そのリクエストが正当なリクエストなのかはセキュリティ上非常に大切なことです。Webhookという仕組みでデータを受信するので、知らないサーバから不正なデータが送信されてくることもあり得ます。

 そこで、正当なリクエストを確認するためには、リクエストヘッダのx-line-signatureの値とDevelopersコンソールで取得できるチャネルシークレットを利用したハッシュ値を使って確認します。

 リスト5は、この確認処理をPHPで行う場合のコード例です。

リスト5:x-line-signatureの値による確認の例
$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は、利用者がテキストを送信した場合のデータ例です。

リスト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内では、以下のようなプロパティが共通として用意されています。

表4:共通プロパティ
プロパティ 説明
type イベント種別毎のID
message 送信メッセージのデータ。内容はイベント種別毎に異なります。
mode 通常はactiveという値が設定されます。モジュールチャネルという法人ユーザが利用できるオプションを使っていない場合には特に関係ありません。
webhookEventId イベントを一意に識別するIDです。
deliveryContext.isRedelivery 再送信されたかどうか。trueなら再送信データ。
timestamp イベントの発生時刻(ミリ秒)です。
source イベントの発生元。typeがuserの場合には、userIdにユーザIDがあるのでその他のシステムとユーザ連携が可能です。
replyToken メッセージ返信APIを使う場合に利用する値です。この値を使った送信の場合には、料金としてカウントされないメッセージ送信ができます。

 この受信したメッセージに応じてシステム側で処理を行っていきます。

メッセージに返信テキストを送信する

 最も基本的な処理である受信したメッセージに対してテキストメッセージを返信するケースを紹介します。前述した、プッシュメッセージAPIを利用すれば返信する事はできますが、それでは料金にカウントされてしまいます。そこで、返信では、応答メッセージを送るAPIを利用します。

 基本的には同じですが、toでユーザを指定する代わりに受信したメッセージ内にあるreplyTokenを使って、リスト7のように送信メッセージを作成します。

リスト7
{
  "replyToken" : "<replyTokenの値>",
  "messages" : [
    {
      "type" => "text",
      "text" => "お問合せありがとうございます"
    }
  ]
}

 あとは、これまでと同様にリスト8のように送信可能です。

リスト8:応答メッセージの利用例(message/reply.phpの抜粋)
$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アプリを紹介します。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
LINEで始めるアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17654 2023/04/28 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング