3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Flask + HerokuでLINE Botを開発 (Gitを使用したデプロイ編)

Last updated at Posted at 2023-06-17

はじめに

  • Flask + Herokuでオウム返しを行う簡単なLINE Botの開発を行う。
  • 本記事では、Gitを使ってアプリケーションをHerokuにデプロイする
  • LINE Developersへの登録や、Herokuへの登録は概要のみ伝える。

環境

  • python 3.9.16
    ※Herokuでサポートされているversionは2023年6/16現在では主に4つあります。
     詳しくは本記事、「LINE Botの実装」の「Pythonランタイムを指定する」という欄で説明しています。
  • Flask 2.2.3
  • line-bot-sdk 2.4.2
  • gunicorn 20.1.0
  • git

開発手順

  1. LINE Developersに登録
  2. Botの実装
  3. Herokuの登録&設定
  4. アプリをHerokuへデプロイ

1. LINE Developersに登録

登録後の流れは以下のようになる。
細かい設定に関しては-- チャネルを作成するを参照すること。

  1. 開発者名を登録
  2. 新規プロバイダーを作成
    ※プロバイダー:LINEプラットフォームを通じてサービスを提供する個人、企業、またはそのほかの組織を意味する情報 -- LINE Developers
  3. チャネル作成 (LINE Messaging APIを選択)
    ※チャネル:チャネルは、LINEプラットフォームが提供する機能を、プロバイダーが開発するサービスで利用するための通信路 -- LINE Developers

2. LINE Botの実装

ディレクトリ構成

最終的なディレクトリ構成は以下のようになる。

sample-app/
 ├ app.py
 ├ Procfile
 ├ requirements.txt
 └ runtime.txt

2-1. コードを準備する

今回は、https://github.com/line/line-bot-sdk-python にあるオウム返しを行うシンプルなLINE Botを使用する。少し変更を加えた以下のコードをコピペすれば上手く動く。

app.py
import os
from flask import Flask, request, abort

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)

2-2. アプリの依存関係をローカルでインストールする

  1. requirements.txtをルートディレクトリに配置する
    • requirements.txt:プロジェクトの依存関係を一覧にしたテキストファイル。このファイルに必要なパッケージとそのバージョンを記述する。
    • アプリをデプロイするとHerokuはこのファイルを読み出し、pip3 install -r コマンドを使用してPythonの依存関係をインストールする。つまり、requirements.txt​によって、自分のアプリがPythonアプリであることをHerokuが認識する
      requirements.txtは以下のようになる。
     Flask==2.2.3
     line-bot-sdk==2.4.2
     gunicorn==20.1.0
    
  2. 依存関係(パッケージ)をローカルにインストール
    $ pip3 install -r requirements.txt
    
    最後にpip3 listでPythonの依存関係がインストールされているか確認する。
    ※Python の依存関係をインストールすると、ほかの依存関係もいくつかインストールされる。

2-3. Procfileを定義する

  • Procfile:このファイルを使って、アプリの起動時に実行するコマンドを明示的に宣言する。
    Procfileは以下のようになる。
web: gunicorn app:app

このコードによって、webプロセスタイプとして、Gunicornを使用してPythonのwebアプリを使用できる。これにより、webサーバーが適切に設定され、アプリケーションがリクエストを受け付ける準備が整う。以下がこのコードの詳細である。

  • "web":Webアプリケーションサーバーを実行するためのプロセスタイプを指定するために一般的に使用される。
  • "gunicorn":Webアプリケーションサーバーとして、gunicornというPythonのパッケージが使用されている。Gunicornは、PythonのWebアプリケーションを高速かつ効率的に実行するためのWSGI(Web Server Gateway Interface)サーバー。
  • "app:app":起動するPythonアプリケーションを指定する。1つ目のappは、Pythonモジュール名またはファイル名で、実際のアプリケーションのコードを含んだPythonファイルを指定する。2つ目のappは、実際に実行されるアプリケーションオブジェクトの名前を指定する。これにより、Gunicornは指定されたPythonアプリケーションを起動し、Webアプリケーションを提供する。

2-4. Pythonランタイムを指定する

  • runtime.txt:Heroku側で使用するPythonのバージョンを指定するファイル
    以下のように記述する。
python-3.9.16

Herokuでサポートされている以下の4つのバージョンであれば、どれでも良い。

python-3.11.2​ (すべてのスタック​で利用可能。推奨​)
python-3.10.10​ (すべてのスタック)​で利用可能)
python-3.9.16​ (すべてのスタック)​で利用可能)
python-3.8.16​ (Heroku-18​ および Heroku-20​ スタックでのみ利用可能)
                              -- Heroku の Python サポート

3. Herokuの登録&設定

3-1. Herokuにアカウントを登録

まずは、Herokuにアカウントを登録してください。
( 注意事項としては2022年11月28日から無料プランの提供を停止したことです。そのため、それ以前のQiitaの記事やブログでは無料プランを利用してデプロイを行っているため、記事の更新日時を確認した方が良いです。しかし! 朗報があります。なんと、学生に対しては毎月13$使えるクレジットを1年間(=合計$156)使わせてくれるのです。あやかりたい学生はこちらの公式サイトから登録できます。 )

3-2. Heroku CLIをインストール

Heroku CLIはコマンドラインからHerokukアプリを作成・管理できるようにしてくれるツールです。
インストール方法は3つほどあります。公式サイトを参照したい方はこちらから。

  1. インストーラーによるインストール
    こちらの公式サイトから自分のOSに合うものをインストールしてください。
  2. tar書庫によるスタンドアローンインストール
    CLI を /usr/local/lib/heroku​ および /usr/local/bin/heroku​ で設定するには、以下のスクリプトを実行する必要がある。このスクリプトでは sudo が必要で、Windows に対応していません。CLIの自動更新を行ってくれます。
