LINEのChatbotを作ってみる(Python+Herokuバージョン)
LINEのDeveloper登録からチャネル作成までは前回記事と同様。
また、Herokuの登録、CLIのインストールも同様に行っておく。
今回はHeroku CLIを使って操作する。
まずheroku loginでHerokuにログインする。
次に、以下のコマンドでアプリケーションを登録する。
heroku create linebot
このコマンドで、自動的にリモートリポジトリとして、git...を登録してくれる。
次に、環境変数の設定をする。Messaging APIへのアクセスに必要なChannel secretと、Channnel access tokenを設定。
heroku config:set LINE_CHANNEL_ACCESS_TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXX" --app linebot
heroku config:set LINE_CHANNEL_SECRET="XXXXXXXXXXXXXXXXXXXXX" --app linebot
続いてローカルでファイル作成に入る。
まずはpythonの仮想環境の作成。前回はあまりまとめていなかったので。
自分の環境ではAnacondaをインストールしているため、python関係の設定はAnaconda promptで実施する。Anaconda promptを開き、
conda create -n myenv (myenvは適当な名前)
proceed[y/x] はyを選択。
activate myenv
で仮想環境を有効にする。なお、
conda info -e
で現在ある仮想環境のリストが表示される。
この仮想環境下で、
pip install flask
でインストール。
つづいて、Windowsのエクスプローラー上で、以下のディレクトリ構造を作成。
linebot
|---Procfile
|---main.py
|---runtime.txt
|---requirements.txt
それぞれのファイルの内容は、
Procfile
web: python main.py
プログラムの実行方法を定義する設定ファイル。この作り方を間違えてハマった。スペースの有り無しに注意。また、ファイル名に拡張子が無いことにも注意。
runtime.txt
python-3.7.0
プログラムを作成したPythonのバージョンを入れること。
requirements.txt
Flask==1.0.2
line-bot-sdk==1.8.0
インストールするライブラリを記載する。
main.py(メインのプログラム)
# インポートするライブラリ
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
FollowEvent, MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage, TemplateSendMessage, ButtonsTemplate, PostbackTemplateAction, MessageTemplateAction, URITemplateAction
)
import os
# 軽量なウェブアプリケーションフレームワーク:Flask
app = Flask(__name__)
#環境変数からLINE Access Tokenを設定
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
#環境変数からLINE Channel Secretを設定
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():
# 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'
# MessageEvent
@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__":
port = int(os.getenv("PORT"))
app.run(host="0.0.0.0", port=port)
このプログラムたちをHerokuにデプロイする。
コマンドは、
git init
heroku git:remote -a linebot
git add .
git commit -m "new commit" (""内にコメント)
git push heroku master
あとはHerokuでWebhookの設定。
WebhookのURLに、
https://<アプリケーション名>.herokuapp.com/callback
を入れて、Webhook通信を有効にする。
callbackを入れるのを忘れずに。
これで完成!なはず。