環境情報
- 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でした。
環境変数は本来、セキュリティ対策や設定管理のために使うものですが、
初心者にとっては概念が難しく、理解に時間がかかりました。
まずは、動かすことを優先し、
環境変数を使わず直接書き込む方法を選びましたが、
今後はきちんと環境変数を使う方法も勉強していきたいと思います。
ここまで読んでいただき、誠にありがとうございました。