Edited at

Python + HerokuでLINE BOTを作ってみた

勉強のためにオウム返しbotを作ってみました。


まずはLine developersに登録する。

https://developers.line.biz/ja/services/messaging-api/

アプリ名 →任意のアプリ名

アプリ説明 →説明文

プラン →Developer Trial

大業種 →個人

小業種 →個人(その他)

メールアドレス →自分のメールアドレス

利用規約に同意して作成。

チャネル基本設定->メッセージ送受信設定のアクセストークンの再発行ボタンを押下。

Bot情報のLINEアプリへのQRコードで友達登録しておく。


Flaskとline-bot-sdkをインストール

$ pip3 install flask

$ pip3 install line-bot-sdk

https://github.com/line/line-bot-sdk-python

にオウム返ししてくれるBotのサンプルがあるのですが、

これをそのまま使うと上手く行かないので、

こちらのサイト様からmain.pyを参考にさせて頂きました。

main.py

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,
)

app = Flask(__name__)

#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

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

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

@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(ヘロク)に登録する。

HerokuはPaas(パース)とよばれる、アプリケーションを実行するためのプラットフォームで、

アプリケーションを作成して簡単に動かすことが出来きます。

Herokuコマンドラインインタフェース(CLI)をインストールします。CLIを使用して、アプリケーションの管理と拡張、アドオンのプロビジョニング、アプリケーションログの表示、およびアプリケーションのローカルでの実行を行います。

プラットフォーム用のインストーラをダウンロードして実行します。

$ heroku login


heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/browser/XXXX
Logging in... done
Logged in as XXXX@XXXX


アプリケーションの登録

$ heroku create {自分のアプリケーション名}

Creating ● XXXX... done

https://XXXX.herokuapp.com/ | https://git.heroku.com/XXXX.git


環境変数の設定

$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの文字列" --app {自分のアプリケーション名}

$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの文字列" --app {自分のアプリケーション名}


設定の確認

$ heroku config --app {自分のアプリケーション名}


Webhookの設定

管理画面からWebhookの設定をします。

Webhook送信:利用する

Webhook URL:https://<自分のアプリケーション名>.herokuapp.com/callback

接続確認が表示されれば完了です。

PythonとFlaskのバージョンを調べる

$ flask --version


設定ファイルの作成とデプロイ

同じディレクトリに作成

main.py →ソースコード

runtime.txt →Pythonのバージョンを記載

requirements.txt →インストールするライブラリの記載

Procfile →プログラムの実行方法を定義


runtime.txt

python-3.7.0



requirements.txt

Flask==1.0.2

line-bot-sdk==1.8.0

Procfile

web: python main.py


変更した内容を反映する

$ git add .

$ git commit -am "make it better"
$ git push heroku master


上手くデプロイ出来たか確認する

$ heroku open

Hello Worldが表示されたら正常にデプロイされています。


ログ確認

heroku logs --tail


詰まったところ

Procfileを作成した際に他二つが.txtだったので、

間違えて.txtで作成してしまっていました。

名前を付ける時にダブルクォートで囲んで保存します。

Webhook URLの設定で接続確認をしたところエラーが出ていました。

Webhookが無効なHTTPステータスコードを返しました(期待されるステータスコードは200です)

原因は分からなかったのですが、

オウム返しは上手く行っていました。


ちなみに...

ログの、

WARNING: Do not use the development server in a production environment.

この部分で注意されていますが、今回は試すだけなので無視して大丈夫です。

公開するときはちゃんとサーバーを立てろということですね。


参考

https://jp.fujitsu.com/solutions/cloud/k5/playground/webhandson/preparation/06.html

https://qiita.com/akiko-pusu/items/dec93cca4855e811ba6c

https://qiita.com/tomboyboy/items/122dfdb41188176e45b5

https://uepon.hatenadiary.com/entry/2018/07/27/002843