(1)はこちら 、( 2)はこちら から。
Message typeを使いこなし表現力豊かなbotにする
Echo botではTextタイプを利用したサンプルコードを紹介しましたが、Messaging APIでは画像や位置情報などのさまざまな種類のメッセージも取り扱えます。送信時の詳細な仕様に関してはドキュメント を参照してください。
メディアファイルの送受信
botから画像や動画などのメディアファイルを送信するためには、インターネット上からHTTPSでアクセス可能なWebサーバ上にメディアファイルをアップロードしておく必要があります。
リスト2 はアップロードしたメディアファイルをMessaging APIでユーザーに送信するサンプルです。( 2)で紹介したとおり、複数のファイルをメソッドチェインで送信しています。画像と動画ファイルに関しては、(1) や(3) でトークリスト上に表示するためのサムネイル画像を指定しています。このpreview_url
は動画中から生成したサムネイル画像以外も指定できますが、このメッセージを受信するユーザーが混乱しないように動画中から生成したサムネイル画像を使用することをお勧めします。音声ファイルに関しては(2) で音声の再生時間をミリ秒で指定しています。Perlでは数値リテラルの中に出現する_(アンダースコア)を無視して解釈をする仕様があり、(2) では361,000ミリ秒(=361秒)を表しています。
リスト2 メディアファイルの送信
my $messages = LINE::Bot::API::Builder::SendMessage->new(
)->add_image(
image_url => 'https://example.com/file.jpg',
preview_url => 'https://example.com/thumbnail.jpg',
)->add_audio(
audio_url => 'https://example.com/file.m4a',
duration => 361_000,
)->add_image(
video_url => 'https://example.com/video.mp4',
preview_url => 'https://example.com/thumbnail.jpg',
);
LINEサーバからダウンロードする
ユーザーから画像、音声、動画ファイルを送信されたときには、一時的にLINEサーバ上にメディアファイルが保存されます。botがこれらのメッセージを受け取ったときには、LINEサーバからファイルを速やかに取得して処理を行う必要があります。
リスト3 は、メディアファイルを受信したときにローカルへファイルをダウンロードするコードです。(1) ではイベントオブジェクトから受信したメッセージのIDを取得して、それをget_message_content
メソッドを利用してLINEサーバからダウンロードします。(2) では実際にダウンロードされたファイル名を用いてファイルハンドルを開いています。
リスト3 メディアファイルの受信
if ($event->is_image_message || $event->is_audio_message
|| $event->is_video_message) {
my $ret = $bot->get_message_content(
$event->message_id);
if ($ret->is_success) {
my $filename = $ret->fh->filename;
open my $fh, '<', $file or die "$!: $file";
... # ファイル処理
}
}
スタンプの送受信
リスト4 はスタンプの送受信を行うコードです。ただし、送信可能なスタンプはドキュメントに記載されているものだけです。受信は(1) のようにすべてのスタンプで行えますが、ドキュメントに記載されたスタンプ以外のpackage_id
とsticker_id
は非公開となっているため、特定の有料スタンプに反応するbotを作成したい場合は、そのスタンプを入手して各種IDを調べる必要があります。
リスト4 スタンプの送受信
# 受信時
if ($event->is_sticker_message) {
say $event->package_id;
say $event->sticker_id;
}
# 送信時
my $messages = LINE::Bot::API::Builder::SendMessage->new(
)->add_sticker(
package_id => '1',
sticker_id => '2',
);
位置情報の送受信
リスト5 は緯度経度情報の送受信のコードです。たとえば(1) の内容を送信すると、図1 に示したメッセージが届きます。ユーザーはLINE上から手軽に位置情報の送信が可能で、位置情報を受信したときも地図で簡単に確認できるので、位置情報を取り扱うコンテンツのbotでは対応したいメッセージタイプです。
リスト5 位置情報の送受信
# 受信時
if ($event->is_location_message) {
say $event->title;
say $event->address;
say $event->latitude;
say $event->longitude;
}
# 送信時
my $messages = LINE::Bot::API::Builder::SendMessage->new(
)->add_location(
title => 'LINE Corporation.',
address => 'Hikarie Shibuya-ku Tokyo 151-0002',
latitude => 35.6591,
longitude => 139.7040,
);
図1 位置情報メッセージ
Template messageでリッチな操作体験を提供
ボタンや画像の配置などが定義されたデザインテンプレートを利用して、そこに任意の情報を詰め込んで送信できるTemplate messageというメッセージタイプがあります。ユーザーは、botから送信されたメッセージ中のボタンをタップするだけでbotとの対話を行えるので、使い勝手の良いbotを提供するためには利用したいメッセージタイプです。公式SDKでは、LINE::Bot::API::Builder::TemplateMessageを用いることで簡単にTemplate messageを送信できます。
Buttonsタイプで画像とボタンを組み合わせたUIを作る
図2 のButtonsタイプでは、画像、タイトル、テキストを1つずつと、複数のボタンを送信できます。図2では「Open Browser」と「Remind me」と記された箇所がボタンになっています。リスト6 はButtonsタイプのメッセージを構築するコードになっており、(1) のalt_messageに
はTemplate message非対応端末で表示されるテキストを設定します。(2) のadd_message_action
メソッドはユーザーがボタンを押したときにtext
の内容を自動的にチャットメッセージとしてユーザーが発言するボタンを表示します。(3) のadd_uri_action
メソッドはurl
で指定したURLをブラウザで開くボタンを表示します。なお、LINE::Bot::API::Builder::TemplateMessageで作成したオブジェクトは$bot->reply_message
などで直接送信ができないので、必ず(4) のとおりにLINE::Bot::API::Builder::SendMessageを使って送信オブジェクトを構築する必要があります。
図2 Buttonsタイプ
リスト6 Buttonsタイプのメッセージ構築
my $buttons = LINE::Bot::API::Builder::TemplateMessage
->new_buttons(
alt_text => 'this is a buttons template',
image_url => 'https://example.com/bot/image.jpg',
title => 'buttons',
text => 'description',
)->add_message_action(
label => 'message',
text => 'message',
)->add_uri_action(
label => 'uri',
uri => 'http://example.com/',
);
my $messages = LINE::Bot::API::Builder::SendMessage
->new()
->add_template($buttons->build);
$bot->reply_message($reply_token, $messages->build);
Carouselタイプを使って複数個のテンプレートを横に並べる
図3 のCarouselタイプは、基本的にはButtonsタイプのUI(User Interface )を横に複数個並べたテンプレートになっています。リスト7 の(1) のnew_carousel
メソッドでCarouselのビルダオブジェクトを作成し、LINE::Bot::API::Builder::TemplateMessage::Columnで作成したCarouselタイプのオブジェクトを(2) のadd_column
メソッドで登録していきます。
図3 Carouselタイプ
リスト7 Carouselタイプのメッセージ構築
my $carousel = LINE::Bot::API::Builder::TemplateMessage
->new_carousel(
alt_text => 'this is a carousel template',
);
for my $i (1..5) {
my $col = LINE::Bot::API::Builder::TemplateMessage::Column
->new(
image_url => 'https://example.com/bot/item.jpg',
title => "carousel $i",
text => "description $i",
)->add_message_action(
label => 'message',
text => 'message',
);
$carousel->add_column($col->build);
}
Confirmタイプで選択式の確認ダイアログを提供する
図4 のConfirmタイプは、一般的に普及しているOK/Cancelを聞くConfirmダイアログの見た目のUIを提供します。リスト8 で示すとおり、ほかのTemplate messageのタイプと同じ形でオブジェクトが構築できます。
図3 Confirmタイプ
リスト8 Confirmタイプのメッセージ構築
my $confirm = LINE::Bot::API::Builder::TemplateMessage
->new_confirm(
alt_text => 'this is a confirm template',
text => 'confirm',
)->add_postback_action(
label => 'postback',
data => 'postback data',
)->add_message_action(
label => 'message',
text => 'message',
);
Postbackを使ってチャットのログを汚さずにbotにメッセージを送る
リスト8では、ほかの2個のTemplate messageとは違い(1) にadd_postback_action
メソッドを使いました。これはadd_message_action
と似た機能を提供するのですが、add_message_action
とは違いチャットメッセージに発言のログを残さずにWebhook URLにイベントを通知できるボタンを表示します。このボタンをユーザーが押したときに、裏側でPostback eventがWebhook URLに送信します。このときdataをイベントオブジェクトに含めており、Postback eventの内容は次に示したコードで利用できます。
if ($event->is_postback_event) {
say $event->postback_data;
}
そのほかのお勧め機能
本節では、前節までで紹介しきれなかったお勧めのAPIを紹介します。
LINE Beaconによる現実世界との連携
Messaging APIには、LINE Beacon と呼ばれる専用のビーコンデバイスを用いることで、ビーコンの電波を受信したタイミングでBeacon eventをWebhook URLへ送信するしくみがあります。これを利用することで、ユーザーの現実世界での行動をイベントトリガとしたLINE BOTを開発できます。
LINE Simple Beacon Spec を実装することにより、Raspberry Pi 3などで手軽にビーコンが作成できます。将来的にはハードウェアで計測した数値などをDevice MessageとしてWebhook URLに送信できる予定[7] ですので、リアル世界と密接に連携したbotを簡単に作成できます。
Social REST APIを使ったWebサイト連携
Social REST API を利用することで、みなさんのWebサイトに図5 に示したLINEログイン機能を追加できます。ログイン後にはPush Messageで利用可能なuserIdも取得できるので、通常はbotとの会話でサービスを提供しつつ、チャットのUIに適さない複雑な設定画面はWebサイトで提供するハイブリッドなbotが作成できます。
図5 LINEログイン
LINE Notifyで簡単な通知の送信
LINE Notify とは、GitHubやMackerelなどのWebサービス上で発生したイベントをLINEに送信するサービスです。このサービスにログインしてパーソナルアクセストークンを取得すると、LINE上の自分のアカウントやグループ宛に好きな通知を送信できます。気軽にcurlなどのコマンドから送信することを考慮して作られており、たとえば次に示したコマンドで簡単にLINE宛へ通知できます。
Furl->new->post(
'https://notify-api.line.me/api/notify',
[ 'Authorization' => "Bearer $TOKEN" ],
[ 'message' => 'こんにちは!' ]
);
すべてのLINE連携をMessaging APIで作ろうとすると開発コストが増大するので、手を抜ける場合にはLINE Notifyを利用して気軽にLINEに通知をするとよいでしょう。
まとめ
本稿では、LINE Messaging APIの公式SDKを利用したLINE BOTを開発する方法について紹介しました。一度環境を整えてしまえば、LINEで動作するbotが簡単に開発できることが伝わりましたら幸いです。
さて、次回の執筆者はふしはらかんさんで、テーマは「Perlで書くコマンドラインツール」です。お楽しみに。
特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT