みぃちゃんの手のひらの上

峯岸みなみさんを追っかけながら、いろいろしていく話。

Google Apps ScriptとTwitter APIで峯岸みなみさんのTwitterフォロワー数の推移を測定・分析する下地作り

久しぶりにコードを書きたくなったのと、何かしら自分なりに峯岸さんにお役立ちできればなというモチベーションで、以下のようなことに取り組んだ。 

やりたいこと

①定期的にフォロワー数を取得する
②データを蓄積する
③蓄積したデータを可視化する

 

やったこと

Twitter APIを利用する
Google Apps ScriptでGoogleスプレッドシートに追記する
③今回は対象外

③を対象外としたのは、②ができていればどうにでもなるため

 

実現方法

  1. Twitter APIでユーザ情報をJSONで取得する
  2. Googleスプレッドシートに取得時のタイムスタンプとjsonを格納する
  3. 格納する際は、最新のデータが一番上に来るようにする

成果物の一例

データを蓄積しているGoogleスプレッドシートと、フォロワー数の増減のグラフなどがこのように表示できる。
なお、これらはGoogleスプレッドシートの「ウェブに公開」で「埋め込み」 の機能を使って貼り付けている。そのため、データが更新されれば、これらも最新のものになっているはずである。(この記事を書いているのは2019年1月6日である)

 

Why Google Apps Script?

理由は大きく2つ。

  1. 定期的に実行する環境が無償で手に入るため。
  2. 今後、スクレイピングしてデータを蓄積するなど様々な方面でGoogle Apps Scriptの利用シーンを増やせそうなため。


最初はPythonで書いていたため、AWSの利用などを検討していた。

  • EC2を立てる?
  • Amazon Lambdaを使ってみる?
  • それともAmazon Elastic Beanstalkを使ってみる?

など技術的に面白そうなことも考えて居たが、まずはスモールスタートということで、無償で実現できる方法を選択した。

今回は以下のような前提のため、Google Apps Scriptで十分と判断した。

  • 複雑な処理はしない(APIを叩いた結果を書き込むだけ)
  • トランザクション量は多くない(最短15分に1回)

 

Why Googleスプレッドシート

Google Apps Scriptと同じ理由。
MongoDBやInfluxDBなども利用してみたかったが、まずはスモールスタートで実現しやすい方法を選択した。

今回の実施要項

Twitter APIでユーザ情報をJSONで取得する

使用したのは、このAPIである。

GET users/show — Twitter Developers

コードは下記。screen_name(TwitterのID)を引数にAPIを叩いて、JSONを返す。

function getUsersShow(screen_name) {
  var screen_name = typeof screen_name == 'undefined' ?  'chan__31' : screen_name;
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/users/show.json?screen_name='+screen_name);
  return response
}

 

なお、この前段階で、Twitter APIの認証を通しておく必要がある。
Google Apps ScriptでTwitter APIを叩く際に、OAuth認証で少し嵌まった。
下記の記事が参考になる。Callbackの設定のところでつまづいていた。

GASでTwitterにツイートする(GASの準備偏) | 三十路街道 ボンバィエ

https://script.google.com/macros/d/[スクリプトID]/usercallback
とすると、今回の場合、うまくいった。


Googleスプレッドシートに取得時のタイムスタンプとjsonを格納する

格納する際は、最新のデータが一番上に来るようにする

 

function insertSpreadsheet(datetime, response){
  var spreadsheet = SpreadsheetApp.openById('スプレッドシートのID');
  var sheet = spreadsheet.getSheetByName('シートの名前');

  //先頭行を挿入し、データセット
  sheet.insertRows(2);
  sheet.getRange("A2").setValue(datetime);
  sheet.getRange("B2").setValue(response);
  
  json = JSON.parse(response)
  sheet.getRange("C2").setValue(json['id']); //ユーザ固有ID
  sheet.getRange("D2").setValue(json['name']);//ユーザ名
  sheet.getRange("E2").setValue(json['statuses_count']);//ツイート数
  sheet.getRange("F2").setValue(json['friends_count']);  //フォロー数
  sheet.getRange("G2").setValue(json['followers_count']);  //フォロワー数
  sheet.getRange("H2").setValue(json['listed_count']);//被リスト数
  sheet.getRange("I2").setValue(json['favourites_count']);//ふぁぼ数
  sheet.getRange("J2").setValue(json['status']['created_at']);//最新の呟きの時刻
  sheet.getRange("K2").setValue(json['status']['text']);//最新の呟きの内容
}

function main(){
  var datetime = Utilities.formatDate(new Date(),"JST","yyyy/MM/dd HH:mm:ss");
  response = getUsersShow('chan__31')
  insertSpreadsheet(datetime, response) 
}


たったこれだけで、できてしまう。Google Apps Scriptの便利さたるや、恐るべし。
初歩的なことではあるが、HH(24時間表記)とhh(12時間表記)を間違えていた。

 

できるようになったこと

TwitterAPIの使い方が分かった(初体験)
Google Apps Scriptを触れるようになった(初体験)
JavaScriptで簡単なコードはかけるようになった

これからやりたいこと

  1. 今回取得するデータを用いた分析(テレビでの露出と関係はあるか?ツイート数は関係あるか?など)
  2. 他のメンバーも取得して、フォロワー数推移の比較をしたい(すぐできる)
  3. リプライ、#31mail、#31roomなどのリアクションも可視化できるようにしたい
  4. インスタグラムでも同じことを実施したい(InstagramAPIの勉強が必要)

他のメンバーは誰と比較すれば良いだろうか。
指原莉乃さん、柏木由紀さんなどの大御所のメンバーと、これから伸び盛りの矢作萌夏さんなどだろうか。

3のデータも蓄積しはじめたら、いろいろな分析ができるようになり面白そうだなと思っている。一気にやりすぎると疲れてしまうので、ひとまず今回は、ここまでにしよう。