Windows
Heroku
Flask
python3
MessagingAPI

Heroku + Python(Flask)でオウム返しLINE bot

はじめに

LINEのMessaging APIを使ってとあるLINE botを作りたかったので、手始めとしてオウム返しのbotを作ってみました。

環境

  • Heroku
  • Python 3.6.4
  • Flask 0.12.2

前提

手順

Heroku設定ファイルの作成

  • Herokuで実行するコマンドを記述
Procfile
web: python parrot.py
  • 必要なパッケージを記述
requirements.txt
Flask==0.12.2
line-bot-sdk==1.5.0
  • 言語とバージョンを記述
runtime.txt
python-3.6.4

Herokuに環境変数の追加

  • Herokuへのログイン
terminal
$ heroku login
heroku: Enter your login credentials
Email:
Password:
  • アプリケーションの作成
terminal
$ heroku create <app_name>
Creating ⬢ <app_name>... done
https://<app_name>.herokuapp.com/ | https://git.heroku.com/<app_name>
  • 環境変数の追加
terminal
#チャンネル情報のアクセストークンを使用
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="<Access Token>" --app <app_name>

#チャンネル情報のChannel Secretを使用
$ heroku config:set YOUR_CHANNEL_SECRET="<Channel Secret>" --app <app_name>

Webhookの設定

Channel基本設定からWebhookの設定を行います。
webhook.png

オウム返し用のコード作成

line-bot-sdk-pythonの使い方に書かれているコードを使用します。追加したHerokuの環境変数を使用、ポートの指定をしています。

parrot.py
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os

app = Flask(__name__)

#LINE Access Token
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
#LINE Channel Secret
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

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

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

    # handle webhook 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))


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

Herokuへのデプロイ

terminal
#初期化
$ git init

#コミットするファイルの追加
$ git add .

#コミット
$ git commit -m "first commit"

#デプロイ
$ git push heroku master

テスト

ちゃんと返してくれました。

まとめ

とりあえず動くものまでは完成しました。
次回以降で発展させていこうと思います。

参考