ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

GASで指定TwitterユーザIDのfollowing一覧をスプレッドシートに書きだす。

Google Apps Script 勉強会 #1行ってきた
で書いたネタなんですが、あのときは、Twitter APIの使い方が分かっておらず、
最近フォローした100人しか取れませんでした。
が、その後色々調べているうちに、分かったので改良してみました。

ソース

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [ {name: "Twitterフレンズ一覧", functionName: "getTwitterFriends"}];
  ss.addMenu("Twitter", menuEntries);
}

function getTwitterFriends() {
  // ユーザIDを入力
  var inScreenName = Browser.inputBox("ユーザIDを入力してください。");
  if(!inScreenName) {
    return;
  }

  // スプレッドシートへの書き込み準備
  var range= SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1, 1);

  // スプレッドのクリア
  range.offset(1, 0, 1000, 5).clear();
    
  // 次ページ取得用カーソル
  var nextCursor = "-1";
    
  // API呼び出し最大10回(MAX1,000件)で強制終了
  for(var page=1; page<=10; page++)
  {
    var url = "http://api.twitter.com/1/statuses/friends/" + inScreenName + ".json?cursor=" + nextCursor;
  
    // TwitterからFriendsの情報を取得
    var response = UrlFetchApp.fetch(encodeURI(url), getOptions_());
    var resObj = Utilities.jsonParse(response.getContentText());
    var users = resObj["users"];
    nextCursor = resObj["next_cursor_str"];
      
    for(var i=0; i<users.length; i++) {
      var anStatus = users[i];
      var screenName = anStatus["screen_name"];
      var name = anStatus["name"];
      var friendsCount = anStatus["friends_count"];
      var followersCount = anStatus["followers_count"];
      var tweetsCount = anStatus["statuses_count"];
    
      var rownum = i+1+(100*(page-1));
      range.offset(rownum, 0).setValue(name);
      range.offset(rownum, 1).setValue(friendsCount);
      range.offset(rownum, 2).setValue(followersCount);
      range.offset(rownum, 3).setValue(tweetsCount);
      range.offset(rownum, 4).setValue("http://twitter.com/#!/" + screenName);
    }

    if(nextCursor === "0")
    {
      break;
    }
  }
      
  Browser.msgBox("完了しました。");
}

/**
 * UrlFetch用のオプションを指定します。
 */
function getOptions_() {
    // スクリプトプロパティを取得
    var CONSUMER_KEY = ScriptProperties.getProperty("CONSUMER_KEY");
    var CONSUMER_SECRET = ScriptProperties.getProperty("CONSUMER_SECRET");
  
    var oAuthServiceName = "twitter";
  
    // OAuthServiceConfigの設定
    var oAuthConfig = UrlFetchApp.addOAuthService(oAuthServiceName);
    oAuthConfig.setAccessTokenUrl("http://twitter.com/oauth/access_token");
    oAuthConfig.setRequestTokenUrl("http://twitter.com/oauth/request_token");
    oAuthConfig.setAuthorizationUrl("http://twitter.com/oauth/authorize");
    oAuthConfig.setConsumerKey(CONSUMER_KEY);
    oAuthConfig.setConsumerSecret(CONSUMER_SECRET);
  
    // UrlFetchAppに渡すオプションの設定
    var options = {
        "method" : "get",
        "oAuthServiceName" : oAuthServiceName,
        "oAuthUseToken" : "always",
  };
  
  return options;
}

ポイントは、
http://api.twitter.com/1/statuses/friends/taka_2.json
でfollowing一覧が取れるのですが、
ここにcursorパラメータを付けているところです。


最初は-1を渡しておいて、
二回目(二ページ目)以降は、レスポンスの"next_cursor_str"
を渡してあげると、ページング処理が行えます。
"next_cursor"だと、なんかズレたのが返ってきます。。


【公開用】GASからTwitter改変
【公開用】GASからTwitter改変 コピー用