他人の 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

以上!