【IFTTT】Twitterアカウントが凍結されないように投稿を分散させる

roid

IFTTTを使って、ワードプレスの新規ポストをトリガーに、Twitterへの自動投稿を行っていましたが、投稿のタイミングが集中して、Twitterアカウントの一時凍結をされるケースがありました。今回はその回避策として、投稿時間を分散させる方法を解説したいと思います。

この記事で解決できる課題
  • 自動投稿の制御ができないことによるTwitterカウントの凍結を避けられるようなる
  • IFTTTのトリガー自体の発生を制御できるようになる
  • GoogleスプレッドシートとAppsScript(GAS)の使用例を知れる

…と書いてみましたが、我ながら、かなりニッチな課題解決だと思っております。完全に趣味的な記事になりますが、少しでも読んでいる方のお役に立てれば幸いです。

なお、これまでのIFTTTの設定については、以前に書いたこちらの記事をご参照ください。

目次

投稿が集中してTwitterアカウント凍結

関連記事にあるとおり、別口で運営しているニュースキュレーションサイトにて、新しいニュース(WordPressの新規ポスト)が上がったのをトリガーとして、Twitter投稿をするというレシピを作成していました。

全ニュースだと数が多すぎるので、IFTTTのFilter機能を使用して、特定のカテゴリーとタグだけを投稿するようにしていました。

FilterはPROプラン限定で利用可能

ところが、、、「大谷翔平」のタグを投稿するするようにしていたのですが、大谷選手が活躍するとほぼ全てのニュースメディアが、瞬間的に記事をアップするという状況が発生。それに伴い、1分のうちに多数のTweetを自動投稿することになり、あえなくアカウント凍結となりました。

トリガー頻度をコントロールする

今回のケースですと、トリガーの頻度をコントロール出来なかったことが敗因となります。なので対処策はシンプルにトリガー頻度のコントロールを出来るようにするということでした。

そこでトリガーを以下に変更しました。

Google Sheet(スプレッドシート)の新規データ(Row)が追加された

データ追加するために、GAS(Google AppsScript)を組むことにしました。
以下、スクリプトの処理手順です。

STEP
RSSフィードを取得し配列に入れておく
STEP
配列をイテレートして追加するデータを決める
STEP
スプレッドシート上にすでに重複データがないかを確認(二重投稿を避ける)
STEP
重複なければ転記用の配列に入れる
STEP
1つ入ったら、イテレーションから抜ける(=追加するデータは1つだけにする)
STEP
スプレッドシートに転記する

というわけで、AppsScriptの中身です。

function addNewPost() {
  let feedUrl='ここにフィードのURLを入れる';
  let feed = UrlFetchApp.fetch(feedUrl);
  let parsedFeed = XmlService.parse(feed.getContentText());
  let posts = parsedFeed.getRootElement().getChildren('channel')[0].getChildren('item');
  let rowData =[];
 
  for(let i = 0; i < posts.length; i++){
      rowData.push([
        posts[i].getChildText("title"),
        posts[i].getChildText("category"),
        posts[i].getChildText("link"),
        posts[i].getChildText("pubDate")
      ]);
  }
  
  if(rowData.length>0){
    let ss = SpreadsheetApp.getActiveSpreadsheet();
    let outputSheet =ss.getSheetByName("シート名");
    let lastRow = outputSheet.getLastRow();
    let outputRange = outputSheet.getRange(lastRow+1,1,1,5);
    
    //投稿済みのポストの2重投稿を防ぐため、投稿済みのURLを取得
    let urls =[];
    outputSheet.getRange(2,4,lastRow-1,1).getValues().forEach(e => urls.push(e[0]));

    //Tweetするブログポストの数を絞るために1つだけ追加する
    //1追加したらforを抜けて処理終了
    for(let i = 0; i < rowData.length; i++){
      if(!urls.includes(rowData[i][3])){
        outputRange.setValues([rowData[i]]);
        break;
      }
    }
  }
}

書きなぐったコードでエレガントさはありませんので、もしもお使いになる場合は、その点をご承知おきください。

そして忘れてはいけないのが、Google側でのトリガー設定です。「分ベースのタイマー」で「10分おき」にしておけば、10分ごとにスクリプトが走って、重複するポスト(URLベースで判断)がなければ、シートに新規行を追加します。

Googleスプレッドシート側かこんな感じになります。

IFTTT側の設定

IFTTTのApplet(レシピ)全体はこんな感じで、超シンプルです。トリガーのスプレッドシートの設定方法とかは、特に分かった設定はないので割愛します。

IFTTTのレシピ全体

アクションのPost a tweetについては、シート内のカラムをプレースホルダーで入れ込んで、ポスト内容の設定が可能なので、好みの内容にしてください。「#」を文字列の前につければ、そのままハッシュタグになります。

これで、Appletを保存して、Connectすれば稼働開始です。

まとめ

Tweetしすぎで凍結されないためにやったこと
  • IFTTTのトリガーをGoogleスプレッドシートに新規データ追加時に変更
  • 新規データ追加をAppsScriptで制御(10分に1度、1行のみ追加されるようにした)

このシートがあれば、IFTTTに限らず他のパイプサービス(って昔は呼んでたんですが、最近はRPAサービスになるんでしょうか?)でも使えるかと思います。

極めて狭い課題解決しか出来ていない記事になりましたが、少しでもお役に立てれば幸いです。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
目次
閉じる