Perl Hackers Hub

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

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

(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',    ―(1)
)->add_audio(
  audio_url => 'https://example.com/file.m4a',
  duration => 361_000,    ―(2)
)->add_image(
  video_url => 'https://example.com/video.mp4',
  preview_url => 'https://example.com/thumbnail.jpg',    ―(3)
);
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);    ―(1)
  if ($ret->is_success) {
    my $filename = $ret->fh->filename;
    open my $fh, '<', $file or die "$!: $file";    ―(2)
    ... # ファイル処理
  }
}

スタンプの送受信

リスト4はスタンプの送受信を行うコードです。ただし,送信可能なスタンプはドキュメントに記載されているものだけです。受信は(1)のようにすべてのスタンプで行えますが,ドキュメントに記載されたスタンプ以外のpackage_idsticker_idは非公開となっているため,特定の有料スタンプに反応するbotを作成したい場合は,そのスタンプを入手して各種IDを調べる必要があります。

リスト4 スタンプの送受信

# 受信時    ―(1)
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;
}
# 送信時    ―(1)
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 位置情報メッセージ

図1 位置情報メッセージ

著者プロフィール

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

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

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

コメント

コメントの記入