我一直在想是否有一种访问所有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个关注者的列表。
我尝试在循环中使用相同的呼叫,但会导致速率限制例外 - 说我们不允许在少数时间间隔内提出太多请求。
我们有办法解决这个问题吗?
您绝对应该使用getFollowersIDs
。正如文档所说,这返回IDs
对象的数组(列表)。请注意,它使列表一次分为大约5000个ID的页面。开始分页提供-1作为光标的值。API的响应将包括一个以前的_cursor和next_cursor来来回分页。
棘手的部分是处理光标。如果您可以做到这一点,那么您将不会遇到20个关注者的问题。
第一个呼叫getFollowerSID将需要给出-1的光标。对于后续的呼叫,您需要通过获取下一个光标来更新光标值,如循环的一部分。
long cursor =-1L;
IDs ids;
do {
ids = twitter.getFollowersIDs(cursor);
for(long userID : ids.getIDs()){
friendList.add(userID);
}
} while((cursor = ids.getNextCursor())!=0 );
这是一个很好的参考:https://github.com/yusuke/twitter4j/blob/master/twitter4j-examples/src/src/main/java/java/twitter4j/examples/friendsandfollowers/getFriendsids.java
现在,如果用户拥有大约75000个关注者,则必须进行一些等待(请参阅Vishal的答案)。前15个电话将使您差75000 ID。然后,您必须睡15分钟。然后再拨打15个电话,依此类推,直到您吸引所有关注者为止。这可以使用for
循环外的简单Thread.sleep(time_in_milliseconds)
完成。
只是像这样更改并尝试,这对我有用
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();
}
尝试这个...
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);
}
这是一个棘手的。您应该指定您是使用应用程序还是每个用户令牌以及要获取关注者的用户数量。
。在应用程序令牌的情况下,您每15分钟只能收到15个电话。您最多可以获取每个呼叫的5000个关注者_ids。这给您每15分钟的最多75K关注者。如果您要获取的任何用户为关注者_ids的关注者超过75K,则您将立即获得Rate_limit错误。如果您要为1个以上的用户获取,则需要在您的代码中构建强大的费用_limit用睡眠处理并非常耐心。
friends_ids也适用。
我不必为给定用户提供超过75k的关注者/朋友,但开始考虑它,我不知道是否可以了。