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

pip install line-bot-sdk

でインストール。

 

つづいて、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を入れるのを忘れずに。

 

これで完成!なはず。