LINEチャットボットをFlaskとngrokで

Flaskngrok でメッセージをオウム返しする LINE のチャットボットを作ってみた。
Heroku で公開したい場合は以下参照。

セットアップ

$ pip install Flask gunicorn line-bot-sdk
$ brew cask install ngrok

ソースコード

app.py

from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage

app = Flask(__name__)

line_bot_api = LineBotApi('アクセストークン')
handler = WebhookHandler('Channel Secret')

@app.route("/")
def hello_world():
    return "hello world!"

@app.route("/webhook", methods=['POST'])
def webhook():
    # 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()

Procfile

web: gunicorn -b 0.0.0.0:$PORT app:app --log-file=-

requirements.txt

Flask==0.12.2
gunicorn==19.7.1
line-bot-sdk==1.5.0

runtime.txt

python-3.6.2

起動

ローカルでAP起動

$ FLASK_APP=app.py flask run
 * Serving Flask app "app"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

ngrokで公開

$ ngrok http 5000
ngrok by @inconshreveable                                       (Ctrl+C to quit)

Session Status                online                                            
Version                       2.2.8                                             
Region                        United States (us)                                
Web Interface                 http://127.0.0.1:4040                             
Forwarding                    http://8eeb5441.ngrok.io -> localhost:5000        
Forwarding                    https://8eeb5441.ngrok.io -> localhost:5000       

Connections                   ttl     opn     rt1     rt5     p50     p90       
                              2       0       0.02    0.01    0.01    0.01      

HTTP Requests                                                                   
-------------                                                                   

GET /favicon.ico               404 NOT FOUND                                    
GET /                          200 OK

なお好きなホスト名をつけたい場合は、ngrokの有料サービスを利用する必要がある模様。