Google Apps ScriptからTwitter API v2を使ってツイートする

2020年8月にそれまで制限の厳しかったTwitterのAPIが割と簡単に申請して利用できるようになったので、遅まきながらGoogle Apps ScriptからこのTwitter API v2を使ってツイートをしてみた。

しかし、他のREST APIと異なり、OAuth2.0認証ではなく古いOAuth1.0認証のままなので、ちょっとこれまでのコードとは異なる(特に使用するライブラリ)。ということで、ボットなどで使えるように下準備をしてみました。

今回使用するスプレッドシート等

いつも使ってるOAuth2.0認証用ライブラリではなく、1.0用のライブラリを使用します。コードの書き方は殆ど同じになるように寄せてます。また、本ライブラリはV8ランタイムでもきちんと動作します。

APIリファレンスをよく見て色々な事に活用しましょう。11/15より正式にv2がv1より変わった事に伴ってAPIの追加などもされているので、注意です。

事前準備

Twitter API v2は利用申請が必要です。関連リンクを参考に申請を行い、利用できるようにしておく必要があります。利用できるようになったら、以下の手順でGAS側、Twitter側でそれぞれ準備を行います。

GAS側の事前準備

ライブラリの追加

以下の手順でOAuth1 for Apps Scriptライブラリを追加しましょう。

  1. スクリプトエディタを開きます。
  2. サイドバーよりより「ライブラリ」の+ボタンをクリック
  3. ライブラリを追加欄に「1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s」を追加します。
  4. 今回はバージョンは18を選択してみます。
  5. 保存ボタンを押して完了

これで、OAuth1.0認証にまつわる様々な関数を手軽に利用できるようになります。

図:ライブラリを追加した様子

コールバックURLを取得する

コールバックURLとは、認証を完了しAccess Tokenを取得したら戻るべきURLを指定するものです。これは、スクリプトIDをもとに作られているので、スクリプトIDを取得して組み立てます。

  1. スクリプトエディタのサイドバーより「プロジェクトの設定」を開く
  2. 情報の中にある「スクリプトID」を控えておく。
  3. https://script.google.com/macros/d/スクリプトID/usercallback として組み立てる。これがコールバックURLとなる。

図:スクリプトIDはファイル毎に異なるのです。

Twitter側の事前準備

アプリの作成

Twitter側ではアプリのプロジェクトを作成すると共に、API KeyとSecretを取得する必要があります。以下の手順で作成しましょう。

  1. Twitter DevelopersのDashboardにアクセスする
  2. 下のほうにある「Create App」をクリックする
  3. AppNameを指定します。今回は「autotweet_gas」と命名しました。これは後にコード内で利用します。同じ名前は利用出来ないので、誰かが取ってると使えません。
  4. API KeyとSecretが表示されてるので、コピーしておきます。
  5. App Settingsをクリックする
  6. App PermissionsのEditボタンをクリック
  7. Read and Writeに変更して、Saveをクリックする
  8. Authentication SettingsのEditボタンをクリックする
  9. Enable 3-legged OAuthのスイッチをオンにする
  10. Callback URLsに前述のGAS側のコールバックURLを入れる
  11. Website URLは適当に入れて、Saveをクリックする

