これまで、LINE Messaging APIで組んだBOTをグループやトークルームに参加させた場合、すべてのユーザの発言はそのグループもしくはルームが発言元となり、実際に誰の発言であるかを知ることはできませんでした。
5/31にリリースされた新機能でこの制約が解消され、グループ/ルームにおいても(groupId/roomIdとは別に)発言者のユーザID(userId)を取得することができるようになりました。
ただし、以下の制約があります。
これらを満たしていれば、コールバックで受け取ったjsonのsource
下にuserId
が格納されます(Golang SDKの場合、eventのSource.UserID
で取得できます)。
満たしていなければ、従来通りuserId
は入ってきません。
Official Accounts Terms of Useへの同意
Official Accounts Terms of Useへの同意は、以下のような契機で表示される認証画面から行ないます。
これは、必ずしもBOT個々に行なう必要はなく、例えば、謎の女子高生AI「りんな」に対して同意済みのユーザであれば、自作のBOTでもユーザIDを取得することができます。
この画面下にある「同意する」をタップすると、同意が完了します。
正直なところ、一般の人向けのグループに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月に追加されています。こちらのエントリを参考にしてください。
多人数のグループなど、BOTとの友だち登録を徹底するのが難しい場合、あらかじめ(もしくは404を受けて)LINE Loginに誘導してログインさせてプロファイルを取得しDBに保持、BOT側ではWebhookで受け取ったユーザIDで突合*3して使うほうが運用負担は低いように思います。
※このセクションは、『LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例』の著者、立花さんとのやり取りで発覚し、調査・追記しました。

LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例
- 作者: 立花翔
- 出版社/メーカー: 翔泳社
- 発売日: 2017/05/12
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る