python:LINE Botを作ってみよう(MessengerAPIの練習)
LINEのAPI MessengerAPIを使って、オウム返しBotを作成して、練習しましみましょう。
おおまかな流れは以下となります。
①Line developerに登録
②オウム返しコードの作成
③herokuにデプロイ
①Line developerに登録
Providersを作成します。名前は適当でOK
Create a Messaging API channel を選択し、項目の入力が求められるので進めてください。すると以下の画面になり、QRコードで友達追加をしておいてください。
Webhook URLに下記を入力し、Use webhookもオンにします。
https://tamurasann-app.herokuapp.com/callback
※tamurasann-appの部分は作成するアプリ名です。今回はtamurasann-appという名前であとで作成します。
Channel access tokenのIssueを押して、発行しておき、どこかにメモしておいてください。
Basic Settingにある Channel secretもメモしておいてください。
Line developerの設定は以上となります。これで上記で作成したチャンネルに対して、何かインプットされるとWebhookに登録されているURLが呼び出され、そのURLで処理されるコードが実行されます。
②オウム返しコードの作成
from flask import Flask, request, abort
import os
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, FollowEvent,
ImageMessage, AudioMessage,
)
app = Flask(__name__)
#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
#APIの設定
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)
#テスト用
@app.route("/")
def hello_world():
return "hello world!"
#Webhookからのリクエストをチェック
@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 handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text))
#友達追加時イベント
@handler.add(FollowEvent)
def handle_follow(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text='友達追加ありがとう'))
if __name__ == "__main__":
port = int(os.getenv("PORT"))
app.run(host="0.0.0.0", port=port)
以下のサイトから丸パクリしてます。
用意したWebhookへのアクセスが本当にLINEのサーバーからのアクセスなのか、署名検証
signature = request.headers['X-Line-Signature']
リクエストボディを取得します。
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
ヘッダーやリクエストボディが何かということについては、以下のサイトにわかりやすく記載されているので参照してみてください。
https://wa3.i-3-i.info/word1845.html
検証の上、エラーが出なければ、handleに定義されている関数を呼び出す。エラーの場合は、abort(400)でhttpステータス400のBad Requestを呼び出す
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
オウム返しプログラム
handlerのaddメソッドでリクエストのイベントごとに実行する関数を記述する。TextSendMessage(text)でテキストメッセージを送るが、今回は、text=event.message.textとすることでメッセージが送られたイベントのテキストをそのまま返すようにする。
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text))
友達追加された時のイベント
引数にFollowEventを入れる
@handler.add(FollowEvent)
def handle_follow(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text='友達追加ありがとう'))
画像、音声は入力されると保存する
@handler.add(MessageEvent, message=(ImageMessage, AudioMessage))
def handle_image_audio_message(event):
content = line_bot_api.get_message_content(event.message.id)
with open('filepath', 'w') as f:
for c in content.iter_content():
f.write(c)
③herokuにデプロイ
Herokuにターミナル上でログイン
sudo heroku login --interactive
Herokuにアプリを作成
sudo heroku create tamurasann-app
環境変数の設定
sudo heroku config:set YOUR_CHANNEL_SECRET="自分のトークンを入力" --app tamurasann-app
sudo heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="自分のトークンを入力" --app tamurasann-app
確認
sudo heroku config --app tamurasann-app
デプロイのためのファイル作成
オウム返しプログラムと同じディレクト内に以下の3ファイルを作成する
■runtime.txt
python-3.7.0
■requirements.txt
Flask==1.0.2
line-bot-sdk==1.8.0
■Procfile
web: python repeat.py
この3つのファイルで記載間違いが起きているとデプロイの時に失敗するので注意
デプロイ
git init
sudo heroku git:remote -a tamurasann-app
git add .
git commit -am "my name is tamurasann"
sudo git push heroku master
sudo heroku open
実際に開いて確かめてみるとhello worldと記載されているはずです。これでオウム返しlinebotの完成です。