先日開催されたLINE DEVELOPER DAY 2016で発表された*1、BOT APIに替わるMessaging APIを試してみました。
まず、先日作成した「調整さんリマインダBOT」をMessaging APIに移行。ついでに、新機能であるTemplate Messageと、グループやトークルームにBOTを参加させたときの振る舞いを確認します。
Messaging APIへの移行
BOT用アカウントの作成
BOT API Trialのアカウントは利用できないので、新規にビジネスアカウントを開設します。手順は以下の通り。
- LINE Business Center -> アカウントリスト -> ビジネスアカウントを作成する
- 作成したアカウントの LINE@ MANAGER -> アカウント設定 -> Bot設定
- “APIを利用する”を選択(この時点でアカウントは、LINE@アプリ、1:1トーク、お店トークが利用できなくなります)
- 必要に応じてBotの設定を行なう
- Webhook送信(デフォルトは"利用しない”)
- グループトーク参加(デフォルトは"利用しない”)
- 自動応答メッセージ(管理画面で設定。デフォルトは”利用する”)
- 友だち追加時あいさつ(同上)
自動応答メッセージおよび友だち追加時あいさつは"利用する"であっても、ちゃんとWebhookが飛びます。メッセージの内容は「メッセージ」から変更できます。
その他、LINE@ MANAGERでBOTのアカウントページなども設定できます。
App Engineアプリケーションの作成
App Engineアプリケーションは(version指定するなどして)使いまわしても良かったのですが、今回は新規に作成しました。
先の記事と同様にWebhook URL
を設定し、Channel Secret
とChannel Access Token
*2の取得を行ないます。Channel ID
およびChannel MID
は不要になりました。
BOT SDKの更新
Golang用のSDKもアップデートされているので、下記コマンドで更新しておきます。
$ goapp get -u github.com/line/line-bot-sdk-go/linebot
BOT本体の変更
主な変更点は以下の通り。
- LINE BOTの初期化において、Channel IDおよびMIDが不要になったので削除
- 代わりにACCESS_TOKENが必要になったので追加
linebot.OpType
がなくなったので、string
に変更- OpTypeの判定は全て
linebot.EventType
に変更。ここの判定はかなりスッキリした - APIの変更に対応
- テストの修正
- X-Line-Signatureヘッダキーの変更(もとはX-LINE-ChannelSignature)
- 友だち追加テストデータ(json)のフォーマット変更
以上でテストを通し、goapp deploy
して動作確認を行ないました。詳細・差分はGitHubに置いてあるソースを見てください。
なお、旧BOT APIで取得できていたユーザの識別子であるMID
は、Messaging APIで取得できるUserID
とは異なります。
先頭文字はユーザはU
、グループはC
、トークルームはR
。+英数32文字(16進数?)という書式になっていました。
Template Message
新機能のTemplate Messageは、トーク上に複数のボタンなどで構成されるテンプレートを表示し、ユーザの応答を得るための仕組みです。Buttons
, Confirm
, Carousel
の3種類を利用できます。
現時点でいくつか制約があるようです。気づいたものが以下。
iOS版のLINEアプリ(バージョン 6.6.2)では、Template Messageは「LINEアプリのバージョンが古いため(ry」と表示され、利用できません- バージョン 6.7.0で対応されました
- Android版のLINEアプリ(バージョン 6.7.0)では利用できました
- バージョン 6.5.1では「ご利用のバージョンでは対応していないか不正なURLです」と表示され、利用できませんでした
Buttons
およびCarousel
において、APIリファレンスにはthumbnailImageUrl
が省略可能と書かれていますが、省略するとエラー*3が返ります*4- SDKの問題だったようで、修正されました
title
の省略は可能でした
- [11/2追記]Template Messageに設定する
altText
は「非対応端末で表示される代替テキスト」と説明されていますが、Notificationおよびトーク一覧画面での表示にも使われています(クライアントバージョン 6.8.0時点)
グループおよびトークルーム
従来のBOTはユーザと1:1のトークしかできませんでしたが、Messaging APIでは、グループおよびトークルームへの招待が可能となりました。
こちらも現時点でいくつか制約があるようです。気づいたものが以下。
- グループに複数のBOTを招待できない。2つ目以降のBOTは「招待中」のまま保留され、Webhookの
join
も飛ばない - トークルームは、招待したタイミングでは
join
は飛ばない。招待後、最初のメッセージがWebhookで送られる直前にjoin
が投げられる - トークルームにも複数のBOTを招待できない。2つ目のBOTを招待すると、即退出される(元々いたBOTが退出するケース、2つ目が退出するケースの両方を観測)
- トークルームのメンバーはキックできない仕様なので、BOTは自ら
Leave
APIで退出しない限りルームに一人取り残される。ルームの参加人数を知ることもできないので、取り残されたら抜ける手段はなさそう - グループおよびルームからのWebhookでは、そのメッセージがどのユーザの発言かを知ることはできない(送信元は
GroupId
およびRoomId
となる)。Template MessageからのPostback Eventも同様。- [2017/6/25追記]その後の仕様変更で取得できるようになりました。詳細はこちらの記事を参照してください→ LINE Messaging APIでグループ内の発言ユーザIDが取得できるようになった件 #linebot - やらなイカ?
- ユーザと1:1のトークでは、ユーザの表示名などは
Get Profile
APIで取得できるが、グループおよびトークルームのメッセージ送信元(GroupId
およびRoomId
)の情報を得ることはできない - BOTの送信したメッセージは、BOTには送信されることはない(オウム返しするBOTで、無限ループを気にする必要はない)
- [10/30追記]すでにBOTがグループに所属している状態で他のユーザを招待すると、再びWebhookで
join
イベントが送信される。タイミングは「参加」時ではなく「招待」時点。意図がわからない。