Python
Heroku
Twitter
Python3

twitter定期botをHerokuにデプロイ

More than 1 year has passed since last update.

やりたいこと

定期的にツイートするプログラムをHeroku上でスケジュール実行したい。

各種インストール

brew install heroku/brew/heroku←HerokuCLI
pip install bottle←軽いwebフレームワーク
pip install twitter←色々あったがとりあえずこれにした

各種ファイル作成〜コミット

こちらとか
こちらとか
HerokuCLIの使い方

プロジェクトフォルダはこんな感じ。
clock.pyについては後ほど。

$ls
Procfile
clock.py
index.py
requirements.txt
runtime.txt
tweet.py
$ heroku login
$ heroku create

これだけでアプリとリポジトリを作成してくれる。
$ git remote -vで確認するとちゃんとリモートリポジトリが設定されてる。

requirements.txt

ここにモジュールを書いておくとデプロイ時にpipインストールしてくれる。
anaconda環境だといろんなモジュール入っててnot foundエラー起こりまくると思うので必要なものだけ記述。
てかanaconda環境じゃないほうがいいね・・。

$  pip freeze | grep -e "bottle" -e "twitter" -e "APScheduler"  > requirements.txt
requirements.txt
bottle==0.12.13
twitter==1.17.1
APScheduler==3.3.1

環境変数のお作法

apiのキーとかコードに直接書くのはアレなので外出しする。
プロジェクトフォルダに.envファイルを置くと(ideや他ツールが)環境変数として扱ってくれるから実行スクリプトはそれを参照するようにする。

.env
CONSUMER_KEY=hogehoge
CONSUMER_SECRET=hogehoge
TOKEN=hogehoge
TOKEN_SECRET=hogehoge

vscodeのデバッグ設定デフォでこうなってるはず。

launch.json
"envFile": "${workspaceRoot}/.env"

ターミナルから起動したいときはforegoってツール使うといけるらしい。

herokuに環境変数設定

$ heroku config set:CONSUMER_KEY="hogehoge"
$ heroku config set:CONSUMER_SECRET="hogehoge"
$ heroku config set:TOKEN="hogehoge"
$ heroku config set:TOKEN_SECRET="hogehoge"

日本時間も設定して置く
まず確認

$ heroku run bash
$ date
Tue Oct  3 03:24:32 UTC 2017

はい。

$ heroku config:add TZ=Asia/Tokyo
$ heroku run bash
$ date
Tue Oct  3 12:30:30 JST 2017

変更でけた。

デプロイして動くか確認

heroku run python tweet.py
わーい動いたー。

スケジューラ設定

Herokuのサイトに行って作成したappのResourcesタブを開く。
〇〇schedulerを追加・・・でクレカ入力を求められる。
これは想定外。
支払い発生したら怖いから回避したい。

調べたところCustom Clock Processesなるものがあるらしい。
pythonではapschedulerというモジュール使うといいらしい。

クロックプロセス周りの設定

Prockfile
web: python index.py
clock: python clock.py

webのプロセスは動かさないし記述も不要だけどまぁ名残で。

$ pip install apscheduler
clock.py
from apscheduler.schedulers.blocking import BlockingScheduler
import tweet

twische = BlockingScheduler()

@twische.scheduled_job('interval',minutes=1)
def timed_job():
    tweet.puttweet_now()

if __name__ == "__main__":
    twische.start()

↓定期実行したいこと書く。

tweet.py
import os
from datetime import datetime
import twitter

def puttweet(str):
    global count,twische
    auth = twitter.OAuth(consumer_key=os.getenv("CONSUMER_KEY"),
                     consumer_secret=os.getenv("CONSUMER_SECRET"),
                     token=os.getenv("TOKEN"),
                     token_secret=os.getenv("TOKEN_SECRET"))
    t = twitter.Twitter(auth=auth)
    t.statuses.update(status=str)

def puttweet_now():
    puttweet(datetime.now().strftime("now:%Y/%m/%d %H:%M:%S"))

デプロイしてclockプロセスを動かす。
webプロセスは停止。

$ heroku ps:scale web=0 clock=1
Scaling dynos... done, now running clock at 1:Free

$ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
For more information on dyno sleeping and how to upgrade, see:
https://○○○/articles/dyno-sleeping

=== clock (Free): python clock.py (1)
clock.1: up 2017/10/03 14:31:00 +0900 (~ 3m ago)

タイムライン確認して正常に動いてることがわかったので停止。
bash
$ heroku ps:scale clock=0
Scaling dynos... done, now running clock at 0:Free

とりあえずやりたいことはできた感。

課題

現在時刻ではなくもっと有意義なことを呟くようにします。