PythonでLINE Bot APIを使ってLINEユーザー情報を取得する

LINEは、日本でもっとも日常的に使われるアプリの一つであることは間違いないでしょう。このLINEのプラットフォームをうまく使いこなせれば、自分が作りたいサービスや発信したい情報を広めることができるでしょう。

そこで今回は、「LINE Bot API」を使って、LINEのユーザー情報を取得してみました。

LINE Developerの登録などの基本設定は、「[LINEの「Messaging API」でテンプレートメッセージを実装してみた](https://qiita.com/kotamatsuoka/items/c4e651f1cb6c4490f4b8)」の記事を参考にしてください。

実装中のLINE Botです。ぜひ、使って遊んでみてください(ง `ω´)ง 
<a href="https://lin.ee/BbNwMMp"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>
(記事なキャプチャと違い「メジロ」というサービス名になっています。)


## 目次
- ユーザー情報を取得
- get_profileメソッドを観察
- ユーザー情報をトークルームに表示
- おまけ

## 対象
- LINEのMessaging APIを使ってみたい人
- Messaging APIのテンプレートメッセージを実装したい人
- LINEのユーザー情報をLINE Botを通じて取得したい人

## ユーザー情報を取得
では、早速実装します。

(冒頭にも書きましたが、LINE Developerの初期設定などは、[こちら](https://qiita.com/kotamatsuoka/items/c4e651f1cb6c4490f4b8)を参照ください。)

### ライブラリの準備

```
$ pip install flask
$ pip install line-bot-sdk
```

### ユーザー情報取得する
`get_profile`メソッドを使えば、簡単にユーザー情報を取得できます。

### 取得できる要素
- 表示名
- ユーザーID
- 画像のURL
- ステータスメッセージ

(後ほど、返信用のテンプレートともに全体のコードを実装します。)

```python
profile = line_bot_api.get_profile(event.source.user_id)
profile.display_name #-> 表示名
profile.user_id #-> ユーザーID
profile.image_url #-> 画像のURL
profile.status_message #-> ステータスメッセージ
```

## get_profileメソッドを観察
今回、LINEのユーザー情報を取得するために使用している`get_profile`メソッドは`linebot/api.py`に定義されています。

このメソッドの中を少し観察してみましょう。

```python:linebot/api.py
def get_profile(self, user_id, timeout=None):
    response = self._get(
        '/v2/bot/profile/{user_id}'.format(user_id=user_id),
        timeout=timeout
    )

    return Profile.new_from_json_dict(response.json)
```

### 引数
user_idのみ渡せば動いてくれるようです。

### 使用されているWeb API
get_profileメソッドは`LineBotApi`クラスに属しています。
その`LineBotApi`クラスのインスタンスメソッドの`_get()`に`/v2/bot/profile/{user_id}`が渡されています。

`_get()`の中も覗くと、クラスの上部に定義されているendpointと足されて、リクエストが送られていることがわかります。

```python:linebot/api.py
class LineBotApi(object):
    DEFAULT_API_ENDPOINT = 'https://api.line.me'
```

当たり前の事かもしれませんが、観察すると**Web API設計**の勉強になって、楽しめます。

## ユーザー情報をトークルームに表示
先程の`ユーザー情報取得`の内容と合わせて、テンプレートメッセージとして返信する処理まで、実装します。

```python:app.py
import os

from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, MessageAction, TemplateSendMessage,
    ButtonsTemplate)

app = Flask(__name__)

LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)


@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def response_message(event):
    profile = line_bot_api.get_profile(event.source.user_id)

    status_msg = profile.status_message
    if status_msg != "None":
        # LINEに登録されているstatus_messageが空の場合は、"なし"という文字列を代わりの値とする
        status_msg = "なし"

    messages = TemplateSendMessage(alt_text="Buttons template",
                                   template=ButtonsTemplate(
                                       thumbnail_image_url=profile.picture_url,
                                       title=profile.display_name,
                                       text=f"User Id: {profile.user_id[:5]}...\n"
                                            f"Status Message: {status_msg}",
                                       actions=[MessageAction(label="成功", text="次は何を実装しましょうか？")]))

    line_bot_api.reply_message(event.reply_token, messages=messages)


if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)
```

この記述に関してコミットして、プッシュしたら、実際にLINE Botにメッセージを送信して、確認してみてください。

```bash
$ git add .
$ git commit -m "ユーザー情報取得機能を実装"
$ git push heroku master
```

## おまけ
最後までお付き合いいただき、ありがとうございました。
少しでもお役に立てたのであれば、嬉しいです。

実装中のLINE Botの例です。ぜひ、使って遊んでみてくださいヾ(・ω・ ) ﾅﾃﾞﾅﾃ

<a href="https://lin.ee/BbNwMMp"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>
(記事なキャプチャと違い「メジロ」というサービス名になっています。)

ぜひ、使ってみて、レビューをください。