就像你在这段代码中看到的那样,我希望得到关于twitter的朋友的所有信息,我关注的人。 但这样做:
PagableResponseList<User> users = twitter.getFriendsList(USER_ID, CURSOR);
...只给了我最近的20个朋友......我该怎么办?
完整的代码:
PagableResponseList<User> users = twitter.getFriendsList(USER_ID, CURSOR);
User user = null;
max = users.size();
System.out.println("Following: "+max);
for (int i = 0 ; i < users.size() ; i++){
user = users.get(i);
System.out.print("\nID: "+user.getId()+" / User: "+user.getName()+" /");
System.out.print("\nFollowers: "+user.getFollowersCount()+"\n");
tid.add(Long.parseLong(String.valueOf(user.getId())));
tusername.add(user.getName());
tfollowers.add(Long.parseLong(String.valueOf(user.getFollowersCount())));
tname.add(user.getScreenName());
}
谢谢..
答案 0 :(得分:2)
您可以尝试使用此代码获取您关注的人员列表。
long cursor = -1;
PagableResponseList<User> users;
while ((cursor = followers.getNextCursor()) != 0);
{
users = twitter.getFriendsList(userId, cursor);
}
答案 1 :(得分:2)
我已经看了Twitter4J和Twitter自己的文档,而且关于那个光标。
为了防止你一下子遇到一大堆朋友,Twitter只返回前20个结果。它不会返回前20个结果,但它也会返回一个光标。该光标只是一个由Twitter管理的随机数。当您再次拨打电话并传递此光标时,将返回接下来的20个条目(朋友),再次使用现在不同的光标。您可以重复此操作,直到返回的光标为零。这意味着没有更多的条目可用。
如果您想了解更多信息,请查看以下两个链接:Twitter DEV和Twitter4J documentation。
关于Java,您只需要找到获取当前光标的方法,然后再将该光标传递给您的方法,使应用程序加载下20个条目。根据{{3}},这应该可以解决问题。
List<User> allUsers = new ArrayList<User>();
PagableResponseList<User> users;
long cursor = -1;
while (cursor != 0) {
users = twitter.getFriendsList(USER_ID, cursor);
cursor = users.getNextCursor();
allUsers.add(users);
}
答案 2 :(得分:2)
您最多可以申请200 results at a time:
final PagableResponseList<User> users = twitter.getFriendsList(USER_ID, cursor, 200);
cursor = users.getNextCursor();
如果您需要从程序调用之间的中断位置开始,那么您需要在某处存储cursor
的值。
答案 3 :(得分:0)
对Sander's answer的改进!
getFriendsList
方法。允许的最大值为200。循环结构现在将帮助收集200多个朋友。每页或每次迭代200个朋友!getFriendsList
方法将使用以下api端点:GET friends/list
,其速率限制为每15分钟15次匹配。每个匹配最多可获取200个朋友,相当于每15分钟总共3000个(15 x 200 = 3000)朋友。因此,如果您只有3000个朋友,那将没有问题。如果您有超过3000个朋友,则将引发异常。您可以使用RateLimitStatus
类来避免该异常。以下代码是实现此目的的示例实现。方法1: fetchFriends(long userId)
public List<User> fetchFriends(long userId) {
List<User> friends = new ArrayList<User>();
PagableResponseList<User> page;
long cursor = -1;
try {
while (cursor != 0) {
page = twitter.getFriendsList(userId, cursor, 200);
friends.addAll(page);
System.out.println("Total number of friends fetched so far: " + friends.size());
cursor = page.getNextCursor();
this.handleRateLimit(page.getRateLimitStatus());
}
} catch (TwitterException e) {
e.printStackTrace();
}
return friends;
}
方法2: handleRateLimit(RateLimitStatus rls)
private void handleRateLimit(RateLimitStatus rls) {
int remaining = rls.getRemaining();
System.out.println("Rate Limit Remaining: " + remaining);
if (remaining == 0) {
int resetTime = rls.getSecondsUntilReset() + 5;
int sleep = (resetTime * 1000);
try {
if(sleep > 0) {
System.out.println("Rate Limit Exceeded. Sleep for " + (sleep / 1000) + " seconds..");
Thread.sleep(sleep);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这样做,您的程序将根据速率限制阈值休眠一段时间。它将从睡眠后离开的地方继续运行。这样,我们就可以避免程序在收集超过3000个好友的过程中停下来。
答案 4 :(得分:-1)
我的帖子解决方案...感谢 Sander ,给我一些想法......
事情是将for
更改为while ((CURSOR = ids.getNextCursor()) != 0);
。
而且...... user = twitter.showUser(id);
使用showUser可以慢慢地获取有关我所有朋友的所有信息......
这就是全部。请勿使用 user.get(i);