GASでTwitterのAPIを使って投稿(ツイート)する

2021年3月17日

GASでTwitterのAPIを使って投稿(ツイート)する方法を紹介します。
APIを使うと、ツイートの自動化ができたり、色々便利なことが多いですね。

TwitterAPIの利用申請と準備

TwitterのAPIを利用するには申請が必要です。
手順は以下の記事にまとめていますので、ご覧ください。
https://zenn.dev/specially198/articles/9d1ce6c797bb5b

申請が承認された後は、APIが使えるか確認してみてください。
手順は以下の記事にまとめていますので、ご覧ください。
https://zenn.dev/specially198/articles/54d0b957f185b8

GASでOAuth認証を行うライブラリを追加

TwitterのAPIを使うには、OAuth1.0a認証を行う必要があります。

Googleの公式でOAuth認証用のライブラリがあったので、これを利用します。
https://github.com/googleworkspace/apps-script-oauth1

ライブラリを追加するには、以下のIDを入力します。
1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s

GASのコード

Twitter認証を行うためのコード

まず、Twitter認証を行うためのコードです。

function getTwitterService(serviceName) {
  return OAuth1.createService(serviceName)
    .setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
    .setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
    .setAuthorizationUrl('https://api.twitter.com/oauth/authorize')
    .setConsumerKey("[ここにTwitterのAPI keyを入力]")
    .setConsumerSecret("[ここにTwitterのAPI secret keyを入力]")
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties());
}

function authCallback(request) {
  var twitterService = getTwitterService(request.parameter.serviceName);
  var isAuthorized = twitterService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('認証が正常に終了しました');
  } else {
    return HtmlService.createHtmlOutput('認証がキャンセルされました');
  }
}

1行目のgetTwitterService関数が認証を行う処理になります。
上記で追加したOAuthライブラリを使用しています。

引数でserviceNameというのを受け取るようにしています。
これは、複数のTwitterアカウントで認証してAPIを利用できるようにするためです。
ここで指定した名前をキーに認証情報を保存するので、serviceNameにはTwitterのアカウント名を指定する想定です。

6行目と7行目でTwitterアプリのキー情報を指定します。
Twitterのアプリを作成した時に、「API key」と「API secret key」を保存していると思うので、それを指定します。
もし忘れてしまった場合は、Twitterのアプリの画面から再生成できます。

8行目では、認証が終わった後に戻ってくるコールバック関数を指定しています。
ここで指定している関数は、12行目で定義している関数です。
関数名を変更しなければ、このままで大丈夫です。

12行目からが認証が終わった後に戻ってくるコールバック関数です。
13行目で上記の関数を呼び出すと認証情報が取得できるので、15行目で判定を入れています。
認証が完了していれば、16行目で「認証が正常に終了しました」と表示、認証をキャンセルした場合は18行目で「認証がキャンセルされました」と表示します。

認証処理はGASのWebアプリケーションで作るので、上記のメッセージが画面に表示されるようにします。(Webアプリケーションについては後述します)

認証用のWebアプリケーションのコード

今回はGASのWebアプリケーションからTwitter認証を行う仕組みにしたいと思います。
下記がWebアプリケーションの表示ロジックです。

function doGet(e) {
  var twitterService = getTwitterService(e.parameter.screenName);
  var template;
  if (!twitterService.hasAccess()) {
    var authorizationUrl = twitterService.authorize();
    template = HtmlService.createTemplateFromFile("index");
    template.authorizationUrl = authorizationUrl;
  } else {
    template = HtmlService.createTemplateFromFile("completed");
  }
  return template.evaluate();
}

2行目で上記の認証処理を呼び出し、Twitterの認証情報を取得します。
認証を行うTwitterアカウントは、パラメータから取得するようにします。
?screenName=specially198
のようにパラメータをつけることにします。

4行目で対象のアカウントが認証完了しているかをチェックします。
未認証の場合は、5行目で認証用のURLを取得し、認証ページ(index.html)を表示します。
認証済みの場合は9行目で完了ページ(completed)を表示します。

認証ページ、完了ページは以下のようにHTMLを作っておきます。
認証ページでは認証用URLに飛ぶリンクを設置しています。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <a href="<?= authorizationUrl ?>" target="_blank">Twitterの認証を行う</a>
  </body>
</html>
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    Twitterの認証は完了しています。
  </body>
</html>

Webアプリケーションのデプロイ

GASで作成したWebアプリケーションをデプロイします。
GASエディタの右上から、「デプロイ」→「新しいデプロイ」を選択します。

GASのデプロイメニュー

以下のように新しいデプロイの画面が表示されます。

GASの新しいデプロイ

左上の「種類の選択」で「ウェブアプリ」を選択します。
アクセスできるユーザーは「全員」にしてデプロイを行います。

新しいデプロイ

デプロイが完了すると以下のような画面が表示されます。
ウェブアプリの部分のURLをコピーしておいてください。

新しいデプロイが完了

Twitterアプリの設定

以下のURLからTwitter Deceloperのポータルを開きます。
https://developer.twitter.com/en/portal/dashboard

Twitterアプリの画面から、一番下の「Authentication settings」を編集します。

Twitterアプリのダッシュボード

まず、OAuth認証を有効にします。

OAuth認証を有効にする

続いて、コールバックURLとWebサイトのURLを指定します。

コールバックURLは
https://script.google.com/macros/d/[スクリプトID]/usercallback
という形式になります。
スクリプトIDは、プロジェクトの設定画面から確認できます。

WebサイトのURLは自身のサイトのURLなどを指定しておけば良いと思います。
(Twitter認証する時にアプリの説明として表示されます)

コールバックURLを指定する

また、Twitterアプリの画面で「App permissions」を編集します。

Twitterアプリの権限設定

Twitterアプリの権限はデフォルトでは読み込みのみ(Read Only)になっているので、読み書き(Read and Write)ができるように変更します。

Twitterアプリの権限を読み書きに設定

WebアプリケーションでTwitter認証を行う

GASのWebアプリケーションをデプロイした時にコピーしたURLを開きます。
この時、認証したいアカウントをパラメータに付けるようにします。
https://script.google.com/macros/s/AKfyXXXXXXX/exec?screenName=specially198
のような感じです。

開くと画面は以下のようになります。

認証ページ

上述の通り、「Twitterの認証を行う」のリンクには認証用のURLが設定してあるため、URLをクリックします。
クリックするとTwitterの認証画面に飛びます。

Twitterの認証画面

「連携アプリを認証」をクリックすると認証が行われ、GASのWebアプリケーションにコールバックされます。
コールバックされると完了画面が表示されます。

Twitterの認証が完了

実際にGASからツイートしてみる

以下のようなコードで試してみました。

function postTweet() {
  var twitterService = getTwitterService("[ここに認証したアカウント名を入れる]");
  
  var options = {
    "method": "post",
    "payload": {
      status: 'これはGASからのツイート'
    }
  };
  var response = JSON.parse(twitterService.fetch('https://api.twitter.com/1.1/statuses/update.json', options));
  Logger.log(response);
}

TwitterAPIでツイートを行うには、「/statuses/update.json」のエンドポイントにpostで送信します。

実際にTwitterの画面を見てみると、以下のようにツイートできました。