有料化でTwitter APIが停止したので、IFTTTを使ってみる(Ruby編)

このページでは、Twitter APIの有料化に伴い、Webhook経由でIFTTTより自動ツイートを行う方法を、Rubyでどの様に実装すればよいかを、解説します。

前回(curl編)の続きになります。

目次

IFTTT+Twitterでの注意ポイント

IFTTT+Twitterの場合、プログラミング上の注意点はあるのでしょうか?

判明している範囲で解説します。

IFTTT+Twitter(IFTTT Pro以上)のツイート制限

まず、IFTTT+Twitterのツイート数に制限があります

200件/日になります

ほぼ毎日超過するような場合は、アカウントの分割を考えたほうが賢明です。
(年に数回レベルで超えることがある程度であれば、プログラム変更の余地はありそうです。)

調査したところ、私のアカウントでは年に20回程度発生しますが、このままトライしてみます。

まず、160件を超えると、アラートのeメールがやってきます

Your Pro+ account has a limit of 200 Tweets per day. You have posted 160 Tweets so far. When your limit is reached, all your active Applets with this action will be paused.

そのまま放っておくと、200件ツイートされたあとに、一時凍結されます。

この凍結は時間が来れば解除されますが、ちょっとした癖があるようです。

  • 凍結解除は日本時間16時(現地時間0時)
  • 16時に解除されても、その後、直近24時間に200件に達したら、翌日の16時までまた凍結される(と思われる?)

例えば、15時に凍結され16時に解除しても、直近24時間でのツイート数が199件であった場合、1件ツイートされた途端に凍結されて、翌日16時までツイートされないようです(経験上)。
これは、ちょっと痛いです。

ですので、プログラムで、直近24時間のツイート数をモニタリングし、200件に達しないように「自主規制」する必要がありそうです。

私は200件よりやや低い値で「自主規制」しています。

ツイートログをDBに書き込んでいれば、SQLで件数は把握できますが、例えば直近24時間が180件で、これからツイートする件数が20件以上の場合は、ツイートするたびに件数をカウントし、達する寸前で自主規制ことになりそうです。

こうすれば、時間帯によってはツイート数が減るでしょうから、ある程度の時間が経過すれば、再びツイートできるようになるでしょう。
(翌日16時まで待たなくて済む程度かもしれませんが…)

画像付き、なしのThenが別に存在する

画像付き、なしのThenが別々に存在しますので、両者が混在する場合、2つのAppletsを作成し、プログラムで分岐し実行する必要があります。

画像付きTweetは1画面のみ

画像付きは1件のみになるようです。
私のBOTではMAX4件までアップできましたので、ちょっと残念です。

Twitterの成功・失敗がモニタリングできない

成功しようが、失敗しようが、IFTTTは「200 OK」を返します。
どのようなエラーが発生したかは判断できないようです。
少なくとも…

  • 文字数超過
  • 画像付きツイートの失敗(フォーマットがサポートしていない等)

…といったケースで、エラーをモニタリングできないようです。

経験上、画像によっては、まれにツイート時にエラーで弾かれるケースがあるため、確実性を重視し、画像ありツイートは断念することにしました。

ちょっと殺風景なツイートになってしまいましたが、仕方ないですね。

IFTTT+Twitterの実装

それでは、RubyにIFTTT関連のロジックを実行していきます。

Twitter APIの代わりにNet::HTTPにてPOSTする

Twitter APIの代わりに、IFTTTのWebhookへ、Net::HTTPにてPOSTします。
下記は、テストプログラムの例です。

require 'net/http'
require 'uri'

~中略~

ifttt_url = "https://maker.ifttt.com/trigger/#{EVENT_NAME}/with/key/#{IFTTT_KEY}"
str = "(文字制限などをクリアしたテキスト)"

res = Net::HTTP.post(
  URI(ifttt_url),
  { value1: str }.to_json,
  'Content-Type' => 'application/json'
)

puts response.code # 何をやっても200が返ってくる

(私のBOTでは今のところ発生していませんが、)例外が発生する可能性はゼロではないと思いますので、begin~rescueで囲んだほうが良いかもしれません。

件数チェックを挿入する

以下は私のBOTプログラムですが、仮にこのようなロジックだとします。

  1. DBから、未ツイートのレコードを取得
  2. レコード件数でループ
    1. テキストにURLやタグを付加し、ツイッター文字制限に丸めた形で整形
    2. ツイート
    3. ツイートが成功した場合、ツイート完了のフラグをUPDATE
  3. ループ終了後、数分間スリープし、1.から再実行

ここに件数チェックを挿入した場合、以下にようになりました。
(マーカーの箇所が、新たに追加した箇所。)

  1. 残件数(MAX値※1-直近24時間のツイート数)を取得します
    1. 残件数が0以下になった場合は、ある程度の時間スリープ※2し、1.から再実行
  2. DBから、未ツイートのレコードを取得
  3. レコード件数でループ
    1. 残件数が0以下になった場合、ループを抜ける
    2. 残件数をマイナス1する
    3. テキストにURLやタグを付加し、ツイッター文字制限に丸めた形で整形
    4. ツイート
    5. ツイートが成功した場合、ツイート完了のフラグをUPDATE
  1. IFTTT PROは200件/日ですが、それよりもやや少ない値にしておくと、リスクが少ないと思います。
  2. スリーブ時間は長めにとりましょう。

といった形で、ループ途中でのブレイクを考えつつ実装していきましょう。

もし、上限に達してしまったらどうするか?

上限に達した場合の選択肢

自主規制すれば、凍結は逃れそうですが、上限に達した場合、うーむ…どうすればいいんでしょうね?

  • 200件を割る時間帯まで待つ
    (プログラムがしっかりしていれば、いつかはきっとツイートされるはず…)
  • DB上ではツイートしたことにして、手作業でツイートする
    (早めにツイートしたほうが良い場合、リカバリープログラム等を作成しておく)

のどちらかを選択することになると思います。

リカバリープログラム例

自主規制でツイート処理が一定時間ストップしているという前提で、リカバリープログラムを実行します。
下記はロジック例です。

  1. DBより未ツイートのレコードを抽出し、ループ
    1. テキストファイルに、整形された文字列を書き出す(追記モードで)
    2. (私はマストドンにもトゥートしてるので、)マストドン用のDBへINSERT
    3. 未ツイートからツイート済みにステータスを変更

実行後に「テキストファイル」にTwitterへツイートする直前の整形された文章(文章+URL+タグで文字数制限チェックされた文章)が書き出されているので、それを手作業でツイートしていきます。

この一連の作業をしなかった場合、上限を割った時点で、ツイートを再開します。

Appletを複数作っておけば良いんじゃないの?

試していませんが、もしかしたら、Appletを複数作っておけば、件数超過は回避することができるかもしれません。
しかし、それで回避できれば良いかもしれませんが、(Appletではなく)Twitterアカウント単位で件数制限がきっちりしていれば、無駄な作業&IFTTT運営に厄介認定されるかもしれません。

それでは、また。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA

目次