Python Code Notes

Information by python engineer

簡単!Python & HerokuでLINEボットWebアプリを作ろう③ スクリプトファイルの準備、設定、デプロイ

前回まででLINE、Herokuの基礎設定が完了しました。

今回はようやくLINEボットに直接関係する設定をします。少し長くて面倒ですが頑張りましょう。

  • 前回

目次

モジュールのインストール

①フォルダの作成

まずはアプリ用のフォルダを作成します。この中にアプリ用の各ファイルを保管していきます。今回は「oumugaeshi」とします。

②モジュールのインストール

ターミナルでアプリ用フォルダに移動後、必要になるモジュールをインストールしていきます。インストールするモジュールは、「Flask」と「line-bot-sdk」の二つです。

通常通り、pipコマンドでインストールしてもよいですが、仮想環境pipenvでのインストールがおすすめです。 pipenvでインストールすることにより、「requirement.txt」の代わりとなる「Pipfile」が自動で作成されます。 「requirement.txt」を作成する手間が省け、かつ余計なモジュールが混ざって不具合の原因となるのを防げます。

以下のコマンドを実行し、「flask」と「line-bot-sdk」をインストールしていきましょう。

pipenv install flask

pipenv install line-bot-sdk

仮想環境が構築され、フォルダ内に「Pipfile」と「Pipfile.lock」が生成されます。

スクリプトファイルの準備

echoボットのサンプルスクリプトを、以下のアドレスにアクセスして入手します。

サンプルコード

コードをコピーし、テキストエディタに貼り付けてアプリ用フォルダ内に保存します。ファイル名は何でもよいですが、今回は「app.py」としました。

Herokuで動かすには、コードのif __name__ == "__main__":内を以下の通りに修正する必要があります。

  • before
if __name__ == "__main__":
    arg_parser = ArgumentParser(
        usage='Usage: python ' + __file__ + ' [--port <port>] [--help]'
    )
    arg_parser.add_argument('-p', '--port', type=int, default=8000, help='port')
    arg_parser.add_argument('-d', '--debug', default=False, help='debug')
    options = arg_parser.parse_args()
    app.run(debug=options.debug, port=options.port)
  • after
if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

以上でスクリプトファイルの準備は完了です。

Herokuの環境変数設定

Herokuサーバーにラインのチャネルシークレットとアクセストークン(ロングターム)を環境変数に設定します。両方とも、LINE Developersのページ内のチャネルの基本設定で確認できます。

まず、ターミナルから、以下のコマンドを実行してチャネルシークレットを環境変数に設定します。

heroku config:set LINE_CHANNEL_SECRET="チャネルシークレット" --app アプリ名

次にアクセストークンです。

heroku config:set LINE_CHANNEL_ACCESS_TOKEN="アクセストークン(ロングターム)" --app アプリ名

今回の例ではアプリ名は「lineoumugaeshi」です。また、チャネルシークレットとアクセストークンはダブルクオーテーション「"」で囲うのを忘れないでください。

以上の作業でサーバー上に環境変数が設定され、先ほど作成したapp.py実行時に読み込まれます。

読み込みを実行しているのは、app.pyの以下の箇所ですね。

channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)

環境変数設定時の文字列が少しでも間違っていると動きませんので、スペルミスには十分に注意してください。

上記の通り、環境変数名は「LINE_CHANNEL_SECRET」と「LINE_CHANNEL_ACCESS_TOKEN」ですが、以前は「YOUR_CHANNEL_SECRET」と「YOUR_CHANNEL_ACCESS_TOKEN」だったようです。いくつかのサイトでは、以前の環境変数名で設定方法の説明をしているところがあるので注意してください。ここで結構ハマりました。

Procfileの準備

アプリ用フォルダ内にProcfileという名前のファイルを作成します。拡張子は無しです。Windowsなら、ターミナルからcopy nul Procfileで生成できます。

Procfileをテキストエディタで開き、以下の一文だけ入力し、保存します。

web: python app.py

これで、Herokuサーバーがpythonを使って「app.py」を実行してくれるようになります。

gitコミット、デプロイ

まずは、以下のコマンドを実行し、Herokuをリモートリポジトリに設定します。

heroku git:remote --app アプリ名

次に、gitでコミットし、Herokuにデプロイします。 以下の順番でコマンドを実行していきます。

git init

git add -A

git commit -m "initial commit"

git push heroku master

Webhookの設定

最後に、Line Developers上からチャネルの設定画面を開き、チャネル基本設定から「Webhook送信」と「Webhook URL」を設定していきます。

  • Webhook送信

編集を押し、「利用する」を選択後、更新します。

  • Webhook URL

編集を押し、「https://アプリ名.herokuapp.com/callback」を入力し、更新します。接続確認ボタンがありますが、しなくて問題ないです。

以上で設定は完了です。Line Developersのチャネル基本設定内にQRコードを用いて、作成したボットを友達登録して話しかけてみましょう。

送信した文字がオウム返しされれば成功です。

今回作成したボットのQRコードを載せておきます。予告なく停止することがあります。

f:id:vigilantPotato:20190221215845p:plain

動かなかったら…

  • Herokuのログを確認

ターミナルからheroku logs --tail --app アプリ名と入力すると、サーバーのログを確認できます。ログの内容からある程度不具合の内容を確認できます。環境変数の設定にミスがある場合は警告が出ているはずです。

  • Webhook送信の再設定

サーバー側に問題がなければ、「Webhook送信」の設定をやり直すと、うまくいくことがあります。 編集を押し、「利用する」を選択、更新しなおしてみてください。