【X API・旧Twitter API】GASでスプレッドシートから自動投稿|botを作成する例

今回は、X API(旧Twitter API)を利用して、スプレッドシートに入力したテキストをランダムで投稿する、簡単なGASの例となります。
スプレッドシートを作成
まずは、スプレッドシートを作成してシート名を「sheet01」とします。そしてシート内のA1〜A5セルに投稿したいテキストを、それぞれ入力します。
GASのプロジェクト(スクリプト)を作成
上記のスプレッドシートに紐付いたGASのプロジェクトを作成します。
GASでは、シート名「sheet01」のA1〜A5セルから、1つのセルの値をランダムで取得してツイできるようにします。
また、GASの基本的な利用方法については、以下のリンク先参考にしてみてください。
X APIを利用する準備
認証情報を確認
APIを利用するTwitterアカウントで Twitter Developers にログインし、追加したAppの「Keys and tokens」画面で、以下の認証情報を確認します。
また、Twitterへ投稿する場合には、User authentication settingsの編集画面で、App permissionsの設定を「Read and write」にします。
- Consumer Key
- Consumer Secret
コールバックURLを指定
Twitter Developers で追加したAppの「User authentication settings 」の編集画面を表示し、「Callback URI / Redirect URL」の箇所に以下のアドレスを入力して保存します。
https://script.google.com/macros/d/XXXXXXXX/usercallback
URL内のXXXXXXXXの箇所は、作成したプロジェクトのスクリプト ID となります。
スクリプト ID を確認する方法については、以下のリンク先を参考にしてみてください。
OAuth1 for Apps Script ライブラリを読み込み
作成したGASのプロジェクトに、GASのライブラリ「OAuth1 for Apps Script」を読み込みます。
「OAuth1 for Apps Script」は、OAuth1.0のトークンを生成して認証する機能を提供するGASのライブラリとなり、スクリプトIDは以下となります。
1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s
GASのライブラリを利用する方法
GASのライブラリを利用する方法については、以下のリンク先を参考にしてみてください。
スクリプトを作成
GASのエディタ画面に以下のコードを追加して保存します。
コード内のxxxxxxxxの箇所には、確認したTwitter APIの認証情報をそれぞれ指定します。
// OAuth1.0の認証で利用する値を変数にセット
const accessTokenUrl = "https://api.twitter.com/oauth/access_token";
const requestTokenUrl = "https://api.twitter.com/oauth/request_token";
const authorizationUrl = "https://api.twitter.com/oauth/authorize";
const consumerKey = "xxxxxxxx"; // Consumer Key をセット
const consumerSecret = "xxxxxxxx"; // Consumer Secret をセット
const serviceName = 'twitter';
// OAuth1.0の認証で、Twitterにアクセスする関数
function getService() {
return OAuth1.createService(serviceName)
// OAuth1.0の認証で利用する値をセット
.setAccessTokenUrl(accessTokenUrl)
.setRequestTokenUrl(requestTokenUrl)
.setAuthorizationUrl(authorizationUrl)
.setConsumerKey(consumerKey)
.setConsumerSecret(consumerSecret)
// 認証の確認後に実行するコールバック関数を指定
.setCallbackFunction('authCallback')
// 生成したトークンを、GASのプロパティストアに保存(永続化)
.setPropertyStore(PropertiesService.getUserProperties());
}
// 認証の確認後に表示する可否メッセージを指定する関数
function authCallback(request) {
const service = getService();
const isAuthorized = service.handleCallback(request);
if (isAuthorized) {
return HtmlService.createHtmlOutput('認証が許可されました。');
} else {
return HtmlService.createHtmlOutput('認証が拒否されました。');
}
}
// OAuth1.0のトークンを生成し、認証画面のURLを表示する関数(関数はスプレッドシートの画面で利用)
function authorizeLink() {
const ui = SpreadsheetApp.getUi();
const service = getService();
if (!service.hasAccess()) {
const authorizationUrl = service.authorize(); // トークンを生成し、認証ページのURLを返します
const template = HtmlService.createTemplate('<a href="<?= authorizationUrl ?>" target="_blank">Authorize Link</a>');
template.authorizationUrl = authorizationUrl;
const output = template.evaluate();
ui.showModalDialog(output, 'OAuth1.0認証');
} else {
ui.alert("OAuth1.0認証はすでに許可されています。");
}
}
// プロパティストアに保存したトークンをリセットする関数
function clearService(){
OAuth1.createService(serviceName)
.setPropertyStore(PropertiesService.getUserProperties())
.reset();
}
// API リクエストを送信するための関数
function makeRequest(url, options) {
const service = getService();
const res = service.fetch(url, options);
const result = JSON.parse(res.getContentText());
console.log(JSON.stringify(result));
}
// スプレッドシート内のデータを取得して投稿する関数
function tweets() {
// スプレッドシートからセルの値をランダムで取得
const sheet = SpreadsheetApp.getActiveSheet();
const min = Math.ceil(1);
const max = Math.floor(5);
const i = Math.floor(Math.random() * (max - min + 1) + min);
const cell = "sheet01!A" + i;
const value = sheet.getRange(cell).getValue();
// 投稿するAPIリクエスト
const url = "https://api.twitter.com/2/tweets";
const payload = {
"text": value
};
const options = {
'method' : 'post',
'payload' : JSON.stringify(payload),
'contentType' : 'application/json',
'muteHttpExceptions' : true
};
makeRequest(url, options);
}
スクリプトの関数を実行
上記で作成したスクリプトの関数を、次の通り実行します。
OAuth1.0のトークンを生成し、Twitterの認証ページを表示する関数
スクリプト内の関数authorizeLinkは実行をすると、OAuth1.0のトークンを生成し、Twitterの認証ページのリンクを、スプレッドシートのダイアログに表示します。
また、関数authorizeLinkは、スプレッドシートのダイアログを表示するため、関数をスプレッドシートから実行します。
スプレッドシートからスクリプトの関数を実行する方法については、以下のリンク先を参考にしてみてください。
上記関数を実行すると、スプレッドシートの画面上に、次のようなダイアログが表示されるので、ダイアログ内の「Authorize Link」を選択します。
上記リンクをクリックすると、Twitterの認証画面が表示されるので、「連携アプリを認証」を選択します。

