Python
linebot

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

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

Photo 2018-12-07 15 40 28.png

LINE Developerの登録などの基本設定は、「LINEの「Messaging API」でテンプレートメッセージを実装してみた」の記事を参考にしてください。

ユーザー情報取得を実装したLINE Botの例です。ぜひ、使って遊んでみてください(ง `ω´)ง
友だち追加

目次

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

対象

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

ユーザー情報を取得

では、早速実装します。

(冒頭にも書きましたが、LINE Developerの初期設定などは、こちらを参照ください。)

ライブラリの準備

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

ユーザー情報取得する

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

取得できる要素

  • 表示名
  • ユーザーID
  • 画像のURL
  • ステータスメッセージ

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

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に定義されています。

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

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と足されて、リクエストが送られていることがわかります。

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

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

ユーザー情報をトークルームに表示

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

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にメッセージを送信して、確認してみてください。

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

おまけ

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

ユーザー情報取得を実装したLINE Botの例です。ぜひ、使って遊んでみてくださいヾ(・ω・ ) ナデナテ

友だち追加

計画・企画を多様な人から意見を聞けるサービス「Renttle」を開発中です。ぜひ、使ってみて、レビューをください。