GoogleAppsScript から Twitter に投稿する


GAS から Twitter API 使ってツイートしたかったのでいろいろ調べて試してたんですが、古い情報だらけで非常に苦しんだのでここに現時点での成功例を記しておきます。
※ Twitter 側が仕様変更しても私がここを更新するかどうかはわかりません。

API 使って Tweet したいんですけど

Twitter Developers に登録しましょう。
話はそれからだ

多少面倒くさい登録申請が承認されたら Twitter Developers 側でアプリを作ります。

項目 設定値
App name お好きに
Application description
Website URL
Enabel Sign in with Twitter
Callback URLs あとで設定する
App usage お好きに
その他 設定不要

※ 以前は Callback URL に何を設定してもよくてノーチェックでスルーだったらしいんですが、最近(?)有効なURLでないと認証通らなくなったようなのでちゃんと設定しないとダメです。
  やり方調べてると古い方法が大量にヒットするんですよね...。

ここまでできたら GoogleAppsScript でスクリプトを書きます。

OAuth 認証どうやるの

OAuth1 という GAS 用ライブラリがあります。
これを使いましょう。

使わずとも自分で Twitter 公式ドキュメントの ココ で説明されてる通りにひとつずつ認証用URLにリクエスト投げていけば認証できるんですが、Authentication Header 作りこむのが非常に面倒くさいのでライブラリに任せてしまいます。

Google Apps Script (GAS) でTwitterへ投稿するだけの機能を実装してみる
Google Apps ScriptでTwitter APIを叩く
とか参考にしつつ。

こうなりました。

var scriptProperties = PropertiesService.getScriptProperties();
var CONSUMER_KEY = scriptProperties.getProperty('TWITTER_CONSUMER_KEY');
var CONSUMER_SECRET = scriptProperties.getProperty('TWITTER_CONSUMER_SECRET');

function getTwitterService() {
  return OAuth1.createService('Twitter')
    .setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
    .setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
    .setAuthorizationUrl('https://api.twitter.com/oauth/authorize')
    .setConsumerKey(CONSUMER_KEY)
    .setConsumerSecret(CONSUMER_SECRET)
    .setCallbackFunction('authCallback')
    .setAccessToken('access token', 'access token secret')
    .setPropertyStore(PropertiesService.getUserProperties());
};

TWITTER_CONSUMER_KEY とか TWITTER_CONSUMER_SECRET とかは、Twitter Developers 側で作成したアプリから取ってきてスクリプトのプロパティに追加しておきます。


で、authCallback はこうです。

function authCallback(request) {
  var twitterService = getTwitterService();
  var isAuthorized = twitterService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success!');
  } else {
    return HtmlService.createHtmlOutput('Denied.');
  }
}

コールバックの設定

こんなものを書いて実行します。

function logCallbackUrl() {
  var twitterService = getTwitterService();
  Logger.log(twitterService.getCallbackUrl());
}

するとログにURLが出力されますのでそのURLをコピーします。

Twitter App の Callbak URLs のところにペタり。

ここまでできれば認証通せます!

認証する

GAS にこんなのを追加して実行します。

function getAuthorizationURL() {
  const twitterService = getTwitterService();
  const authorizationUrl = twitterService.authorize();
  Logger.log(authorizationUrl);
}

またログに URL が出てきますので、今度はその URL にアクセスします。

認証しましょう!

ようやくツイートできるよ

GAS にツイート処理を書きましょう。

function tweet(text) {
  const twitterService = getTwitterService();
  const response = twitterService.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: {status: text},
  });
  Logger.log(response); // ログはお好みで
}

この tweet につぶやきたい文字列を渡せばOK。
改行は普通に \n でできるようです。

おわりに

古い情報をどうにかしてほしい。