こんにちは、虎の穴ラボの礒部です。
虎の穴ラボでは毎日15分雑談タイムを設けています。コミュニケーションの活性化を目的としているため、話題はなんでもいいのですが話題が無い時もあります。 自分は話題探しによくTwitterのトレンドを見るようにしています。最近だと「PUIPUIモルカー」などが話題でしたね!自分も今一番楽しみにしています。
今回は、TwitterAPIをGASで実行してトレンドを取得し、話題として投稿するbotを作成してみたいと思います!
前提として、Twitter Developerの申請が通り自作のアプリを作成してAPIが使える状態になっている必要があります。
GASでTwitter認証する
GASからTwitterAPIを呼び出すために認証が必要です。
今回は、Googleが公開している apps-script-oauth1
を使います。
リソース → ライブラリ → Add a library に、上記のライブラリキーである 1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s
を入力して追加を押します。(ライブラリキーは誰が見ても同じなので、そのまま記述させて頂いています。)
バージョンは最新のものを指定しておきます。これでOAuth1が使えるため、同じくGoogleが公開している Twitter.gs
から認証部分を参考にして記述します。
const scriptProperties = PropertiesService.getScriptProperties(); const CONSUMER_KEY = scriptProperties.getProperty('CONSUMER_KEY'); const CONSUMER_SECRET = scriptProperties.getProperty('CONSUMER_SECRET'); function getService() { 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') .setCache(CacheService.getUserCache()) .setPropertyStore(PropertiesService.getUserProperties()); } function authCallback(request) { let service = getService(); let authorized = service.handleCallback(request); if (authorized) { return HtmlService.createHtmlOutput('Success!'); } else { return HtmlService.createHtmlOutput('Denied'); } } function auth() { let service = getService(); let authorizationUrl = service.authorize(); Logger.log('Open the following URL and re-run the script: %s', authorizationUrl); }
TwitterのAPIキーをプロパティの CONSUMER_KEY
CONSUMER_SECRET
として定義したためこちらも設定しておきます。
ファイル → プロジェクトのプロパティ → スクリプトのプロパティ → 行の追加 で設定します。
次に、callBackUrlを作成してTwitterAppに登録します。GASのスクリプトIDだけ取得すれば問題ないです。
ファイル → プロジェクトのプロパティ → 情報 → スクリプトID の値をメモして以下URLを作成します。
https://script.google.com/macros/d/(GASのscriptID)/usercallback
作成したURLを、Twitter Developerから作成したAppの Callback URLs
に設定しておきます。
これで準備ができました! auth()
を実行対象に指定して、実行します。
実行完了後、表示 → ログ で認証URLが表示されている事を確認してください。
表示されたURLにアクセスし、OAuth認証画面が表示されれば成功です。認証する事で、TwitterAPIをGASから実行できるようになります。
Twitterトレンドを取得してSlack通知する
TwitterAPIをGASから実行できるようになったので、先ほどのスクリプトに追記していきます。通知先はSlackにします。
const scriptProperties = PropertiesService.getScriptProperties(); const CONSUMER_KEY = scriptProperties.getProperty('CONSUMER_KEY'); const CONSUMER_SECRET = scriptProperties.getProperty('CONSUMER_SECRET'); const SLACK_POST_URL = scriptProperties.getProperty('SLACK_POST_URL'); function getTrends() { let service = getService(); if (service.hasAccess()) { // id=1118370 を指定することで、東京のトレンドを取得 let url = 'https://api.twitter.com/1.1/trends/place.json?id=1118370'; let response = service.fetch(url, { method: 'get' }); let result = JSON.parse(response.getContentText()); // ツイートの多いTOP5に絞り込む let trends = result[0].trends; trends.sort(function(a,b){ if (a.tweet_volume < b.tweet_volume) return 1; if (a.tweet_volume > b.tweet_volume) return -1; return 0; }); let topTrends = trends.slice(0,5); let text = "今日のトレンドだよ!話題に困ったら見てみてね\n```"; for (let no in topTrends) { let name = trends[no].name let tweet_volume = trends[no].tweet_volume text += ++no + ":" + name + " ツイート数:" + tweet_volume + "\n" } text += "```"; let userName = '今日のトレンドを通知するメイドちゃん!'; postToSlack(userName, text); } else { auth(service); } } function postToSlack(userName, text) { let payload = JSON.stringify({ "username" : userName, "text" : text }); let options = { "method" : "post", "contentType" : "application/json", "payload" : payload }; UrlFetchApp.fetch(SLACK_POST_URL, options); } function getService() { // 「GASでTwitter認証する」で示したコードと同じため省略 } function authCallback(request) { // 「GASでTwitter認証する」で示したコードと同じため省略 } function auth(service) { // 「GASでTwitter認証する」で示したコードと同じため省略 }
SlackのWebhookURLを、TwitterのAPIキーと同じように設定しておきます。
あとは、 getTrends() を実行してトレンドがSlackに通知されれば完成です!Triggerにセットして、雑談タイムの前に実行されるようにしておきます。
今回はGASでTwitterAPIを実行してみました。Google公式のOAuthコードがあり、とても導入しやすいので是非試してみてください。
TwitterAPIの申請が通ったばかりで、まだ全然使えていないので他にも色々試してみたいです。
P.S.
直近のイベント情報
■2/19(金)19:30~ とらのあなWebデザイナー・UIデザイナー採用説明会 yumenosora.connpass.com
■2/24(水)19:30~ オタクが最新技術を追うLTイベント#21 yumenosora.connpass.com
採用情報
■募集職種
yumenosora.co.jp
カジュアル面談も随時開催中です
■お申し込みはこちら!
yumenosora.connpass.com
■ToraLab.fmスタートしました!
メンバーによるPodcastを配信中!
是非スキマ時間に聞いて頂けると嬉しいです。
anchor.fm
■Twitterもフォローしてくださいね!
ツイッターでも随時情報発信をしています
twitter.com