$ curl https://cli-assets.heroku.com/install.sh | sh
  1. Ubuntu / Debian apt-get でのインストール
    私はwsl2を利用しており、こちらからインストールしました。自動更新は行われないため、apt-get​ を使用して手動で更新してください。

3-3. Heroku CLIを使用する

まずは、無事にインストールが出来ているか、heroku --versionコマンドで確認してください。
以下のように表示されていれば問題ありません。

$ heroku --version
# heroku/8.1.7 wsl-x64 node-v16.19.0

続いて、heroku loginコマンドを実行して、ログインします。任意のキーを押すとwebブラウザに飛び、ログインが完了します。以下のように表示されていれば問題ありません。

$ heroku login
#heroku: Press any key to open up the browser to login or q to exit
# ›   Warning: If browser does not open, visit
# ›   https://cli-auth.heroku.com/auth/browser/***
#heroku: Waiting for login...
#Logging in... done
#Logged in as me@example.com

4. アプリをHerokuへデプロイ

pwdコマンドを実行し、現在のディレクトリがsample-appであることを確認してから作業を行う。

デプロイとは、つまり、アプリケーションをローカルシステムから Heroku に移動することです。Heroku にはアプリケーションをデプロイできる方法が複数用意されています。-- Herokuの仕組み

4-1. アプリを作成する

今回は“example” という名前の新しいアプリを作成するため、以下のコマンドを実行する。
違うアプリ名で作成したい場合、"example"の部分を変更する(例. heroku create hoge)。
※アプリ名の"example"を省略した場合、ランダムな名前が生成される。

$ heroku create example
# Creating ⬢ example... done
# https://example.herokuapp.com/ | https://git.heroku.com/example.git

この出力は、アプリがhttp://example.herokuapp.comで利用可能になることを示している。2 番目の URL であるhttps://git.heroku.com/example.git​は、リモート Git リポジトリの URL 。デフォルトでは、この URL を指す “heroku” という名前の Git リモートが heroku create​ コマンドによって自動的に追加される。

4-2. 環境変数を設定する

※"example"の部分は必要に応じて、自身のアプリケーション名に変更すること。
 本記事に沿って、"example"という名前で作業を進めている場合はそのままで問題がない

$ heroku config:set YOUR_CHANNEL_SECRET="チャンネルシークレットの文字列" --app example
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの文字列" --app example

最後に、設定に誤りがないかを確認する。

$ heroku config --app example

実は、Herokuに設定した環境変数はapp.pyの以下の部分で読み込んでいる。
確認したい方は、「2. LINE Botの実装」に記述したapp.pyを確認してみてほしい。

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

4-3 .webhookの設定

自分のチャネルの"Messaging API設定"画面から設定する。
MessagingAPI設定画面.png

  • https://example.herokuapp.comの後ろに/callbackを付ける。
  • webhookの利用をオンにすること。
    ※webhook(ウェブフック):Webアプリケーションでイベントが実行された時に、外部サービスにHTTPで通知する仕組み。webアプリケーションやサービスが外部のシステムやサービスと自動的に連携するための仕組みであると言える。linebotはWebhookを使用することで、LINEのチャット画面上で発生するイベントを自動的に監視し、それに応じた処理を自動的に実行することができる。下の図のように、Linebotによって、ユーザーとのコミュニケーションを自動化することができる。
    MessagingAPIの仕組み.png
                                  -- Messaging APIの概要
  1. ユーザからLINE Botにメッセージが送信される
  2. LINE Platform からBotサーバーのwebhook URLにwebhookイベントが送信される
  3. BotサーバーからLINE Platformを通してwebhookイベントに応じた応答(処理)をユーザに返す

4-4. 新しいGitリポジトリを作成する

新規または既存のディレクトリにgitリポジトリを初期化する。

$ cd sample-app/
$ git init
$ heroku git:remote -a example

4-5. アプリをデプロイする

$ git add .
$ git commit -am "first commit"
$ git push heroku master

4-6. デプロイの成功を検証する

$ heroku open

このコマンドでwebサイトを開く事ができる
Hello Worldが表示されたら正常にデプロイされている。

4-7. ログを確認する

$ heroku logs --tail

このコマンドでリアルタイムでログを出力する
heroku logsでもログを出力できる(デフォルトでは最新の100ログ行を出力する)。
ログのストリーム出力を停止するには、Control+C​ を押すr。

その他

Herokuの主要な操作

ログイン

$ heroku login

停止・スタート

# 停止 
$ heroku ps:scale web=0
# 再度スタート
$ heroku ps:scale web=1
#リスタート
$ heroku restart

変更

$ git add . 
$ git commit -am "commit message"
$ git push heroku master

ログ出力

# 通常の確認
$ heroku logs
# リアルタイムで確認
$ heroku logs --tail 

おわりに

 今回、LINE BOt を使った開発を行ったことをきっかけに本記事を作成した。Flask+Herokuの環境でLINE Botを開発する記事には一通り目を通したが、少し情報が古かったり、公式サイトだけでは理解が難しかったため、このように一連の作業をまとめた。ぜひ、Flask+Herokuを使ったLINE Bot開発を行う方には役立ててもらえると嬉しい。また、文章や説明等に不備がございましたら、教えて頂けますと幸いです。

参考記事

3
3
1

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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?