虎の穴開発室ブログ

虎の穴ラボ所属のエンジニアが書く技術ブログです

MENU

GAS+TwitterAPIでトレンドを取得してSlack通知する

こんにちは、虎の穴ラボの礒部です。

虎の穴ラボでは毎日15分雑談タイムを設けています。コミュニケーションの活性化を目的としているため、話題はなんでもいいのですが話題が無い時もあります。 自分は話題探しによくTwitterのトレンドを見るようにしています。最近だと「PUIPUIモルカー」などが話題でしたね!自分も今一番楽しみにしています。

今回は、TwitterAPIをGASで実行してトレンドを取得し、話題として投稿するbotを作成してみたいと思います!

前提として、Twitter Developerの申請が通り自作のアプリを作成してAPIが使える状態になっている必要があります。

GASでTwitter認証する

GASからTwitterAPIを呼び出すために認証が必要です。

今回は、Googleが公開している apps-script-oauth1 を使います。

github.com

リソース → ライブラリ → Add a library に、上記のライブラリキーである 1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s を入力して追加を押します。(ライブラリキーは誰が見ても同じなので、そのまま記述させて頂いています。)

f:id:toranoana-lab:20210209194917p:plain

バージョンは最新のものを指定しておきます。これでOAuth1が使えるため、同じくGoogleが公開している Twitter.gs から認証部分を参考にして記述します。

github.com

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 として定義したためこちらも設定しておきます。

ファイル → プロジェクトのプロパティ → スクリプトのプロパティ → 行の追加 で設定します。

f:id:toranoana-lab:20210209195738p:plain

次に、callBackUrlを作成してTwitterAppに登録します。GASのスクリプトIDだけ取得すれば問題ないです。

ファイル → プロジェクトのプロパティ → 情報 → スクリプトID の値をメモして以下URLを作成します。

https://script.google.com/macros/d/(GASのscriptID)/usercallback

作成したURLを、Twitter Developerから作成したAppの Callback URLs に設定しておきます。

これで準備ができました! auth() を実行対象に指定して、実行します。

実行完了後、表示 → ログ で認証URLが表示されている事を確認してください。

f:id:toranoana-lab:20210209203404p:plain

表示されたURLにアクセスし、OAuth認証画面が表示されれば成功です。認証する事で、TwitterAPIをGASから実行できるようになります。

f:id:toranoana-lab:20210209203530p:plain

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にセットして、雑談タイムの前に実行されるようにしておきます。

f:id:toranoana-lab:20210210190129p:plain

今回は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