LoginSignup
154
131

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-02

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

まずはLine developersに登録する。

アプリ名 →任意のアプリ名
アプリ説明 →説明文
プラン →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://qiita.com/akiko-pusu/items/dec93cca4855e811ba6c
https://qiita.com/tomboyboy/items/122dfdb41188176e45b5
https://uepon.hatenadiary.com/entry/2018/07/27/002843

154
131
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
154
131