RubyとHerokuでTwitterに自動投稿する
昨日のやつを毎朝自動投稿するようにした。
環境
キーとかトークンとかシークレットをコードの外に出す
昨日はこれらの値もソースコードに直接書き込んでいたんだけど、これだとGitHubで公開できない。GitHubにもHerokuにもプッシュしたい。
調べたら以下が見つかった。
HerokuとGitHubの両方にプッシュする時の秘密にしたい値の扱い - アインシュタインの電話番号
ソースを以下のように変更して、
config = { consumer_key: ENV['CONS_KEY'], consumer_secret: ENV['CONS_SEC'], access_token: ENV['ACCS_TOK'], access_token_secret: ENV['ACCS_SEC'], }
環境変数の設定は以下のようにする。
$ heroku config:add CONS_KEY="YOUR_CONSUMER_KEY"
でもいま公式ドキュメントを見たら
Previous versions of the Heroku Toolbelt used config:add and config:remove
Configuration and Config Vars | Heroku Dev Center
って書いてあった。
いまは
Use the Heroku CLI’s config, config:set, config:get and config:unset to manage your config vars:
のようだ。
Gemfileを作る
最初これをせずにHerokuにデプロイしようとしていてうまくいかずに困った。
$ bundle init
でGemfileの雛形を作って(上のコマンドを使わずイチから書いてもいい)、以下のように修正する。
source "https://rubygems.org" ruby '2.2.0' gem 'twitter'
で、インストール(とGemfile.lockの作成)。
$ bundle
Herokuにpushする
Herokuのアカウント登録とかHeroku Toolbeltのインストールとかは終わってる前提。
以下でデプロイする。
$ heroku create $ git push heroku master
Herokuのタイムゾーンを変える
デフォルトではUTCになってるので、
を参考にして、
$ heroku config:add TZ=Asia/Tokyo
でタイムゾーンを変更する。
Heroku Schedulerを導入する
これで指定した時間にスクリプトを実行する。
$ heroku addons:create scheduler:standard
でアドオンの追加。アドオンを追加するためにはクレジットカード情報を登録しておく必要がある。(無料枠を超えたときに請求が来るように)
アドオンを追加したら、Web上のアプリのページ->[Add-ons]からHeroku Schedulerアドオンの設定を開いてスクリプトを起動する時刻を指定する。時刻の入力はUTCになっているので注意。
Tweetされるのを待つ
まつ。
はまったやつ
実行してみても正常終了しているように見えるのに、一向にTweetが投稿されないっていう現象になってちょっとハマった。
原因はTwitterの「一定時間内に同じテキストは投稿できない」制限によるものだった。この制限の存在は昔から知ってたけど、同じテキストの連投がダメなのかと思ってた。間に別のテキストのTweetをはさんでいてもダメだったとは。
最終的には1日に1回投稿にして、テキストは日付を含んでいて内容が変わるから大丈夫なんだけど(仮に内容が全く同じでも24時間経ってれば大丈夫そうだけど)、この制限はテスト中に困るので、とりあえずテキストにタイムスタンプを付けておくことにした。結局いまでもタイムスタンプは残ってるけど。
まとめ
こんなとこだっけな。
他にもいろいろごちゃごちゃとハマっていたような気がするんだけど…。まぁ思い出したら書こう(たぶん書かない)