我一直想知道是否有办法访问所有Twitter粉丝列表。
我们尝试过通过twitter4j调用REST API:
public List<User> getFriendList() {
List<User> friendList = null;
try {
friendList = mTwitter.getFollowersList(mTwitter.getId(), -1);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (TwitterException e) {
e.printStackTrace();
}
return friendList;
}
但它只返回了20个粉丝的列表。
我尝试使用相同的call in loop,但它会导致速率限制异常 - 说我们不允许在很短的时间内发出太多请求。
我们有办法解决这个问题吗?
答案 0 :(得分:8)
你绝对应该使用getFollowersIDs
。正如文档所说,这将返回IDs
个对象的数组(列表)。请注意,它会导致列表一次分成大约5000个ID的页面。要开始分页,请提供值-1作为游标。来自API的响应将包括previous_cursor和next_cursor,以允许来回传递。
棘手的部分是处理光标。如果你能做到这一点,那么你将不会遇到只有20个粉丝的问题。
第一次调用getFollowersIDs需要给出一个-1的游标。对于后续调用,您需要通过获取下一个游标来更新游标值,就像在循环的while部分中所做的那样。
long cursor =-1L;
IDs ids;
do {
ids = twitter.getFollowersIDs(cursor);
for(long userID : ids.getIDs()){
friendList.add(userID);
}
} while((cursor = ids.getNextCursor())!=0 );
现在,如果用户拥有超过75000名粉丝,您将不得不等待(请参阅Vishal的回答)。
前15个调用将为您提供大约75000个ID。然后你将不得不睡15分钟。然后再打15个电话,依此类推,直到你得到所有的粉丝。这可以使用Thread.sleep(time_in_milliseconds)
循环外的简单for
来完成。
答案 1 :(得分:4)
只需像这样改变并尝试,这对我有用
try {
Log.i("act twitter...........", "ModifiedCustomTabBarActivity.class");
// final JSONArray twitterFriendsIDsJsonArray = new JSONArray();
IDs ids = mTwitter.mTwitter.getFriendsIDs(-1);// ids
// for (long id : ids.getIDs()) {
do {
for (long id : ids.getIDs()) {
String ID = "followers ID #" + id;
String[] firstname = ID.split("#");
String first_Name = firstname[0];
String Id = firstname[1];
Log.i("split...........", first_Name + Id);
String Name = mTwitter.mTwitter.showUser(id).getName();
String screenname = mTwitter.mTwitter.showUser(id).getScreenName();
// Log.i("id.......", "followers ID #" + id);
// Log.i("Name..", mTwitter.mTwitter.showUser(id).getName());
// Log.i("Screen_Name...", mTwitter.mTwitter.showUser(id).getScreenName());
// Log.i("image...", mTwitter.mTwitter.showUser(id).getProfileImageURL());
}
} while (ids.hasNext());
} catch (Exception e) {
e.printStackTrace();
}
答案 2 :(得分:3)
试试这个...
ConfigurationBuilder confbuilder = new ConfigurationBuilder();
confbuilder.setOAuthAccessToken(accessToken)
.setOAuthAccessTokenSecret(secretToken)
.setOAuthConsumerKey(TwitterOAuthActivity.CONSUMER_KEY)
.setOAuthConsumerSecret(TwitterOAuthActivity.CONSUMER_SECRET);
Twitter twitter = new TwitterFactory(confbuilder.build()).getInstance();
PagableResponseList<User> followersList;
ArrayList<String> list = new ArrayList<String>();
try
{
followersList = twitter.getFollowersList(screenName, cursor);
for (int i = 0; i < followersList.size(); i++)
{
User user = followersList.get(i);
String name = user.getName();
list.add(name);
System.out.println("Name" + i + ":" + name);
}
listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , list));
listView.setVisibility(View.VISIBLE);
friend_list.setVisibility(View.INVISIBLE);
post_feeds.setVisibility(View.INVISIBLE);
twit.setVisibility(View.INVISIBLE);
}
答案 3 :(得分:1)
这是一个棘手的问题。 您应该指定是使用应用程序还是每个用户令牌以及您为followers_ids获取的用户数。
如果是应用程序令牌,您每15分钟只能拨打15个电话。每次调用最多可以获取5000个followers_ids。这样每15分钟最多可以获得75K的followers_ids。 如果您正在获取followers_ids的任何用户拥有超过75K的关注者,您将立即收到rate_limit错误。如果您要获取超过1个用户,则需要在代码中使用sleeps构建强大的rate_limit处理并且非常耐心。
同样适用于friends_ids。
我没有必要处理为特定用户提供超过75K的粉丝/朋友但是想到它,我不知道它是否已经可能了。