他人の LINE ユーザ情報を curl で取得する
LINE Messaging API を使うと、LINE のユーザ情報が簡単に拾える。自分のユーザ情報が検索に表示されないように設定していても、ユーザ名とプロフィール画像、ステータスメッセージが確認できる。
…とだけ書くとなんだか恐ろしく聞こえるが、ちゃんと条件があって、簡単には盗み見などできないのでご安心を。
今回はこの条件と、その上での取得方法を紹介する。
目次
ユーザ情報を取得できる条件
ユーザ情報を取得するには、自分が作った Messaging API チャネルを、そのユーザが友だち登録していないといけない。自分が友だちに追加していないチャネルが勝手にプロフィールを抜き取る、といったことはできない。
また、ユーザ情報取得 API をコールする際にはその Messaging API チャネルのチャネルアクセストークンが必要になるし、調べたいユーザを指定する userId
はプロバイダごとに異なる文字列が用意される。だから「よそのチャネルで収集した userId
を基に、プロフィール情報を盗んでやろう」といったことはできない。あくまでそのチャネルの管理者だけが、友だちになっている人の情報を簡単に見られるだけである。
チャネルを友だちにしてもらう障壁を乗り越えて、管理者が見られる情報というのも、ユーザ名、プロフィール画像、ステータスメッセージまでだ。それ以上の情報は拾えないので、プロフィールを実名・顔写真アイコンにしていなければ気にならないかと。
とはいえ、ユーザとしては、不用意に Messaging API チャネルを友だち登録しまくらない方が心理的に安心できそう。
ユーザ ID を拾う
ひとまずやり方を説明する。
まずはユーザ情報を拾うためのユーザ ID を調べる必要がある。コレは、チャネルを友だち追加してもらったり、チャネルにメッセージを投稿してもらったりした時に発生する Webhook イベントから取得できるだろう。Webhook イベントのリクエストボディはこんな感じ。
{
"events": [
{
"type": "message",
"replyToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"source": {
"userId": "Uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
"type": "user"
},
"timestamp": 1000000000000,
"message": {
"type": "text",
"id": "9999999999999",
"text": "こんにちは"
}
}
],
"destination": "Uzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
}
この中の events[].source.userId
から拾える Uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
がユーザ ID だ。
curl
でプロフィールを取得する
ユーザ ID が分かったら、curl
で取得してみよう。取得する際は当該チャネルのチャネルアクセストークンが必要になる。
# コマンドを簡潔にするため、チャネルアクセストークン・ユーザ ID を変数定義する
$ channel_access_token='Ssssssssssssssssssssssssssssssssssssssssssssss...'
$ user_id='Uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu'
# curl で GET する
$ curl "https://api.line.me/v2/bot/profile/${user_id}" -H "Authorization: Bearer ${channel_access_token}"
{"userId":"Uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu","displayName":"Neos21","pictureUrl":"https://profile.line-scdn.net/0000000000000000000000000000000000000","statusMessage":"どうも Neo です。"}
こんな風に JSON 文字列が拾えるので、jq
にでもパイプすると読みやすくなるだろう。
$ curl "https://api.line.me/v2/bot/profile/${user_id}" -H "Authorization: Bearer ${channel_access_token}" | jq .
{
"userId": "Uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu",
"displayName": "Neos21",
"pictureUrl": "https://profile.line-scdn.net/0000000000000000000000000000000000000",
"statusMessage": "どうも Neo です。"
}
pictureUrl
はブラウザからアクセスすると普通に画像が拾えてしまう。コレだけはトークン認証などが不要なので、URL さえ割れてしまえば画像が見えてしまう危険性がある。やはりプロフィール画像に顔写真は止めよう。w
以上!