Google Apps ScriptでOAuthConfigのサポートが終了してTwitter botが危険そうだったので変更

Google Apps Script でこれまでTwitterのボットを作ってたんだけど、OAuthConfig のサポートが2015年4月20日に終了するってのを見つけて焦って変更したメモ。

これまでGoogle Apps ScriptでTwitter APIを利用する場合、OAuth認証に「OAuthConfig」というクラスを使うのが一般的だった。
でも先日見てみると以下の一文が。

Warning: Google’s OAuth 1.0 support was deprecated in 2012 and is scheduled to be shut down on April 20, 2015. Scripts using OAuthConfig to connect to a Google API should instead use the OAuth2 for Apps Script library.

英語はあまり得意でないのでGoogleで翻訳すると、

警告:GoogleのOAuthの1.0のサポートは2012年に廃止されましたし、OAuthConfigを使用して2015年のスクリプトではなくAppsスクリプトライブラリのOAuth2を使用する必要があり、GoogleのAPIに接続するために、4月20日にシャットダウンされる予定です。

とのこと。
確かに OAuthConfig を使用したプログラムを動かすと警告が出てる。
まずいなー自作せんといかんかなーと思っていろいろと調べてみたところ、Googleが用意したOAuth1用ライブラリ(GitHub)を使うのが良さそうな感じだったので、手順をまとめておく。

Step1. プロジェクトの作成

プロジェクトといっても単にGoogleドライブにファイルを作るだけ。
スプレッドシートを新規作成して上部メニュー「ツール」→「スクリプトエディタ」にいくか、またはスクリプトファイル自体を新規作成してもOK。
ログの記録とかにスプレッドシートが使えるので、できれば前者がいいと思う。

Step2. OAuthライブラリの取得

スクリプトエディタを開き、上部メニュー「リソース」→「ライブラリ…」をクリック。
開いたダイアログにある「ライブラリを検索」の入力欄に以下の文字を入力して検索(「選択」ボタン)する。 Mb2Vpd5nfD3Pz-_a-39Q4VfxhMjh3Sh48
そうすると、以下の図のようにOAuth1用ライブラリが出るので、最新バージョンを選択して「保存」する。(Google製のライブラリなのでご安心を)

ライブラリ読み込みダイアログ

これでとりあえずはOAuth1ライブラリが使えるようになった。
ちなみにこれらの手順は 公式GitHubのREADME に書いてある。

Step3. Twitter API用スクリプトの作成

公式GitHubのREADME の通りに進めて問題ないけど、ここらへんは以下のスクリプトを自作した。
Gistにあり〼。
これを「twitter.gs」等のファイル名でプロジェクトエディタに新規作成&コピペする。

Step4. Twitterアプリ側の設定

OAuth後のコールバック先URLをこれまでと変更する必要がある。
Twitterアプリの管理ページで、Callback URLに以下のようなURLを設定する。
https://script.google.com/macros/d/[プロジェクト キー]/usercallback

コールバックURLの入力欄

プロジェクト キー」というのは、Google Apps Scriptのプロジェクトに付いているキー。
スクリプトエディタの上部メニュー「ファイル」→「プロジェクトのプロパティ」をクリックすると確認できる。
このキーは前述の自作スクリプト内でも使うので、ついでにコピペしておく。

プロジェクト キーの確認

Step5. OAuth認証する

自作スクリプトに、

  • プロジェクト キー
  • Twitterの Consumer Key
  • Twitterの Consumer Secre

を記載したら、初回のOAuth認証用にいくつかの関数を用意しているので、「twitterAuthorizeUrl」というのを実行する。

OAuth用関数の実行

画面には何も出ないけど、上部メニュー「表示」→「ログ」を開くと承認用のURLが出力されている。 これをコピーしてブラウザでアクセスすると、Twitterのアプリ承認画面に行くので承認する。

OAuth認証用URLをコピーする

ここまでの手順が正しく設定されていれば、承認後は画面が切り替わって「認証に成功しました」という文字が出る(ハズ)。

Step6. テストする

これでOAuth認証が通ったと思うのでボットが作成できる。
ツイッターのAPI自体は公式 REST API ドキュメントを参照のこと。 簡単に自作スクリプトの説明をしておくと、こんな感じ。

///// 基本的な使用方法 /////

// 以下は api.twitter.com/1.1/statuses/update.json を実行する例

var data = {
    "status": "ツイート文"
};

var res = Twitter.api("statuses/update", data);

/*
第一引数:APIのパス(api.twitter.com/1.1/~.jsonの間のパス)
第二引数:パラメータ(JSON形式)
*/

上記の他にいくつか簡易化した関数を用意した。

// ツイートを検索
var res = Twitter.search("検索文字");

// 自分のタイムラインを取得
var res = Twitter.tl();

// 特定ユーザーのタイムラインを取得
var res = Twitter.usertl("スクリーンネーム");

// ツイートする
var res = Twitter.tweet("ツイート文");

// トレンドの取得(デフォルトは日本全国対象。引数にWOEID指定でその地域のトレンド)
var res = Twitter.trends();

// トレンドのワードのみ取得(引数は上と同じ)
var res = Twitter.trendWords();

OAuthConfigの廃止はけっこう前から警告が出てたみたいだけど、対策しているような情報はググってもほとんど見当たらなかったので、Google Apps Scriptでボット作ってる人はほとんどいない模様w
以前 Twitterの自分の過去ツイートをGoogleドライブに自動バックアップ(&公開)する方法 という投稿を書いたけど、こちらもOAuthを使っていて不安。
提供元には特に何か対策してるっぽいことは書いてなさそう・・・動いてるからまあいいけど。

ついでに OAuth2でのTwitter API(Application-only authentication) も少し見てみたんだけど、わりと簡単なプログラムでデータを取得できるみたい。
接続が簡単なかわりに更新系のAPIが利用できなかったりするけど、API使用階数の制限が少し緩和されるっぽい・・・?

comments powered by Disqus