Pythonのプログラムを定期実行したい時ってありますよね?
例えば、
- 毎日特定のサイトをスクレイピングしたデータをGmailで送りたい
- ツイッターのいいねを毎日定時に自動実行したい
そんな時、Macならcron、Windowsだとタスクスケジューラーを使えば可能ですが、パソコンをずっと立ち上げておく必要があります。
または、VPSを月額で契約してそこで定期実行する方法がありますが、月々お金がかかります。
そこで、簡単なプログラムを定期実行したい時に便利なのがHerokuの無料枠でschedulerというアドオンを使う方法。
これを使えばパソコンを立ち上げておく必要もなく、無料で指定した時間にpythonのプログラムを定期実行できます。
今回の記事を読めば、設定時間約5から10分でPythonのプログラムを無料で自分の好きな時間に実行する方法を学べます。
Herokuのschedulerで定期実行の設定方法
それでは、Herokuのschedulerを設定する方法について解説していきます。
Herokuのアカウントをお持ちでない方は、あらかじめこちらからアカウントを作成しておきましょう。
gitとheroku CLIのインストール
MacでもWindowsでも、最初にすることはgitとheroku CLIをパソコンにインストールすることです。(すでにインストールしてある方はこちらを飛ばして下さい。)
gitとherokuがインストールされているかどうかの確認はターミナルでそれぞれ下記のように入力してみて下さい。
$ git --version
$ heroku -v
もしインストールされている場合はそれぞれバージョンが表示されます。
gitのダウンロードはこちらから最新のバージョンがダウンロードできます。
次にHeroku CLIのインストールです。
Macの場合はターミナルで下記のコマンドを叩いてインストールするか、Heroku CLIのダウンロードのURLからheroku CLIをダウンロードしてインストールしておいて下さい。
$ brew tap heroku/brew && brew install heroku
Windowsの場合はheroku CLIのダウンロードのURLからダウンロードしてインストールします。
gitとHeroku CLIがインストールできたら、準備は完了です。
定期実行したいPythonのプログラムの準備
定期実行したいPythonのプログラムを用意します。
今回はメールを毎日定時に送信する下記のプログラムを使います。
# -*- coding: utf-8 -*- import smtplib, ssl from email.mime.text import MIMEText data="メール定期送信テストの本文です。" # アカウント情報の入力 gmail_account = "******@gmail.com" gmail_password = "*********" mail_to = "******@gmail.com" # メールデータ(MIME)の作成 subject = "メール定期送信テスト" body = data msg = MIMEText(body, "html") msg["Subject"] = subject msg["To"] = mail_to msg["From"] = gmail_account # Gmailに接続、送信 server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ssl.create_default_context()) server.login(gmail_account, gmail_password) server.send_message(msg) # メールの送信 print("ok.")
ターミナルで作業するフォルダへ移動する
今回はデスクトップにgmailjidou(適当な名前)というフォルダを作ってそこにgmailauto.pyという定期実行したいプログラムを置いておきます。
まずはターミナルを立ち上げ、このgmailjidouのフォルダへ移動します。
$ cd /Users/自分のuser名/Desktop/gmailjidou
次に下記のコマンドでHerokuにログインします。
$ heroku login
すると、何かキーを押して下さいと表示されるので、とりあえず何かキーを入力します。
$ heroku: Press any key to open up the browser to login or q to exit:
そうするとブラウザでHerokuのログイン画面が自動的に立ち上がるので、ユーザー名とパスワードでログインして下さい。
ログインできたらまたターミナルに戻ります。
Herokuに新規にアプリを作る
次はHerokuに新規に定期実行用のアプリを作っていきます。
heroku create アプリ名
でアプリを作ることができます。
今回はアプリ名をgmautotestとします。
$ heroku create gmautotest
すると下記のように表示されてアプリが作成されます。
ここで、 https://gmautotest.herokuapp.com/ は今回作ったアプリのURLです。
https://git.heroku.com/gmautotest.git はリモートリポジトリのURLになるので、メモしておきましょう。
runtime.txtとrequirements.txtの作成
次にアプリに必要となる2つのファイルを作成していきます。
runtime.txt と requirements.txt の2つです。
runtime.txtはherokuでインストールするPythonのバージョンを書いておくファイルです。$ Python -V
でPythonのバージョンを確認して、
python-3.7.6
という形でpythonのバージョンを記載して保存して下さい。(記載方法が違っていたらデプロイする際にエラーが出ます。)
Herokuにデプロイする際にこのバージョンのPythonがインストールされることになります。
requirements.txtはローカルにインストールしてあるPythonのライブラリを書いておくファイルです。
$ pip freeze > requirements.txt
こちらのコマンドで作成可能です。こちらもHerokuにデプロイする時にこのリストに書いてあるライブラリがインストールされます。
herokuへアプリをデプロイ
次はgitを使ってherokuへアプリをデプロイしていきます。
下記のコマンドを順番に実行します。
$ git init $ git remote add heroku https://git.heroku.com/gmautotest.git $ git add . $ git commit -m "aap commit" $ git push heroku master
ここで、git remote add heroku https://git.heroku.com/gmautotest.git
はリモートに https://git.heroku.com/gmautotest.git をherokuという名前で登録するという意味です。
これで、 git push する時にgit push リポジトリ名 master とせず、git push heroku masterするだけでよくなります。
無事にデプロイまで終わると下の画像のようになります。
もし、デプロイの際にエラーが出る場合はruntime.txtかrequirements.txtの記載に間違いがある場合が多いです。見直して見ましょう。
アプリにHeroku Schedulerの設定
次はHeroku Schedulerのアドオンをアプリに設定していきます。
Heroku Schedulerを使う場合は無料枠の範囲でもherokuにクレジットカードを事前に登録しておかなければいけません。(プランを変えない限り勝手に課金されることはありません。)
Herokuへクレジットカードの登録
クレジットカードは
HerokuのAccount settings→Billingタブ
の部分で登録できます。
クレジットカードの登録が終わったら次はschedulerアドオンを追加していきます。
ターミナルで下記のコマンドを実行します。
$ heroku addons:add scheduler:standard
すると下記のような表示が出て、アドオンの追加ができます。
HerokuのSchedulerの詳細設定
次はHerokuのSchedulerの詳細設定を行っていきます。
下記のコマンドを実行して下さい。
$ heroku addons:open scheduler
するとブラウザが立ち上がり下のような画面が出るので
Create jobをクリック
すると、自動実行したいプログラムと日時の設定の画面になります。
例えば、今回だと毎日13時に実行したいので、AM4時に設定します。
$の部分は指定時間に実行するコードを記入します。
今回だと
python gmailauto.py
になります。これでSave jobのボタンを押すと設定が完了です。
後は自動実行を待つだけになります。
毎日13:00になると
ちゃんとメールが届きました。ここまでで定期実行の設定は完了です。
コメント