【GAS】Google Apps Scriptでの自動ツイートするBotの作り方(ソース付き)
上記のサイトを参考に自動Tweet Botを、Google Apps Script(GAS) で作成したので、手順とソースを公開します。
○作成背景
始めは上記のTweet Botをコピペして予約したツイート文言は4種類、ツイートタイミングは4時間置きという設定にして使用していたのですが、
「Tweet が重複している」というエラーがかなりでてしまいました。
しかも、いつもエラーになるわけでなく、たまにエラーになるという状態でした。(エラーになる割合は、25~40%程度)
その原因がなんだろうと、毎日のようにエラーになったものとならなかったものを精査していると、どうやら12時間以内に同一文言をツイートしようとエラーになるのではないかという仮説にたどり着きました。
この仮説が正しいか公式ドキュメント等を確認してみましたが、
裏付けをとることはできませんでした。
正確な仕様等を知っている方は、コメント等いただけると幸いです。
そのため、私のTweet Botでは、
「13時間以内にツイートしたものはツイートしない」
という仕様を追加しています。
なお、この仕様を追加して2週間以上観察していますが、
仕様追加後はエラーになったことは一度もありません。
○Tweet Botの作成手順
0:準備作業
今回のボットは、Google Apps Script(GAS)を使用しているため、Googleアカウントが必要です。
また、ツイートを自動投稿するためには、Twitter APIの開発者登録が必要になります。
Twitter APIの開発者登録の方法は以下の記事に纏めています。
1:Googleスプレッドシートの準備
スプレッドシートを新規作成します。
スプレッドシートに名前を付けておきます。
例は「ツイート_自動Bot」としています。
なお、シートの内容は3列で作ってください。
1列目が「ツイートの内容」、2列目を「ウェイト」、3列目を「前回発信時間」としてください。
なお、4列目の「文字列長」は、プログラムでは使用していませんので、無くても問題ありません。
(※ ツイート内容の文字数が150文字くらいになると文字数制限エラーがでるため、文字数確認用にlen関数をいれています。)
また、1行目は見出しとして無視されるので、2行目から内容を入力してください。
2:スクリプトの記述
スプレッドシートの[拡張機能]メニュー → [Apps Script]をクリックします。(※2021年11月までは、 [ツール] メニュー → [スクリプトエディタ] でした)
Google Apps Scriptのコード編集画面が表示されますので、まずはプロジェクト名を入力します。
ここではプロジェクト名を「PJ_Tweet_Bot」としていますが、名前は何でもOKです。
次に、表示されているコードエディタ内に下記(画像の下)の「ソースコード」をコピー&ペーストします。
ーソースコードー
// Twitter API認証情報
var CONSUMER_KEY = 'カスタムキーを入れる'; // consumer key = API key
var CONSUMER_SECRET = 'シークレットキーを入れる'; //consumer secret = API secret key
var TOKEN = 'TOKENを入れる';
var TOKEN_SECRET = 'TOKEN_SECRETをいれる';
var DATE_TIME = new Date();
var HOUR_TIME13 = new Date();
HOUR_TIME13.setHours(DATE_TIME.getHours() - 13);
// Twitter APIの認証とレスポンス取得
function run() {
// Logger.log(Utilities.formatDate( DATE_TIME, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss')); // 今日の日付を表示
var service = getService();
Logger.log(service.getCallbackUrl());
var tweet = pickUpTweet(); // ツイートの内容を取得
if (tweet == '') {
Logger.log('Tweetが選択できませんでした');
return false; // 終了
}
Logger.log('Tweet Selected : '+tweet);
if (service.hasAccess()) {
var url = 'https://api.twitter.com/1.1/statuses/update.json';
var payload = {
status: tweet
};
var response = service.fetch(url, {
method: 'post',
payload: payload
});
var result = JSON.parse(response.getContentText());
Logger.log(JSON.stringify(result, null, 2));
} else {
var authorizationUrl = service.authorize();
Logger.log('URLを確認してください: %s',
authorizationUrl);
}
}
function doGet() {
return HtmlService.createHtmlOutput(ScriptApp.getService().getUrl());
}
// 認証リセット関数。デバッグ時の初期化用。
function reset() {
var service = getService();
service.reset();
}
// サービス設定
function getService() {
return OAuth1.createService('Twitter')
.setConsumerKey(CONSUMER_KEY) // コンシューマーキー&シークレット
.setConsumerSecret(CONSUMER_SECRET) // コンシューマーシークレット
.setAccessToken(TOKEN, TOKEN_SECRET) // アクセストークンキー&シークレット
// oAuthエンドポイントURL
.setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
.setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
.setAuthorizationUrl('https://api.twitter.com/oauth/authorize')
.setCallbackFunction('authCallback') // コールバック関数名
}
// OAuthコールバック
function authCallback(request) {
var service = getService();
var authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('成功しました');
} else {
return HtmlService.createHtmlOutput('失敗しました');
}
}
// Googleスプレッドシートからツイートする内容を取得する
function pickUpTweet() {
var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // シート名
if (targetSheet.getLastRow() == 1) { return "" } // シートにデータが無い
var cells = targetSheet.getRange(2, 1, targetSheet.getLastRow() - 1, 3).getValues(); // ツイートのリストを格納
Logger.log('targetSheet.getLastRow()= '+ targetSheet.getLastRow());
// Logger.log(cells); //デバッグ用
Logger.log(DATE_TIME);
Logger.log(HOUR_TIME13);
var grossWeight = 0;
for (var i = 0; i < cells.length; i++ ) { // ウェイトの合計値を算出
Logger.log('grossWeight cells[i][2]= ' + cells[i][2]);
if (cells[i][2] < HOUR_TIME13) {
grossWeight += cells[i][1];
Logger.log('grossWeight 加算=' + grossWeight);
}
}
if (grossWeight == 0) { return ""; } // ウェイト総数がゼロ
var targetWeight = grossWeight * Math.random(); // ウェイト合計値を最大値としてランダムでターゲットの数値を生成
var tweetText = "";
for (var i = 0, il = cells.length; i < il; i++ ) {
Logger.log('tweetText cells[i][2]= 「' + cells[i][2] + '」 targetWeight= ' + targetWeight);
if (cells[i][2] < HOUR_TIME13) {
targetWeight -= cells[i][1]; // セルに記入されたウェイトの値を減算
Logger.log('tweetText 減算 cells[i][2]= 「' + cells[i][2] + '」 targetWeight= ' + targetWeight);
if (targetWeight < 0) { // ターゲットの数値がマイナスになったらそのセルの内容を返す
Logger.log('[i]=' + [i])
sd_i = i + 2
Logger.log('sd_i=' + sd_i)
tweetText = cells[i][0];
targetSheet.getRange(sd_i, 3).setValue(DATE_TIME); //ツイート時刻をセルに書き込む
break;
}
}
}
return tweetText;
}
ソースコードの2~5行目
ソースコードの貼り付けが終わったら、ソースコードの2~5行目にあるTwitterキーとトークン情報を書き換えてください。
var CONSUMER_KEY = 'カスタムキーを入れる'; // consumer key = API key
var CONSUMER_SECRET = 'シークレットキーを入れる'; //consumer secret = API secret key
var TOKEN = 'TOKENを入れる';
var TOKEN_SECRET = 'TOKEN_SECRETをいれる';
ソースコードの6~8行目
上述の「13時間以内にツイートしたものはツイートしない」 という仕様は、以下の部分で制御しています。
Twitter APIの仕様が変更になったり、再ツイート可能になるタイミングを変更したい場合は、以下を変更してください。
var DATE_TIME = new Date();
var HOUR_TIME13 = new Date();
HOUR_TIME13.setHours(DATE_TIME.getHours() - 13);
2:OAuth1ライブラリの追加
OAuth認証用のライブラリを追加します。
画面左にある [ライブラリ] の横の [+] ボタンをクリックします。
表示されたダイアログの [スクリプトID] ボックスに「1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s」
と入力し、[検索] ボタンをクリックします。
「ライブラリ OAuth1 を検索しました。」と表示されたら [バージョン] ボックスから最新のもの(ここでは [18] )を選択し、
[追加] ボタンをクリックして閉じます。
ライブラリの登録が完了すると上記のように左のボックスの一覧に「OAuth1」が表示されます。
ツールバーにある「プロジェクトを保存」ボタンで保存してください。
3:スクリプトIDをメモ
スクリプトIDは、サイドメニューの一番下の「歯車 [プロジェクトの設定] 」メニューから確認することができます。
プロジェクトの設定 のIDをコピーしてください。
次の「Twitter Developer PortalでのコールバックURL設定」作業に上記のApps Script プロジェクトのスクリプトIDが必要になります。
4:Twitter Developer PortalでのコールバックURL設定
次に、Twitter Developer PortalでコールバックURLの設定を行います。「Twitter Developer」にアクセスしダッシュボードを開きます。
ダッシュボードから今回作成したアプリを選択し、「Authentication settings」の [Edit] ボタンをクリックします。
表示されたページで以下3項目を入力してください。
・Enable 3-legged OAuth
・Callback URLs
・Website URL
・Enable 3-legged OAuth
→(クリックして)オンにしてください。
・Callback URLs
→「https://script.google.com/macros/d/(スクリプト ID)/usercallback」と入力します。(スクリプトID)の部分は、手順3のものになります。
・Website URL
→必須入力項目です。WebサイトURLを入力してください。
なお、ここの値によって、BOT動きが変わるようなことはありません。
ちなみに、私はこのサイトのURLを入力しています。
入力が完了したら画面下の [Save] ボタンをクリックして保存します。
4.動作確認
動作確認などのためにボットを手動で実行する場合は、Apps Scriptのコード編集画面から行います。
Apps Scriptのコード編集画面へは、左側のサイドバーの「<> [エディタ]」から進むことができます。
Apps Scriptのコード編集画面を開いたら、
ツールバーにあるドロップダウンボックスから「run」を選択します。
次に [実行] ボタンをクリックします。
スクリプトを実行すると、スプレッドシートに記載されたツイートの一覧の中からひとつをランダム選択し、ツイートが行われます。
また、その際にツイートを行ったものの「前回発信時間(3列目)」にツイート時間を記録します。
タイムラインに無事ツイートが表示されていれば、
Tweet Botの作成は完了です!
○Tweet Botを定期的に実行する
最後に、作成したプログラムを自動的に実行するように設定します。
自動実行の設定は、App Sctiptのトリガー設定で行います。
Apps Scriptのプロジェクトページの左側のサイドバーの「時計のマーク [トリガー] 」 をクリックし、右下に表示される [トリガーを追加] ボタンをクリックします。
表示されたダイアログで自動的な実行を行う条件(トリガー)を設定します。
設定するのは、以下6項目です。
・実行する関数を選択
・デプロイ時に実行
・イベントのソースを選択
・時間ベースのトリガーのタイプを選択
・時間の間隔を選択(時間)
・エラー通知
・実行する関数を選択
→「run」を指定してください。
function名を変更した場合は、それに合わせてください。
・デプロイ時に実行
→デフォルト値(=Head)のまま。
・イベントのソースを選択
→〇〇時間おきに実行させたい場合は、「時間主導型」を選択してください。
・時間ベースのトリガーのタイプを選択
→〇〇時間おきに実行させたい場合は、「時間ベースのタイマー」を選択してください。
・時間の間隔を選択(時間)
→任意の時間を選択してください。
なお、選択できる時間は、「1時間」・「2時間」・「4時間」・「8時間」・「12時間」・「24時間」の7種類です。
※注意
12時間以内の時間を設定する場合、「 ツイート内容の個数 * 時間の間隔 」が、12以上 になるように設定してください。
なお、スプレッドシートのツイート内容として入力されているものが全て13時間に発言されている場合は、「ツイートをしないで正常終了(エラーにはならない)」となります。
・エラー通知
→どんな値でも構いません。
エラーにならなければ、通知が来ることはありません。
最後に [保存] ボタンをクリックし、設定完了です。
上記のケースでは、2時間おきにプログラムが実行され、ツイートが自動投稿されるようになります。
まとめ
今回、「自動ツイートするBot」のGASでの作り方を紹介しました。
GASで作成したため、サーバ構築作業やサーバ運用費用等は一切なく、
構築~運用まですべて完全無料です。
しかも、このBOTを使用するようになってから、2か月で50程度しか増えなかったフォロワーが、1か月で100以上増えました。
「バズって急増加」みたいなことはありませんでしたが、じわじわと育てるには有効かと思います。
ツイッター運用等に興味のある方は、有料サービスを使用せず、まずはこのBotを使用して無料で初めてみるのも良いと思います。
自動ツイートする以外のBot達
・指定したツイッターユーザーのフォローリストを作成
・指定したツイッターユーザーのフォロワーリストを作成
・自動でフォロバする
・相互フォローではない(片思い状態)のユーザーを条件をつけてフォロー外す(相互フォローではない人を一律でフォロー外しすることも可能)
なお、この「自動ツイートするBot」以外にも、上記4つのBotを作成しています。
他のBotの作り方も知りたいという方は、コメント等いただけますと幸いです。
参考
- 公式ドキュメント
https://developer.twitter.com/en/docs/twitter-api
- Twitter 開発者 ドキュメント日本語訳
- 【コピペでOK】ツイートを自動投稿するTwitterボットをGoogleスプレッドシート(Apps Script)で作る【2021】
よいと思ってもらえたら、「スキ」をお願いします。
「スキ」は、継続の源泉です。
kindle unlimited
定額で技術書でもなんでも読み放題。いつもお世話になっています。
amazon audible
時短で読書できるので、とても重宝しています。