注意点として、最初の1個目はstandardアプリとして作れますが、2個目以降はstand aloneアプリとなり、こちらではGASからはツイートは出来ません(403エラーになります

図:ここの設定の変更が重要です

利用制限

Twitter API v2のQuotaを調べて見ると、以下のような制限があります。

  • ツイートは15分、1アプリ当たり300件(ユーザ単位だと900件まで)
  • いいねは、24時間当たり1000リクエストまで
  • ツイートの取得は1リクエスト100件まで(100件を超える部分は、next tokenでの取得が必要)

他にも細かな項目ごとにリミットが掛けられているので、利用する場合には意識する必要があります。特に同じアプリを複数で共有する場合、あっという間にリミットに達してしまうので要注意。応答ヘッダーにその内容がx-rate-limitとして含まれているので、エラー処理を加えたい場合には考慮すると良いでしょう。超過すると429エラー(Too Many Request)が返ってきます。

また、API KeyはPermissionを変更すると使えなくなるので、再度生成する必要性があります。

同じようなキーワードでの検索の場合、リアルタイムでなければスプレッドシートにキャッシュしておいて、それを返すようにしておくと、リクエスト数を減らす事が可能(キャッシュはトリガー使用で1時間ごとに1回取得などにしておくと良いでしょう)。また、連続して大量のツイートを取得するようなケースでは、リミットに抵触しないように、Utilities.sleepでスリープ処理を入れるべきでしょう。

申請不要で使えるようになりました

2021年11月15日、Twitter API v2が正式なAPIとしてv1から移行され、同時にこれまで煩雑な申請が必要であったAPI利用申請ですが、「Essensial」というレベルであれば、申請不要で利用可能になりました。その上位の「Elevated」というレベルでは申請が必要です。既にAPI利用申請を出して取得済みの人は、自動的にElevatedレベルになります(Elevated+やAcademic Researchという研究用レベルも用意されています。)

  • Essential : 1アプリケーション、50万ツイート/月の取得まで
  • Elevated : 3アプリケーション、200万ツイート/月の取得まで

となっています。詳細はこちらのURLより

図:自動的にElevatedになってた

認証を行う処理を作成する

ここまでで事前準備が完了し、あとは認証を実行してAccess Tokenを取得すればツイートの実行準備はすべて完了になります。

GAS側コード

  • 取得したAPI Key、API SecretおよびAppNameをそれぞれコード内に記述します。
  • 今回利用するTwitter APIのエンドポイントはhttps://api.twitter.com/1.1/statuses/update.jsonとなります。v2用のエンドポイントは、
    https://api.twitter.com/2/tweetsとなっています(2021/11/15に追加)
  • startoauthを実行して認証を実行すれば、スクリプトプロパティにAccess Tokenが格納されます。
  • 認証時に次項のTemplate.htmlが呼び出され、認証完了するとCallback URLに指定したURLにアクセスされて、authCallBackが実行されます。

HTML側コード

template.htmlというダイアログ用のファイルを用意します。ここでアクセス承認を実行し、ログインをすると、アクセストークンその他が取得可能になります。

  • 実際にこれらのコードで、startoauthを実行すると、スプレッドシート上で認証用のダイアログが出ます。
  • 認証でtwitterにログインします
  • 取得したAccess Tokenほかはスクリプトプロパティのappnameという項目にガッツリ値が格納されます。
  • reset関数はログアウトされて、再度認証ができるようになります。

ツイートを実行する

認証の実行

スプレッドシートを開き直して、メニューより「OAuth認証」を開くと、「認証の実行」があるので、クリックして実行します。ダイアログが出てくるので、実行するとTwitter認証画面が出ます。

連携アプリを認証を実行するとAccess Tokenが取得されてスクリプトプロパティに格納され、認証が完了します。

図:認証を実行してる画面

取得したTokenを確認

本サンプルスプレッドシートは、スクリプトプロパティの中身を見られるように、機能を追加済みです。メニューより「OAuth認証」を開くと、「スクリプトプロパティ」があるので、開くことで、認証結果のTokenなどを確認出来ます。

図:無事取得出来てるのを確認する

ツイートの実行

同じく、メニューより「OAuth認証」を開くと、「テストツイート」があるので、開くと以下のGASのコードを実行し、GAS側からツイートを実行することが可能になります。これを改造して、例えばスプレッドシートに列挙したデータをトリガーなどを使って自動ツイートしてみたりするBotを作る、何かの処理を行った結果を、GASで受け付けて、テストツイートを実行するように仕込んだりで、色々と使いみちがあると思います。

  • リクエストはPOSTで行い、service.fetchという形でライブラリの力を借りてリクエストを実行します。
  • @アカウント名をstatusに入れれば、リプになります。
  • この他ツイートだけでなくデータの取得などのメソッドもたくさん用意されてるので、この仕組があれば、Twitterを色々と操作することが可能になると思います。

図:GASから実行した結果

ツイートを取得してみる

Twitterをキーワード検索して結果をスプレッドシートに書き出してみようと思います。クエリの作り方については、Building queries for Search Tweetsに記載があります。エンドポイントは、https://api.twitter.com/2/tweets/search/recent?query=となり、これにワードやオプションをつなげて実行します。ユーザ名検索の場合は@マークはつけません(こちらはAPIのバージョンが2となってる)

今回は「Google Apps Script」で検索して日本でのツイートを20件ずつ合計40件取得してみます。また、検索オプションで指定する取得するデータの指定であるtweet.fieldsレスポンスついてはこちらで確認出来ます。

  • optionにてツイート内容のうち取得する項目をtweet.fieldsで指定。またmax_resultで1回当たりの取得ツイート数を指定
  • キーワードはURL Encodeが必要なのでencodeURIComponentで加工。
  • キーワードに於いて、ダブルコーテーションで括って絞り込みが必要な時は、バックスラッシュでダブルコーテーションをエスケープする必要があります。
  • また、今回はリツイートは取得しないので、-is:retweetで排除し、日本語だけを取得するので、lang:jaを指定しています。
  • 取得データを配列に加えて最後に一発でスプレッドシートに書込みをしています。
  • また、今回は20件を2回実行して、合計40件のツイートを取得するので、2回目以降ではoptionにnext_tokenを加える必要があるので、1回目のレスポンスデータに入ってるnext_tokenをoptionに追記させてリクエストしています(これで次の20件が取れる)
  • リミットにかからないように、2回目のリクエスト前にUtilities.sleepで10秒間スリープを入れています。

図:無事にツイートを取得できた

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください