light log

学んだこととか

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でタイムゾーン設定 - Qiita

を参考にして、

$ 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時間経ってれば大丈夫そうだけど)、この制限はテスト中に困るので、とりあえずテキストにタイムスタンプを付けておくことにした。結局いまでもタイムスタンプは残ってるけど。

まとめ

こんなとこだっけな。

他にもいろいろごちゃごちゃとハマっていたような気がするんだけど…。まぁ思い出したら書こう(たぶん書かない)

参考