LINEは、日本でもっとも日常的に使われるアプリの一つであることは間違いないでしょう。このLINEのプラットフォームをうまく使いこなせれば、自分が作りたいサービスや発信したい情報を広めることができるでしょう。
そこで今回は、「LINE Bot API」を使って、LINEのユーザー情報を取得してみました。
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
に定義されています。
このメソッドの中を少し観察してみましょう。
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と足されて、リクエストが送られていることがわかります。
class LineBotApi(object):
DEFAULT_API_ENDPOINT = 'https://api.line.me'
当たり前の事かもしれませんが、観察するとWeb API設計の勉強になって、楽しめます。
ユーザー情報をトークルームに表示
先程のユーザー情報取得
の内容と合わせて、テンプレートメッセージとして返信する処理まで、実装します。
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の例です。ぜひ、使って遊んでみてくださいヾ(・ω・ ) ナデナテ
(記事なキャプチャと違い「メジロ」というサービス名になっています。)
ぜひ、使ってみて、レビューをください。