【Twitter4J】フォロー(フレンド)とフォロワーの片思い・片思われを抽出する方法
今日は大型連休(最近はゴールデンウィークと呼ばない?)の前半3日の最後でしたね。
てぃーは今日は予定はなかったのでゴロゴロ&プログラミングの勉強をしていました。
勉強と書けばかっこいいですが大事な創作活動の下地にあたるものですからじっくりと基礎を抑えていきたいものです。
昨年の大型連休では日経ソフトウエアを使ってiPhoneアプリのマインスイーパの勉強をしましたが、今年はTwitter4Jを使ってツイッターの分析を行うアプリの基礎を築きたいと思います。
(Twitter4J自体は2012/04/04(水)にインストールはしていました。)
Javaプログラミングなのでウィンドウズ、マックを問わずできますね。
勉強したことを書いていきます。
さて、今回はフォロー(フレンド)とフォロワーの片思い・片思われを抽出する方法についてです。
つまりフォローのみしている人、フォローのみされている人を挙げるものです。
次のようにします。
(ネットの情報(特に次のページ)を参考にさせていただきました。ありがとうございます。
→Twitter4JでフォロワーのIDを取得する(最大175万人) - コードつれづれ)
import java.io.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import twitter4j.*;
public class TwitterFriendProfs {
private static int ID_COUNT_PER_REQUEST = 5000;
//自動的に認証してくれる
//(バージョン2.2.4以降はgetInstance()ではなくgetSingleton()を推奨)
new TwitterStreamFactory();
Twitter twitter = TwitterFactory.getSingleton();
public static void main(String[] args) throws TwitterException {
try {
// 取得対象のユーザ名
String targetScreenName = "teapipin";
// カーソル初期値。現状のt4jのjavadocは 1オリジンだが、Twitter API Documentでは -1オリジンなのでそちらに準拠
long cursor = -1L;
// 一時的にIDを格納するオブジェクト
IDs ids;
IDs idFs;
// IDを全てストックするオブジェクト
//HashSetを用いることにする
HashSet<Long> followerIDs = new HashSet();
HashSet<Long> friendIDs = new HashSet();
List<Long> Kataomoi= new ArrayList();
List<Long> Kataomoware= new ArrayList();
long page = 1L;
//フォロワーの取得
do {
// 状況表示
System.out.println(String.format("%dページ目取得中。(%d <= %d)", page, ID_COUNT_PER_REQUEST * (page - 1),
ID_COUNT_PER_REQUEST * page++));
ids = twitter.getFollowersIDs(targetScreenName, cursor);
// 取得したIDをストックする
for (long id : ids.getIDs()) {
followerIDs.add(id);
}
// 次のページへのカーソル取得。ない場合は0のようだが、念のためループ条件はhasNextで見る
cursor = ids.getNextCursor();
} while (ids.hasNext());
//クリア
page = 1L;
cursor = -1L;
//フレンドの取得
do {
// 状況表示
System.out.println(String.format("%dページ目取得中。。(%d <= %d)", page, ID_COUNT_PER_REQUEST * (page - 1),
ID_COUNT_PER_REQUEST * page++));
idFs = twitter.getFriendsIDs(targetScreenName, cursor);
// 取得したIDをストックする
for (long idF : idFs.getIDs()) {
friendIDs.add(idF);
}
// 次のページへのカーソル取得。ない場合は0のようだが、念のためループ条件はhasNextで見る
cursor = idFs.getNextCursor();
} while (idFs.hasNext());
//一致しないものを抽出
//反復子iteratorによる取得
Iterator<Long> ite = followerIDs.iterator();
Iterator<Long> iteF = friendIDs.iterator();
//1.片思われの場合
while(ite.hasNext()) { //ループ
Long obj = ite.next(); //該当オブジェクト取得
//存在しない場合は片思われ
if (friendIDs.contains(obj) == false) {
Kataomoware.add(obj);
}
}
//2.片思いの場合
while(iteF.hasNext()) { //ループ
Long objF = iteF.next(); //該当オブジェクト取得
//存在しない場合は片思い
if (followerIDs.contains(objF) == false) {
Kataomoi.add(objF);
}
}
// ファイル出力
//片思い
output(String.format("C:\\Kataomoi_"+targetScreenName+".csv", targetScreenName), Kataomoi);
//片思われ
output(String.format("C:\\Kataomoware_"+targetScreenName+".csv", targetScreenName), Kataomoware);
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
private static void output(String fileName, Listids) throws TwitterException, IOException {
BufferedWriter wr = null;
try {
//Shift-JISを指定
wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "Shift-JIS"));
for (long eachId : ids) {
//書き出し
//IDから変換してユーザーの詳細を取得
//(数が多い場合は途中でAPI制限に引っ掛かるが)
User user = twitter.showUser(eachId);
//改行記号を除去(半角スペースに変換)
String strDes = user.getDescription().replaceAll("\r\n"," ");
strDes = strDes.replaceAll("\r"," ");
strDes = strDes.replaceAll("\n"," ");
//タブ記号を除去(半角スペースに変換)
strDes = strDes.replaceAll("\t"," ");
wr.write(String.valueOf(eachId)+","+user.getName()+","+user.getScreenName()+",");
wr.write(strDes);
wr.write("\n");
//念のためコンソールにも出力
System.out.println(String.valueOf(eachId)+" "+"ユーザー名: "+user.getName()+" "+user.getScreenName());
System.out.println(strDes);
}
wr.flush();
wr.close();
} catch (IOException e) {
//それまでのものの書き出しを完了する
wr.flush();
wr.close();
e.printStackTrace();
System.exit(-1);
}
}
}
ツイッターの仕様で1時間当たりの処理回数が決められているので(Rate Limiting)、数が多い場合はすべて出力できないですね。
一般にあるシステムではどのように処理しているのでしょうか?
この辺りはまだ勉強中です。
これからパワーアップしていきたいものです。
↓この記事が参考になったら拍手をクリックお願いします。今後のブログ作りに役立てたいので。
- 関連記事
-
- ある地点の近傍のツイートの取得方法!setGeoCodeや計算による半径の指定とGeohash(ジオハッシュ)による矩形の指定 #Twitter4J (2012/12/02)
- 【Twitter4J】Twitterの全ユーザーの公開ツイート(日本のみ)を表示する方法(その2、Streaming APIのsample) (2012/05/04)
- 【Twitter4J】Twitterの全ユーザーの公開ツイート(日本のみ)を表示する方法(その1、PublicTimeline) (2012/05/04)
- 【Twitter4J】検索してその結果を表示する方法 (2012/05/02)
- 【Twitter4J】フォロー(フレンド)とフォロワーの片思い・片思われを抽出する方法 (2012/04/30)