やらなイカ?

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

LINE Messaging APIでグループ内の発言ユーザIDが取得できるようになった件 #linebot

これまで、LINE Messaging APIで組んだBOTをグループやトークルームに参加させた場合、すべてのユーザの発言はそのグループもしくはルームが発言元となり、実際に誰の発言であるかを知ることはできませんでした。

5/31にリリースされた新機能でこの制約が解消され、グループ/ルームにおいても(groupId/roomIdとは別に)発言者のユーザID(userId)を取得することができるようになりました。

ただし、以下の制約があります。

  • 発言ユーザのクライアントのバージョンが、iOS/Androidとも、7.5.0以降であること
  • 発言ユーザが“Official Accounts Terms of Use”に同意していること

これらを満たしていれば、コールバックで受け取ったjsonsource下にuserIdが格納されます(Golang SDKの場合、eventのSource.UserIDで取得できます)。

満たしていなければ、従来通りuserIdは入ってきません。

Official Accounts Terms of Useへの同意

Official Accounts Terms of Useへの同意は、以下のような契機で表示される認証画面から行ないます。

  • 新たにBOTを友だち登録する
  • すでに友だち登録しているBOTトーク画面(グループやルームではなく、1:1のトーク)を開く

これは、必ずしもBOT個々に行なう必要はなく、例えば、謎の女子高生AI「りんな」に対して同意済みのユーザであれば、自作のBOTでもユーザIDを取得することができます。

f:id:nowsprinting:20170613045546j:plain

この画面下にある「同意する」をタップすると、同意が完了します。

正直なところ、一般の人向けのグループにBOTを混ぜて運用している場合、この手順を全員にアナウンスし実行させたり、ユーザIDが取得できないケースをBOT側で考慮する必要があるというのは少々ハードル高いですが、時間が解決してくれることに期待しましょう。

プロファイル取得の制限 [6/24追記]

上記の手続きでユーザIDは取得できますが、ユーザプロファイル(表示名、画像、ステータスメッセージ)の取得にはさらに制限があります。

ユーザプロファイルはhttps://api.line.me/v2/bot/profile/{userId}で取得しますが、これにBOTと一度も友だち登録されていないユーザのIDを指定した場合、404エラー(Golang SDKの場合linebot: APIError 404 Not found)が返ります。

"一度も友だち登録されていない"と書きましたが、一度でも当該BOTと友だち登録を行なえば、その後ブロックされても取得できるようです*1*2

[10/1追記] グループ/ルームメンバーのプロファイル取得のためのAPIが7月に追加されています。こちらのエントリを参考にしてください。

nowsprinting.hatenablog.com

多人数のグループなど、BOTとの友だち登録を徹底するのが難しい場合、あらかじめ(もしくは404を受けて)LINE Loginに誘導してログインさせてプロファイルを取得しDBに保持、BOT側ではWebhookで受け取ったユーザIDで突合*3して使うほうが運用負担は低いように思います。

※このセクションは、『LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例』の著者、立花さんとのやり取りで発覚し、調査・追記しました。

LINE BOTを作ろう!  Messaging APIを使ったチャットボットの基礎と利用例

LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例

参考

*1:ただしこの振る舞いはドキュメントに明記されているものではなく、今後アナウンスなく変更される恐れはあります。そもそも「友だち登録していなければ404」という振る舞いもどこにも書かれていないのですが。

*2:10/1時点ではこの振る舞いは変更されており、友だち登録した後ブロックした場合にも404が返されるようになりました

*3:LINE LoginとMessaging APIで受け取れるUserIdは同じユーザで同一のものが得られます