やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

LINEの新しいMessaging APIを試してみた

先日開催されたLINE DEVELOPER DAY 2016で発表された*1BOT APIに替わるMessaging APIを試してみました。

business.line.me

まず、先日作成した「調整さんリマインダBOT」をMessaging APIに移行。ついでに、新機能であるTemplate Messageと、グループやトークルームにBOTを参加させたときの振る舞いを確認します。

nowsprinting.hatenablog.com

Messaging APIへの移行

BOT用アカウントの作成

BOT API Trialのアカウントは利用できないので、新規にビジネスアカウントを開設します。手順は以下の通り。

  1. LINE Business Center -> アカウントリスト -> ビジネスアカウントを作成する
  2. 作成したアカウントの LINE@ MANAGER -> アカウント設定 -> Bot設定
  3. APIを利用する”を選択(この時点でアカウントは、LINE@アプリ、1:1トーク、お店トークが利用できなくなります)
  4. 必要に応じてBotの設定を行なう
    • Webhook送信(デフォルトは"利用しない”)
    • グループトーク参加(デフォルトは"利用しない”)
    • 自動応答メッセージ(管理画面で設定。デフォルトは”利用する”)
    • 友だち追加時あいさつ(同上)

自動応答メッセージおよび友だち追加時あいさつは"利用する"であっても、ちゃんとWebhookが飛びます。メッセージの内容は「メッセージ」から変更できます。

その他、LINE@ MANAGERでBOTのアカウントページなども設定できます。

App Engineアプリケーションの作成

App Engineアプリケーションは(version指定するなどして)使いまわしても良かったのですが、今回は新規に作成しました。

先の記事と同様にWebhook URLを設定し、Channel SecretChannel 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の変更に対応
    • 大きな変更点として、ユーザの発言に応答するReply Messageと、BOTが起点となって発信するPush Messageに二分されました。今回のBOTは仕様上Pushを利用しましたが、通常のBOTではReplyを使っていくことになるでしょう。
  • テストの修正
    • X-Line-Signatureヘッダキーの変更(もとはX-LINE-ChannelSignature)
    • 友だち追加テストデータ(json)のフォーマット変更

以上でテストを通し、goapp deployして動作確認を行ないました。詳細・差分はGitHubに置いてあるソースを見てください。

github.com

なお、旧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
  • [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は自らLeaveAPIで退出しない限りルームに一人取り残される。ルームの参加人数を知ることもできないので、取り残されたら抜ける手段はなさそう
  • グループおよびルームからのWebhookでは、そのメッセージがどのユーザの発言かを知ることはできない(送信元はGroupIdおよびRoomIdとなる)。Template MessageからのPostback Eventも同様。
  • ユーザと1:1のトークでは、ユーザの表示名などはGet ProfileAPIで取得できるが、グループおよびトークルームのメッセージ送信元(GroupIdおよびRoomId)の情報を得ることはできない
  • BOTの送信したメッセージは、BOTには送信されることはない(オウム返しするBOTで、無限ループを気にする必要はない)
  • [10/30追記]すでにBOTがグループに所属している状態で他のユーザを招待すると、再びWebhookでjoinイベントが送信される。タイミングは「参加」時ではなく「招待」時点。意図がわからない。

参考

*1:参加したわけでなく、LINE LIVEで見てました。Beacon欲しかった…

*2:Tokenは、横の[ISSUE]ボタンをクリックすると発行されます

*3:linebot: APIError 400 A message (messages[0]) in the request body is invalid

*4:SDKでなくLINEのバックエンドの仕様のようですが、どこに申告すればいいのでしょうか?