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を利用しています。

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());
}

TreasureData REST APIについて

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

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

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);
}

TweetデータをTreasureDataにPOST

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

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)');
  })
}

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

td_twitter

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

定期的に実行する設定

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

最後に

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

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


DACエンジニア採用情報

  関連記事

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

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

heatmap
巨大データベースのスケールアップと引越作業

はじめに ビッグデータ解析部でオーディエンスデータ解析基盤の開発、運用を担当している Mike です。 弊社ではインターネット広告配信ログをはじめとする「ビッグデータ」と呼ぶにふさわしいデータボリュームを扱うオーディエンスデータ解析基盤を構築しています。今秋、そのうちの1構成要素である、データサイズ …

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

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

toadstool
【Hivemall入門】RandomForestで毒キノコ推定モデルを作る

こんにちは。俺やで。 今回も前回から間が空いてしましたが、ビッグデータに対応したHiveで使える機械学習ライブラリ、 Hivemallの使い方について、書かせていただければと思います。 なお今回はQiitaのTreasure Data / Advent Calender 2015の12/3日分として …

PPG_anteli-kunatokei_TP_V
Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスを活用しよう

DACではTreasure Dataを利用して各種データの蓄積や集計を行っています。Treasure Dataは時系列のデータを扱うのに特にすぐれたアーキテクチャなのですが、セグメントIDとユーザーIDの組み合わせといった大量のマスタデータを利用した計算にも利用することもできます。そのような場合にt …

image1
トレジャーデータの新機能「Data Connector」でクライアントレスなビッグデータ連携を実現する

トレジャーデータは、スキーマレスな大量のデータ(ビッグデータ)をパブリッククラウド上に保管して集計や抽出をするためのサービスなのですが、他システムからの連携データをトレジャーデータのテーブルに格納するまでが一苦労でした。 他システムとの外部連携を行う場合、一般的にローカルサーバー内のストレージを外部 …

chain
PyStanによるはじめてのマルコフ連鎖モンテカルロ法

はじめに こんにちは。システム開発部の中村です。 社内で行っている『データ解析のための統計モデリング入門』(所謂緑本)の輪読会に参加した所、 大変わかりやすい本だったものの、Macユーザには悲しい事に実装サンプルがWinBUGSだったため、 9章の一般化線形モデルのベイズ推定によるアプローチをPyt …

Screen Shot 2014-11-17 at 9.33.19 PM
Amazon ElastiCache/Redisのパフォーマンス確認

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

tf
ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …

no image
Treasure Dataで長期間の集計

プラットフォーム・ワン T氏です。プラットフォーム・ワンでは、DSPのMarketOneとSSPのYIELD ONE提供しています。 MarketOneやYIELD ONEのログを調査する場合にTreasure Dataを使うことがあります。Treasure Dataでは大量のデータに対してHive …