そうすると、次のようなページに移動し認証が許可されます。

生成したトークンはGASのプロパティストアに保存
上記の関数authorizeLink内で生成したトークンは、関数getService内で、GASのプロパティサービスを利用して、プロパティストアに保存(永続化)します。
そのため、プロパティストアに保存したトークンを削除するまで、再度、関数authorizeLinkを実行する必要はありません。
また、GASのプロパティサービスについては、文末の参考サイトを確認してみてください。
投稿する関数
上述のとおり認証を許可した後、スクリプト内の関数tweetsを実行をすると、シート名「sheet01」のA1〜A5セルから、1つのセルの値をランダムで取得して投稿を行います。
プロパティストアに保存したトークンを削除する関数
スクリプト内の関数createServiceは実行をすると、プロパティストアに保存したトークンを削除します。
一定期間・時間ごとに関数を自動実行
GASではプロジェクトにトリガーを設定することで、作成したスクリプトの関数を一定期間・時間ごとに実行できます。
上記スクリプト内の関数tweetsを、トリガーに設定することでTwitter bot のように、一定時間ごとにランダムで投稿をします。
トリガーの設定方法については以下のリンク先を参考にしてみてください。
PHPのスクリプトで自動投稿をする場合
GASではなく、PHPのスクリプトで自動投稿をする方法については、以下のリンク先を参考にしてみてください。
スクリプトの簡単な説明
スクリプトの簡単な説明となります。
OAuth1.0の認証でTwitterにアクセス
コード1行目からの以下の箇所では、OAuth1.0の認証でTwitterにアクセスするための変数・関数を定義しています。
また、.setCallbackFunction('authCallback') では、認証の確認後に実行するコールバック関数を指定し、.setPropertyStore(PropertiesService.getUserProperties())では、生成されたOAuth1.0のトークンをGASのプロパティストアに保存しています。
// OAuth1.0の認証で利用する値を変数にセット
const accessTokenUrl = "https://api.twitter.com/oauth/access_token";
const requestTokenUrl = "https://api.twitter.com/oauth/request_token";
const authorizationUrl = "https://api.twitter.com/oauth/authorize";
const consumerKey = "xxxxxxxx"; // Consumer Key をセット
const consumerSecret = "xxxxxxxx"; // Consumer Secret をセット
const serviceName = 'twitter';
// OAuth1.0の認証で、Twitterにアクセスする関数
function getService() {
return OAuth1.createService(serviceName)
// OAuth1.0の認証で利用する値をセット
.setAccessTokenUrl(accessTokenUrl)
.setRequestTokenUrl(requestTokenUrl)
.setAuthorizationUrl(authorizationUrl)
.setConsumerKey(consumerKey)
.setConsumerSecret(consumerSecret)
// 認証の確認後に実行するコールバック関数を指定
.setCallbackFunction('authCallback')
// 生成したトークンを、GASのプロパティストアに保存(永続化)
.setPropertyStore(PropertiesService.getUserProperties());
}
認証の確認後に表示する可否メッセージを指定
コード25行目からの以下の箇所では、Twitterの認証の可否のメッセージを指定する関数を定義しています。また、可否のメッセージは、Twitterの認証の確認後に移動するページで表示されます。
// 認証の確認後に表示する可否メッセージを指定する関数
function authCallback(request) {
const service = getService();
const isAuthorized = service.handleCallback(request);
if (isAuthorized) {
return HtmlService.createHtmlOutput('認証が許可されました。');
} else {
return HtmlService.createHtmlOutput('認証が拒否されました。');
}
}
OAuth1.0のトークンを生成し、認証画面のURLを表示
コード38行目からの以下の箇所では、OAuth1.0のトークンを生成し、スプレッドシートのダイアログに認証画面のURLを表示する関数を定義しています。
// OAuth1.0のトークンを生成し、認証画面のURLを表示する関数(関数はスプレッドシートの画面で利用)
function authorizeLink() {
const ui = SpreadsheetApp.getUi();
const service = getService();
if (!service.hasAccess()) {
const authorizationUrl = service.authorize(); // トークンを生成し、認証ページのURLを返します
const template = HtmlService.createTemplate('<a href="<?= authorizationUrl ?>" target="_blank">Authorize Link</a>');
template.authorizationUrl = authorizationUrl;
const output = template.evaluate();
ui.showModalDialog(output, 'OAuth1.0認証');
} else {
ui.alert("OAuth1.0認証はすでに許可されています。");
}
}
プロパティストアに保存したトークンを削除
コード54行目からの以下の箇所では、GASのプロパティストアに保存したトークンを削除する関数を定義しています。
// プロパティストアに保存したトークンをリセットする関数
function clearService(){
OAuth1.createService(serviceName)
.setPropertyStore(PropertiesService.getUserProperties())
.reset();
}
スプレッドシート内のデータを投稿
コード63行目からの以下の箇所では、シート名「sheet01」のA1〜A5セルから、1つのセルの値を取得し、その値をTwitter API v2.を利用して投稿しています。
// API リクエストを送信するための関数
function makeRequest(url, options) {
const service = getService();
const res = service.fetch(url, options);
const result = JSON.parse(res.getContentText());
console.log(JSON.stringify(result));
}
// スプレッドシート内のデータを取得して投稿する関数
function tweets() {
// スプレッドシートからセルの値をランダムで取得
const sheet = SpreadsheetApp.getActiveSheet();
const min = Math.ceil(1);
const max = Math.floor(5);
const i = Math.floor(Math.random() * (max - min + 1) + min);
const cell = "sheet01!A" + i;
const value = sheet.getRange(cell).getValue();
// 投稿するAPIリクエスト
const url = "https://api.twitter.com/2/tweets";
const payload = {
"text": value
};
const options = {
'method' : 'post',
'payload' : JSON.stringify(payload),
'contentType' : 'application/json',
'muteHttpExceptions' : true
};
makeRequest(url, options);
}
また、スプレッドシートからセルのデータを取得する方法については、以下のリンク先を参考にしてみてください。