【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の認証画面が表示されるので、「連携アプリを認証」を選択します。

Twitterの認証画面の画像
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);
}

また、スプレッドシートからセルのデータを取得する方法については、以下のリンク先を参考にしてみてください。

参考サイトなど

コメント投稿コメント投稿欄を開く

コメントは項目欄(*は必須項目)を入力し、「コメントを送信」ボタンをクリックしてください。 (メールアドレスは公開されることはありません。コメントの公開は承認制となります。)

また、多忙によりコメントには返信できない場合があります。

Twitterで返信する場合はこちらから。