【Python】Heroku Schedulerを使ってLINEチャットボットを定期実行する方法

環境情報

  • MacBook Air (11-inch, Early 2015)
  • macOS バージョン 11.6(20G165)
  • Python 3.8.8(64bit版)
  • Heroku
  • LINE Messaging API

エラー発生の経緯

LINEチャットボットを使っている中で、
「定期実行」ができれば、幹事業務などにも役立つのではないかと思い、調べたところ、
Heroku Schedulerという機能があることを知りました。

実施した手順

1. Herokuにスケジューラーを追加

ターミナルで以下を入力しました。

heroku addons:add scheduler:standard

ところが、画面には

There are no add-ons for this app

と表示され、追加できませんでした。

2. Herokuにクレジットカード情報を登録

調べたところ、クレジットカード情報の登録が必要とわかりました。

手順は以下の通りです。

  • Heroku画面右上のアイコンをクリック
  • 「Account settings」を選択
  • 「Manage Account」のページで「Billing」をクリック
  • 「Billing Information」からクレジットカードを登録

これで準備が整いました。

3. アドオンを再インストール

再びターミナルで、今度は次のコマンドを実行しました。

heroku addons:create scheduler:standard --app アプリ名

今度は無事に「Heroku Scheduler Standard」が追加されました。

4. scheduler.pyを作成

次に、定期実行するファイルを作成します。
LINEチャットボットを動かしているapp.pyと同じ階層に、
scheduler.pyという名前で以下のような内容を書きました。

from flask import Flask
import os
from linebot import LineBotApi
from linebot.models import TextSendMessage

app = Flask(__name__)

LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
USER_ID = os.environ["USER_ID"]
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)

def main():
    pushText = TextSendMessage(text="明日、新宿午後7時からです。よろしくお願いします。")
    line_bot_api.push_message(USER_ID, messages=pushText)

if __name__ == "__main__":
    main()

5. デプロイ作業

ターミナルを起動し、以下の手順でデプロイを行いました。

cd プロジェクトフォルダ
ls  # ファイル確認
git init
heroku git:remote -a アプリ名
git remote -v
git add .
git commit -m "コメント"
git push heroku master

すべて正常に完了しました。

6. Heroku Schedulerの設定

Herokuの画面に戻り、「Heroku Scheduler Standard」から

  • 「Create Job」をクリック
  • 「Schedule」で「Every 10 minutes」を選択
  • 「Run Command」に以下を入力
python scheduler.py
  • 「Save Job」で保存しました。

7. 結果確認

10分待っても、LINEにメッセージが届きませんでした。

問題発覚と対応

scheduler.pyのコードをローカル(Jupyter Lab)で確認したところ、
そもそも動作していないことがわかりました。

調べた結果、os.environの使用が原因でした。

os.environとは、環境変数をPythonコード内から読み込むための仕組みですが、
設定が正しくできていないと値が取得できず、エラーになります。

そこで、os.environを使わず、直接値を埋め込む形に修正しました。

from flask import Flask
from linebot import LineBotApi
from linebot.models import TextSendMessage

app = Flask(__name__)

LINE_CHANNEL_ACCESS_TOKEN = "自分のアクセストークン"
USER_ID = "自分のユーザーID"
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)

def main():
    pushText = TextSendMessage(text="明日、新宿午後7時からです。よろしくお願いします。")
    line_bot_api.push_message(USER_ID, messages=pushText)

if __name__ == "__main__":
    main()

これを再度デプロイし直し、
Heroku Schedulerも設定し直して待ったところ、
無事にLINEにメッセージが届きました。

感想と反省

今回、無事にHeroku Schedulerで定期実行できるようになりましたが、
Heroku Schedulerは

  • 毎分(Every 10 minutesなど)
  • 毎時間
  • 毎日

のざっくりしたスケジュールしか設定できないことに気づきました。
細かい時刻指定は(現時点の私には)難しいようです。

そして、今回一番手こずったのは、os.environでした。

環境変数は本来、セキュリティ対策や設定管理のために使うものですが、
初心者にとっては概念が難しく、理解に時間がかかりました。

まずは、動かすことを優先し、
環境変数を使わず直接書き込む方法を選びましたが、
今後はきちんと環境変数を使う方法も勉強していきたいと思います。


ここまで読んでいただき、誠にありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。