IFTTTを使って、ワードプレスの新規ポストをトリガーに、Twitterへの自動投稿を行っていましたが、投稿のタイミングが集中して、Twitterアカウントの一時凍結をされるケースがありました。今回はその回避策として、投稿時間を分散させる方法を解説したいと思います。
- 自動投稿の制御ができないことによるTwitterカウントの凍結を避けられるようなる
- IFTTTのトリガー自体の発生を制御できるようになる
- GoogleスプレッドシートとAppsScript(GAS)の使用例を知れる
…と書いてみましたが、我ながら、かなりニッチな課題解決だと思っております。完全に趣味的な記事になりますが、少しでも読んでいる方のお役に立てれば幸いです。
なお、これまでのIFTTTの設定については、以前に書いたこちらの記事をご参照ください。
投稿が集中してTwitterアカウント凍結
関連記事にあるとおり、別口で運営しているニュースキュレーションサイトにて、新しいニュース(WordPressの新規ポスト)が上がったのをトリガーとして、Twitter投稿をするというレシピを作成していました。
全ニュースだと数が多すぎるので、IFTTTのFilter機能を使用して、特定のカテゴリーとタグだけを投稿するようにしていました。
ところが、、、「大谷翔平」のタグを投稿するするようにしていたのですが、大谷選手が活躍するとほぼ全てのニュースメディアが、瞬間的に記事をアップするという状況が発生。それに伴い、1分のうちに多数のTweetを自動投稿することになり、あえなくアカウント凍結となりました。
トリガー頻度をコントロールする
今回のケースですと、トリガーの頻度をコントロール出来なかったことが敗因となります。なので対処策はシンプルにトリガー頻度のコントロールを出来るようにするということでした。
そこでトリガーを以下に変更しました。
Google Sheet(スプレッドシート)の新規データ(Row)が追加された
データ追加するために、GAS(Google AppsScript)を組むことにしました。
以下、スクリプトの処理手順です。
というわけで、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(レシピ)全体はこんな感じで、超シンプルです。トリガーのスプレッドシートの設定方法とかは、特に分かった設定はないので割愛します。
アクションのPost a tweetについては、シート内のカラムをプレースホルダーで入れ込んで、ポスト内容の設定が可能なので、好みの内容にしてください。「#」を文字列の前につければ、そのままハッシュタグになります。
これで、Appletを保存して、Connectすれば稼働開始です。
まとめ
- IFTTTのトリガーをGoogleスプレッドシートに新規データ追加時に変更
- 新規データ追加をAppsScriptで制御(10分に1度、1行のみ追加されるようにした)
このシートがあれば、IFTTTに限らず他のパイプサービス(って昔は呼んでたんですが、最近はRPAサービスになるんでしょうか?)でも使えるかと思います。
極めて狭い課題解決しか出来ていない記事になりましたが、少しでもお役に立てれば幸いです。