環境
MacBook Air (11-inch, Early 2015) バージョン11.6(20G165)
Python 3.8.8 64-bit
Heroku
LINE API
経緯
LINEのチャットボットを使っているのだが、「定期実行」ができれば、「幹事などやる時便利かも」と思い調べてみら、「Heroku scheduler」というのがあるらしい。
やったこと
Herokuにスケジュールを追加。
「ターミナル」で
heroku addons:add scheduler:standard
と入力。「Install add-ons」の下に「Heroku Scheduler Standard」と出るはず。
。。。
出ない(T ^ T)
「There are no add-ons for this app」って言ってる。
Herokuへクレジットカードの情報を追加
どうやら、クレジットカードの情報を登録しないといけないらしい。
「Heroku」の画面で右上のアイコンをクリック
「Account settings」をクリック
「Manage Account」のちょい右下にある「Billing」をクリック
「Billing Information」とあるのでそこにクレジットカードを登録する。
アドオンをインストール
ターミナルで
heroku addons:create scheduler:standard --app アプリ名
を入力。
「Heroku Scheduler Standard」と出た。
やったーーー。
scheduler.pyを作成
次に定期実行するファイルを作る。
LINEチャットボットを走らせているpyファイル(私の場合は”app.py”)と同じ階層に「scheduler.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__) LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"] LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"] 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()
太赤字のところに自分のLINE情報を入力する。
デプロイする
ターミナル起動
「cd」 でapp.pyとscheduler.pyの場所(path)に移動
「ls」 でpyファイルがちゃんとあるか確認
「git init」 と入力。初期化する
「heroku git:remote -a Herokuのアプリ名」と入力」。”Herokuのアプリ名”は自分で作ったアプリの名前です。
「git remote -v」と入力。
「git add .」と入力。
「git commit -m’適当な名前’」と入力。’適当な名前’は本当になんでもいいです。私はアプリ名と今日の日付を入力してます。
「git pusu heroku mastar」と入力。しばらく待ちます。
・
・・
・・・
・・・・
remote: Verifying deploy… done.
とか表示されてるはずです。
再度、Herokuのページ画面に戻り、「Heroku Scheduler Standard」を設定する
Heroku Scheduler Standardをクリック。
「Create job」をクリック
「Job Editor」が出てくる
「Schedule」を選ぶ。私は”Every 10 minutes”と選びました。
「Run Command」の「S」のバーに「python sceduler.py」と作ったpyファイル名を入力。
「Save job」をクリック。
これでOKなはず。
10分待ちます。
・
・・
・・・
LINEに何の反応もありません(T ^ T)
できなーい(T ^ T)遅い時間だからもう寝ます。
次の日
scheduler.pyは本当に動いているのか確認
scheduler.pyで書いたコードはネットからコピペしただけなので
jupyter labで動きを確認。
動かない( ̄◇ ̄;)
なんで?
LINEのユーザーID、チャンネルトークン、秘密鍵の番号を再確認。
合ってるよ〜。
なんで動かないの?(T ^ T)
pythonコード内を確認
コード内にos.environと見慣れない文字があるが、これって何?
グーグルに聞いてみた。
環境変数らしいがよくわからない。
os.environを使わず、そのままIDやTOKENなどを入力。
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__) LINE_CHANNEL_ACCESS_TOKEN = "LINE_CHANNEL_ACCESS_TOKEN" LINE_CHANNEL_SECRET = "LINE_CHANNEL_SECRET" USER_ID = "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()
走らせてみる。
・・・
動いた!!!
やったーー。
再度デプロイする
再度、ターミナルの起動して、デプロイしてみた。
一応、「Heroku Scheduler Standard」の設定も作り直した。
10分待つ。
・
・・
メッセージきた!!!
やったー終わり!
後日談
こんな感じで、無事にheroku schedulerを使うことができましたが、heroku schedulerは”毎分”、”毎時間”、”毎日”しか時間設定できないことに気づく。(やり方はあるかもしれないけど、今の私にはわかりません)
感想
今回一番、手こずったのはos.environです。
os.environがなんなのか、なんの意味があるのか、使い方はこれで合ってるのか、ってか本当にいるのかとかを調べるのに時間がかかりました。
結局、os.environを使わず、そのまま、LINEの情報を入力したら、動いたのでよかったのですが、
一体、os.environはどんな意味だったのでしょう?
勉強します。
最後までブログみていただきありがとうございました。