前回の
Echo botを作ってみよう
(1)
リスト1は入力されたテキストをオウム返しする簡単なEcho botです。最初に、
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@アカウントに対して一般ユーザーからのメッセージが送信されると、
(1)plackup echo.
として起動するだけでEcho botが動作します。
受信したメッセージを署名検証する
Webhook URLに対して、
LINEのサーバからのリクエストにはX-Line-Signatureヘッダが付与されています。bot側はこのヘッダの値を検証することで、
Webhook event objectを処理する
ユーザーがbotにメッセージを送信したり、parse_
メソッドが提供されていますので、
個人開発規模のbotでは一度の送信につき1つのイベントが送信されますが、
本節ではMessage Eventのみを取り扱っていますが、
- Message Event
- テキスト、
画像、 スタンプなどが送信されたとき - Follow Event
- botがユーザーから友だち登録されたとき
- Unfollow Event
- botがユーザーからブロックされたとき
- Join Event
- botがグループまたはトークルームに招待されて参加したとき
[5] - Leave Event
- botがグループから退出させられたとき
LINE::Bot::API::Eventでイベントの処理をする
parse_
メソッドでイベントのパースを行うと、
説明 | メソッド例 |
---|---|
送信元の種類 | is_ |
イベントの種類 | is_ |
Message Eventでのメッセージの種類 | is_ |
返信用のメッセージを作成する
前項までは、
公式SDKではSend message objectを簡単に構築するためのLINE::Bot::API::Builder::SendMessageが実装されており、
LINE::Bot::API::Builder::SendMessage->new
->add_text( text => $event->text )
->add_image(
image_url => '...', preview_url => '...'
)
->build;
メッセージを返信する
Messaging APIには、
Webhook URLで受信したイベントの中で、replyToken
が含まれます。Echo botなどのユーザーからの入力に返信するタイプのbotでは、reply_
を使ってreply_
メソッドを呼び出すことで、
replyToken
は一度使うと再利用が不可能になり、
自発的にメッセージを送信する
前節ではEcho botを実装したので、
送信先のIDを取得する
LINE BOTは、userId
、groupId
と、
my $from_id;
if ($event->is_user_event) {
# ユーザーIDを取得
$from_id = $event->user_id;
} elsif ($event->is_group_event) {
# グループIDを取得
$from_id = $event->group_id;
} elsif ($event->is_room_event) {
# トークルームIDを取得
$from_id = $event->room_id;
}
返信のAPIとは違い、
1つの送信先に送信する
単独の送信先にメッセージを送信するには、push_
メソッドを利用することで送信可能で、
$bot->push_message($from_id, $messages->build);
複数人に同時に送信する
定時バッチ処理の配信では、multicast
メソッドから利用できます。
$bot->multicast([$user1_id, $user2_id, $user3_id, ...],
$messages->build);
Multicast APIの制限としては、
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、 NFT