Perl Hackers Hub

第44回 LINE Messaging APIで作るchatbot―LINE::Bot::APIとngrokでお手軽に!(2)

この記事を読むのに必要な時間:およそ 3 分

前回の(1)こちらから。

Echo botを作ってみよう

(1)でbotを開発する環境が整いました。⁠2)以降では公式SDKとPSGIPerl Web Server Gateway Inter face/Plackを利用して実装します。

リスト1は入力されたテキストをオウム返しする簡単なEcho botです。最初に,前節で作成したLINE@アカウントをLINE::Bot::APIで利用するための設定が必要です。(1)がその設定で,Developer centerで取得したChannel SecretとChannel Access Tokenを記述します。(2)からは通常のPSGIアプリケーションです。

リスト1 echo.psgi

use strict;
use warnings;
use Plack::Request;
use LINE::Bot::API;
use LINE::Bot::API::Builder::SendMessage;

my $bot = LINE::Bot::API->new(    ―(1)
  channel_secret => 'Channel Secret',
  channel_access_token => 'Channel Access Token',
);

sub {    ―(2)
  my $req = Plack::Request->new(shift);

  unless ($bot->validate_signature($req->content,    ―(3)
            $req->header('X-Line-Signature'))) {
    return [200, [], ['bad request']];
}

my $events = $bot->parse_events_from_json(
                     $req->content);    ―(4)
  for my $event (@{ $events }) {    ―(5)
    if ($event->is_user_event && $event->is_message_event
          && $event->is_text_message) {    ―(6)
      my $messages = LINE::Bot::API::Builder::SendMessage
        ->new->add_text( text => $event->text );    ―(7)
      my $res = $bot->reply_message($event->reply_token,
                  $messages->build);    ―(8)
      ... unless $res->is_success; # error handling
    }
  }

  return [200, [], ["OK"]];
};

Webhookイベントを受信する

botとして作成されたLINE@アカウントに対して一般ユーザーからのメッセージが送信されると,Developer centerで設定したWebhook URL宛にWebhook event objectと呼ばれるJSONオブジェクトが送信されます。bot開発者は,このJSONオブジェクトを受信して適切な処理をする必要があります。

(1)で,ngrokによって作成されたURLをWebhook URLとして設定しており,localhostの5000番ポートでWebhook event objectを受け取れる状態になっています。そのため,リスト1のecho.psgiをplackup echo.psgiとして起動するだけでEcho botが動作します。

受信したメッセージを署名検証する

Webhook URLに対して,偽造したWebhook eventobjectを送信されると,bot側の処理によっては動作の不具合やセキュリティリスクが生じることになります。

LINEのサーバからのリクエストにはX-Line-Signatureヘッダが付与されています。bot側はこのヘッダの値を検証することで,正規のLINEサーバからのリクエストであることを確認できます。公式SDKでは(3)のvalidate_signatureメソッドを利用して署名検証が行えます。公式SDKを利用すれば簡単に署名検証ができるので,リクエストごとに必ず署名検証を行ってください。

Webhook event objectを処理する

ユーザーがbotにメッセージを送信したり,友だちの追加などのイベントが発生したりするタイミングで,LINEサーバからWebhook URLにWebhook event objectを送信します。公式SDKでは,このJSONオブジェクトをパースしてPerlのオブジェクトに変換するparse_events_from_jsonメソッドが提供されていますので,(4)と同じくリクエストボディを簡単にパースできます。

個人開発規模のbotでは一度の送信につき1つのイベントが送信されますが,人気があるbotなど短時間に大量のメッセージが送信される状況になると,一度の送信で複数個のイベントが送信されてきます。そのため,botの実装側では必ず(5)のループ処理を行う必要があります。

本節ではMessage Eventのみを取り扱っていますが,Messaging APIでは主に次に示すイベントが利用できます。

Message Event
テキスト,画像,スタンプなどが送信されたとき
Follow Event
botがユーザーから友だち登録されたとき
Unfollow Event
botがユーザーからブロックされたとき
Join Event
botがグループまたはトークルームに招待されて参加したとき注5
Leave Event
botがグループから退出させられたとき
LINE::Bot::API::Eventでイベントの処理をする

(4)parse_events_from_jsonメソッドでイベントのパースを行うと,JSONオブジェクトの内容に適したLINE::Bot::API::Eventのオブジェクトが生成されます。これには(6)で記したように受け取ったイベントの種別を簡潔に判断するためのメソッドが実装されています。主なメソッドは表1で示しました。詳細はLINE::Bot::API::Eventのオンラインドキュメントをご覧ください。(6)ではユーザーとの1対1のトークの中で,Textタイプと呼ばれる単純なテキストメッセージを受けとったときに,Echo botとして反応するよう実装しています。

表1 主なイベントオブジェクトのメソッド

説明メソッド例
送信元の種類is_user_event,is_group_event,is_room_event
イベントの種類is_message_event,is_follow_event,is_unfollow_event,is_join_event,is_leave_event
Message Eventでのメッセージの種類is_text_message,is_image_message,is_sticker_message
注5)
botが参加するためにはLINE@ MANAGERでの設定が必要です。

著者プロフィール

大沢和宏(おおさわかずひろ)

開発3センター サービス開発3室。翻訳Botなど,初期のBotサービス関連の開発を担当,その後LINE Taiwanのサービスを経て,現在はLINE LIVEのサーバ開発を行っている。

URL:https://github.com/yappo/

コメント

コメントの記入