👹
GASでTwitterフォロワーリストを取得したい
これは何
GASを使ってTwitterのフォロワーを取得、ユーザーネームとIDをスプレッドシートに全部ぶちこむ!!!!!!!!!!!!!!
をちょろっと仕事で依頼されたので備忘録程度にまとめています。
ハマった所
oAuthConfig
がサポート終了していて使えなかったのでgetOptions_()
自体が死んでましたカナシミ🥲
なんとGoogle App Scriptでサポート終了していたんですね(知らんかった)
最終形
全体の流れ
1. APIキー関連を入れます(取得方法はググってください)
var CONSUMER_KEY ="";
var CONSUMER_SECRET = "";
getOAuthURL()
をGASで実行します。
2. 認証用URLを発行する必要があるので// 認証用URL取得
function getOAuthURL() {
Logger.log(getService().authorize());
}
https://developer.twitter.com/ での設定方法などは
こういう記事がいくらでもあるので
callback url はこちらを参考に。
https://script.google.com/macros/d/[GASのスクリプトID]/usercallback
Twitter認証が通ったら後はスクリプトを実行するだけです!
apitest()
の実行
3. ※apitest とかいういかにもやってみた感じの名前にする必要はないです
必要なものは
- フォロワーリストを取得したいユーザーのID(ScreenName)
- スプレッドシートに入れるシートの名前
の2つ。
ここでIDを入れます。(harunonsystem
とかね)
// *アカウントのID入れる(@なしのやつ)*
var screenName = ""
事前にシートを作っておいて、ここでシートの名前を入れます。
// スプレッドシートへの書き込み準備
// *シートの名前を入れる*
var range= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("").getRange(1,1);
デフォルトのシート1
のままでよければこうなります
var range= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1").getRange(1,1);
あとはAPIの呼び出しをして
// API呼び出し最大10回(MAX1,000件)で強制終了
for(var page=1; page<=10; page++)
{
var url = "https://api.twitter.com/1.1/followers/list.json"+"?cursor=" + nextCursor +"&screen_name=" +screenName +"&count=200" ;
// TwitterからFriendsの情報を取得
var response = UrlFetchApp.fetch(url, { 'headers': { 'Authorization': 'Bearer ' + bearerTokens.access_token } });
// var resObj = Utilities.jsonParse(response.getContentText());
var resObj = JSON.parse(response.getContentText());
var users = resObj["users"];
nextCursor = resObj["next_cursor_str"];
Logger.log(nextCursor);
...
ループ回して1列目から順にScreenName、name, url, nextCursor, rownum, pageを入れています(ここは好きに入れると良いかと)
for(var i=0; i<users.length; i++) {
var anStatus = users[i];
var inscreenName = anStatus["screen_name"];
var name = anStatus["name"];
var rownum = i+1+(200*(page-1));
range.offset(rownum, 0).setValue(inscreenName);
range.offset(rownum, 1).setValue(name);
range.offset(rownum, 2).setValue("https://twitter.com/" + inscreenName);
range.offset(rownum, 3).setValue(nextCursor);
range.offset(rownum, 4).setValue(rownum);
range.offset(rownum, 5).setValue(page);
Logger.log(rownum)
}
-
nextCursor
はページネーションの役割になるので、直前に-1
を指定しています -
rownum
は取得しているフォロワー数が合っているかの確認のために入れてました。行番号+1になります。 -
page
はAPI呼び出しているときのページ数です。
-1
スタートを起点に0になるまでループを回します。
if(nextCursor === "0")
{
break;
}
あとはスプレッドシートに記載されるのを待つだけです。
途中、Rate limitに悩まされることがあった(取得するフォロワーが1万人以上いると特に💦)ので
Utilities.sleep(30000);
を挟んだりしています。
ってな感じで取得できました🎉🎉
もっと良い書き方があれば教えて下さい…><
Discussion