DACエンジニアブログ:アドテクゑびす界

DACのエンジニアやマーケター、アナリストが執筆するアドテクの技術系ブログです。

GoogleAppsScriptとTreasureData REST APIを使ってサーバレスにTwitterのデータを取得

またまたTreasureDataネタです。 ただ、今回はクエリ系のネタではなく、GoogleAppsScriptとTreasureDataのREST APIを使ってTwitterのデータをTreasureDataに入れてみたので、その方法を紹介したいと思います。

はじめに

ログデータだけではなく、公開されているAPIからデータを取得したり、クロールしたデータをTreasureDataに入れたいな、なんて思ったことはありませんか? (そういったニーズがある前提で話を進めます)

そういった場合、1回だけデータを入れるのであれば、マニュアルで対応してしまえばいいですが、定期的にデータを取得したいとなると、サーバの準備をしなくてはいけなかったり、ちょっとめんどうです。 そんな課題に応えるべく、GoogleAppsScriptを使ってサーバレスにやってみました。

概要

GoogleAppsScirptの処理のおおまかな流れとしては、以下のようになっています。

  • TwitterAPIの認証&Search APIを利用してデータを取得
  • 取得したデータをTreasureDataのAPIを使ってデータ投入

 

上記GoogleAppsScirptをトリガー機能を使って定期実行

Twitter APIについて

いろいろサイトでTwitterAPIの使い方については解説されているので、細かい説明は割愛します。 TwitterAPIの認証と、SearchAPIを使ってTweetを取得するGoogleAppsScriptのコードは以下になります。 リクエストをかけるのにUrlFetchAppを利用しています。

[code lang="js"] function getTwitterAccessToken(){ var consumerKey = "(Your ConsumerKey)"; var consumerSecret = "(Your ConsumerSecret)"; var auth = Utilities.base64Encode(consumerKey + ':' + consumerSecret); var options = { "method": "POST", "contentType" : "application/x-www-form-urlencoded;charset=UTF-8", "headers" : { "Authorization" : "Basic " + auth }, "payload": { "grant_type" : "client_credentials" } }; var response = UrlFetchApp.fetch("https://api.twitter.com/oauth2/token", options); var responseJson = JSON.parse(response.getContentText()); return responseJson["access_token"]; }

function searchTweets(query){ var bearerToken = getTwitterAccessToken(); var options = { "method": "GET", "contentType" : "application/x-www-form-urlencoded;charset=UTF-8", "headers" : { "Authorization" : "Bearer " + bearerToken } }; var params = []; params.push('q=' + encodeURIComponent(query)); params.push('lang=ja'); var response = UrlFetchApp.fetch("https://api.twitter.com/1.1/search/tweets.json?" + params.join("&"), options); return JSON.parse(response.getContentText()); } [/code]

TreasureData REST APIについて

公式ドキュメントはこちらになります。 https://docs.treasuredata.com/articles/rest-api-import

単純に入れたいデータをJSONでPOSTするだけです。 以下がGoogleAppsScriptのコードになります。TreasureDateのAPIキーが必要になります。

[code lang="js"] function postTd(data, database, table) { var payload = JSON.stringify(data); var options = { "method": "POST", "contentType" : "application/json", "headers" : { "X-TD-Write-Key" : "(Your Write API Key)" }, "payload": payload }; var response = UrlFetchApp.fetch("http://in.treasuredata.com//postback/v3/event/" + database + "/" + table, options); } [/code]

TweetデータをTreasureDataにPOST

TwitterAPIからデータを取得して、TreasureDataにPOSTするのが、以下のコードになります。 基本的には取得したTweetのJSONをそのままPOSTしているだけですが、Tweetのcreated_atをTreasureDataのtimeカラムとして使えるようにしてます。

[code lang="js"] function postTweet2Td(){ var query = '恵比寿'; var tweets = searchTweets(query); tweets.statuses.forEach(function(tweet){ tweet['time'] = (Date.parse(tweet['created_at']) / 1000).toString(); postTd(tweet, '(Your Database)', '(Your Table)'); }) } [/code]

実際にTreasureData上で、データを見てみましょう。

td_twitter

ちゃんとデータが入ってますね。 ネストしているデータはそのままJSONの文字列になってしまってますが。

定期的に実行する設定

AppsScriptの[リソース] > [トリガー]から今回のスクリプトのトリガーを設定できます。 以下のキャプチャのように「新しいトリガー」からトリガーを追加、実行するfunctionを選択、イベントとして「時間主導型」を選択することで、cronのように定期的に実行ができます。 gas_trigger

最後に

今回はTwitterのSearch APIのパラメータとして言語しか設定していませんでしたが、他にもオプションは多数あるので、適宜変更してもらえればと。Tweeter API GET search/tweets また、APIの制限もあるので、注意しましょう。

次回は、GoogleAppsScriptからクエリを投げたり、テーブル一覧を取得したり、なんてこともやってみたいと思います。