見出し画像

python:LINE Botを作ってみよう(MessengerAPIの練習)

LINEのAPI MessengerAPIを使って、オウム返しBotを作成して、練習しましみましょう。

画像1


おおまかな流れは以下となります。


①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の完成です。


参考記事


過去記事





いいなと思ったら応援しよう!