如何使用twitter4j获取所有Twitter粉丝的列表?

时间:2014-02-05 05:16:01

标签: android twitter twitter4j

我一直想知道是否有办法访问所有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,但它会导致速率限制异常 - 说我们不允许在很短的时间内发出太多请求。

我们有办法解决这个问题吗?

4 个答案:

答案 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 );

这是一个非常好的参考: https://github.com/yusuke/twitter4j/blob/master/twitter4j-examples/src/main/java/twitter4j/examples/friendsandfollowers/GetFriendsIDs.java

现在,如果用户拥有超过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的粉丝/朋友但是想到它,我不知道它是否已经可能了。