【GAS】初心者のためのtwitterAPIと連携し自動投稿する(2023年7月)

  1. twitter API との連携の仕方がわからない
  2. コードだけじゃなくて、手順をわかりやすく教えてもらいたい!
  3. 最新版に対応した手順を聞きたい

twitter への自動投稿は、作業の自動化をする時にあったらとても便利になりますよね。

ただ、実際 twitter API との連携は、そこまで難しい作業ではありません。

私自身、1日あれば、twitterに自動投稿するコードを実装することができました。

なので、ぜひこれから自動投稿を実装したいと考えているならば、こちらの記事で、実装してほしいと思います!!

本記事の目的

twitterに自動投稿ができるようになる!

【準備編】実装するために、準備すること

実装のために、まずは以下の4つの準備が必要です。

  1. twitter API 側の準備
  2. クライアントID、クライアントシークレットの取得
  3. コードのコピペ
  4. OAuth ライブラリ のインストール
あべべ

それぞれ順番に解説していきます!

twitter API 側の準備

twitter API を準備します。

twitterで自動投稿を行いたいアカウントでログインする。
まず、あなたが、自動投稿を行いたいアカウントをtwitter上でログインしましょう。

API の設定ページとtwitterは同じアカウントになるよう紐付けられているためです。
twitter API 「開発者プラットフォーム」にアクセス!
https://developer.twitter.com/ja/docs/twitter-api
開発者ポータルにアクセス
Developer Portal 左側のメニューバーの、写真赤枠部分をクリック。
赤枠部分は、「Projects & Apps」をクリックすると出てきます。
タブの「Setting」を選び、User authentication settings の中の、Editを選択
App premissions 「Read and write」に設定。
Type of App 「Web App, Automated App or Bot 」に設定
App info のcallback URI / Redirect URL を記載(※下記参照)
webSite URL はなんでも良いです。(あなたのtwitterアカウントのURLなど)

callback URI / Redirect URLの作成方法

①まず、適当なGASを作成しましょう。
(このGASにコードなども書いていきます。)

②GASのURLをコピーします。
以下のような形式になっているはずです。

https://script.google.com/u/0/home/projects/<スクリプトID>/edit

③スクリプトIDの部分を、次のURLに当てはめてください。

https://script.google.com/macros/d/<スクリプトID>/usercallback

④作成完了。

「save」ボタンを押下します。
あべべ

saveボタンを押した後、もしCLIENT ID と CLIENT SECRET が出てきたら、保存しておいてください!

クライアントID、クライアントシークレットの取得

先ほど、クライアントID、クライアントシークレットが出てきていたら、保存をしておいてください。

確認できなかった方は、「Keys and tokens」タブで取得することができます。

コードのコピペ

少し長いですが、以下のコードをまるっとGASにコピペしてください。

const CLIENT_ID = '<クライアントIDを記載>'
const CLIENT_SECRET = '<クライアントシークレットを記載>'

function main() {
  const service = getService();
  if (service.hasAccess()) {
    Logger.log("Already authorized");
  } else {
    const authorizationUrl = service.getAuthorizationUrl();
    Logger.log('Open the following URL and re-run the script: %s', authorizationUrl);
  }
}


function getService() {
  pkceChallengeVerifier();
  const userProps = PropertiesService.getUserProperties();
  const scriptProps = PropertiesService.getScriptProperties();
  return OAuth2.createService('twitter')
    .setAuthorizationBaseUrl('https://twitter.com/i/oauth2/authorize')
    .setTokenUrl('https://api.twitter.com/2/oauth2/token?code_verifier=' + userProps.getProperty("code_verifier"))
    .setClientId(CLIENT_ID)
    .setClientSecret(CLIENT_SECRET)
    .setCallbackFunction('authCallback')
    .setPropertyStore(userProps)
    .setScope('users.read tweet.read tweet.write offline.access')
    .setParam('response_type', 'code')
    .setParam('code_challenge_method', 'S256')
    .setParam('code_challenge', userProps.getProperty("code_challenge"))
    .setTokenHeaders({
      'Authorization': 'Basic ' + Utilities.base64Encode(CLIENT_ID + ':' + CLIENT_SECRET),
      'Content-Type': 'application/x-www-form-urlencoded'
    })
}

function authCallback(request) {
  const service = getService();
  const authorized = service.handleCallback(request);
  if (authorized) {
    return HtmlService.createHtmlOutput('Success!');
  } else {
    return HtmlService.createHtmlOutput('Denied.');
  }
}

function pkceChallengeVerifier() {
  var userProps = PropertiesService.getUserProperties();
  if (!userProps.getProperty("code_verifier")) {
    var verifier = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";

    for (var i = 0; i < 128; i++) {
      verifier += possible.charAt(Math.floor(Math.random() * possible.length));
    }

    var sha256Hash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, verifier)

    var challenge = Utilities.base64Encode(sha256Hash)
      .replace(/\+/g, '-')
      .replace(/\//g, '_')
      .replace(/=+$/, '')
    userProps.setProperty("code_verifier", verifier)
    userProps.setProperty("code_challenge", challenge)
  }
}

function logRedirectUri() {
  var service = getService();
  Logger.log(service.getRedirectUri());
}



function sendTweet() {
  var payload = {
    "text": "テストツイーーーーーーート",
  }

  var service = getService();
  if (service.hasAccess()) {
    var url = `https://api.twitter.com/2/tweets`;
    var response = UrlFetchApp.fetch(url, {
      method: 'POST',
      'contentType': 'application/json',
      headers: {
        Authorization: 'Bearer ' + service.getAccessToken()
      },
      muteHttpExceptions: true,
      payload: JSON.stringify(payload)
    });
    var result = JSON.parse(response.getContentText());
    Logger.log(JSON.stringify(result, null, 2));
  } else {
    var authorizationUrl = service.getAuthorizationUrl();
    Logger.log('Open the following URL and re-run the script: %s',authorizationUrl);
  }
}
あべべ

忘れずに!!

コピペしたら、先ほど、メモした「クライアントID」「クライアントシークレット」を先頭行の部分に記載しましょう!

OAuthライブラリをインストールします

GASのライブラリの追加部分「+」をクリックし、以下IDを記載し検索します。

ID

1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

あべべ

最新バージョンをインストールしておきましょう。

これで、準備は完了です!お疲れ様です。
早速実行していきましょう!!!

アクセス承認を得る

まだツイートすることはできません。

ツイートの前に、あなたのアカウントにAPIからツイートを行っていいか許可を与える必要があります。

そのために、以下手順を行います。

GASで「main」関数を実行
すると、実行ログの部分で、「Open the following URL and re-run the script:」の後に長いURLが出ていると思います。
URLを新しいタブに貼り付けてアクセス。
すると、「許可を与えますか?」のような確認画面が出るので、許可を押してあげてください。
「Success」と表示されれば、OK!
あべべ

これで、権限の付与も完了です!GASから実際にツイートできるようになりました!!

実際にツイートしてみよう!

では、実際にGASの関数を動かして、ツイートを行ってみます。

「sendtweet」関数を実行してみましょう。

レスポンスにエラーが返ってきてなければ、完成です。

実際にTwitterでツイートができているか確認してみてください!

まとめ

今回は、ツイッターの自動投稿をGASで実装する方法を解説しました。

これらを使って、ツイッターをより活用していってください!

ではまた!

参考にさせていただきました。

Google Apps ScriptでTwitterに投稿するスクリプト(GAS×TwitterBot④)

(Visited 220 times, 1 visits today)