关于Twitter4J的最多20位朋友信息

时间:2014-09-26 08:59:03

标签: java eclipse api size twitter4j

就像你在这段代码中看到的那样,我希望得到关于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());

        }

谢谢..

5 个答案:

答案 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 DEVTwitter4J 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的改进!

  1. 您可以像Jonathan's Answer一样将计数值设置为getFriendsList方法。允许的最大值为200。循环结构现在将帮助收集200多个朋友。每页或每次迭代200个朋友!
  2. 但是,您提出的任何请求都有rate limitsgetFriendsList方法将使用以下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);