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からクエリを投げたり、テーブル一覧を取得したり、なんてこともやってみたいと思います。


DACエンジニア採用情報

  関連記事

Tableau 9.2で郵便番号の特性を地図で可視化してみる

Tableau 9.2から郵便番号地図が表示可能に 弊社ではデータ分析ツールのTableauを利用しています。オーディエンスデータの重複を分析したり、デモグラフィック属性を表示したりするなどデータの可視化に役立ちますTableauでは9.2から日本の郵便番号を用いて地図を可視化できるようになりました …

【入門編】TreasureDataでWEBログ分析をしてみた

この記事は Treasure Data Advent Calendar 2015 – Qiita の24日目の記事です。 こんにちは。 今回はWEBログの集計や解析をする際によく使うHiveQLのクエリと、UDF(User Defined Functions)について実際の集計クエリを使 …

【入門編】TreasureDataでサイトのアクセス解析をしてみた~第2弾!~

今回もやります、集計クエリ解説シリーズ第2弾!! 前回は、Webログからセッション単位のデータを作成するだけでした。 第2弾では作成したテーブルを元に、より実践的なアクセス解析、サイト分析で使えるHiveQLについて、実際に使用したクエリとともに解説していきたいと思います。 今回やったこと 利用した …

Tableauを利用してMySQLとRedshiftのクロスDBジョインを実現する

はじめに RedshiftやTreasureDataなどのデータマート用のDBにはID単位の解析結果が格納され、ローカルのMySQLにはIDに紐づいた名称マスタが管理されている構成の場合、データマートのクロス集計結果に対してIDに紐づいた名称を付与したいことがあります。 データマート用に用意したDB …

Amazon ElastiCache/Redisのパフォーマンス確認

はじめに こんにちは、AudienceOne開発部です。AudienceOne開発部ではいわゆるビッグデータと呼ばれる大量のデータをアドホックあるいは定常的に日々ETLだの集合演算だのをする一方で、様々な大規模データ処理ソリューションを継続的に検証しております。 本記事は、その中でもユーザが保持して …

D3.jsとその活用事例について

D3.jsとは? D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。 ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。 …

Treasure Dataの新機能(Data Tank)をAudienceOneのレポート機能で利用した話

Data Tankとは? Treasure Dataの新機能でTreasure Dataのプラットフォーム上に構築されたデータマートです。 Tableau等のBIツールとの接続を想定されており、AWSでいうところのRedshift的なものだと考えるとわかりやすいかと。 Data TankはPostg …

【超入門】Hivemallで機械学習 〜Treasure Dataでロジスティック回帰編〜

こんにちは。俺やで。 ビッグデータとかデータサイエンティストとかいう言葉が未だブームですね。 (「データサイエンティスト」は下火か。) ビッグデータ扱えるエンジニアも、 統計解析ができるアナリストも、 どっちもできるスーパーマンも世の中にはたくさんいますが、 ビッグデータも統計解析も扱えるインフラは …

fastavroとjqでAVRO形式のファイルからデータを取得しよう

AVRO形式のファイルを取り扱いたい AVROとはApacheプロジェクトのひとつとして開発されているデータ交換形式です。 コンパクトなバイナリで高速なシリアライズ・デシリアライズが行えるため、サーバーログなどに利用されています。 弊社内での一部システムのログデータにも利用されているのですが、専用の …

Google BigQuery / Tableauを使ってみた

TableauからGoogle BigQueryへ接続してみました。 弊社で利用しているTreasureDataからデータ出力してBigQueryへロード、Tableauから接続まで実際に行った手順について記載します。 TreasureDataからAmazonS3へデータ出力 まず、データが蓄積され …