【问题标题】:How to get list of all twitter followers using twitter4j?如何使用 twitter4j 获取所有 Twitter 关注者的列表?
【发布时间】:2014-03-01 09:46:10
【问题描述】:

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

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

【问题讨论】:

    标签: android twitter twitter4j


    【解决方案1】:

    试试这个...

     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);
        }
    

    【讨论】:

      【解决方案2】:

      您绝对应该使用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 个电话,依此类推,直到获得所有关注者。这可以在for 循环之外使用简单的Thread.sleep(time_in_milliseconds) 来完成。

      【讨论】:

        【解决方案3】:

        像这样改变并尝试,这对我有用

            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();
            }
        

        【讨论】:

        • 非常感谢 NagarjunaReddy,但我真的希望获得更多详细信息,例如不仅是名字,还有完整的用户名和个人资料图片,我们也可以得到吗?
        【解决方案4】:

        这是一个棘手的问题。 您应该指定您是使用应用程序令牌还是每个用户令牌,以及您要为其获取 follower_ids 的用户数量。

        对于应用程序令牌,您每 15 分钟只会收到 15 次调用。每次调用最多可以获取 5000 个 Followers_id。每 15 分钟最多可以有 75,000 个 follower_id。 如果您为其获取 follower_ids 的任何用户拥有超过 75K 的关注者,您将立即收到 rate_limit 错误。如果您要获取超过 1 个用户,则需要在代码中使用 sleep 构建强大的 rate_limit 处理,并且非常耐心。

        同样适用于friends_ids。

        我不必处理为给定用户获取超过 75,000 个关注者/朋友的问题,但仔细想想,我什至不知道这是否可能了。

        【讨论】:

        • 感谢 Vishal,我的目标是获取 twitter 用户的关注者列表,并在列表视图中显示该列表,其中包含用户的个人资料图片和屏幕名称。获取 follower_id 返回 ID 对象而不是 user 对象。此外,getFollowersList(mTwitter.getId(), -1) 预计会返回用户的完整列表,但默认情况下有 20 个关注者。与api.twitter.com/1.1/followers/… 一样,但getFollowersList(mTwitter.getId(), -1) 方法仅提供游标作为参数,而忽略了计数参数
        • 在获取关注者ID后,您需要调用此api:“dev.twitter.com/docs/api/1.1/get/users/lookup”以获取具有所需详细信息的用户对象。
        猜你喜欢
        • 2015-06-20
        • 1970-01-01
        • 2013-02-02
        • 2017-10-20
        • 2015-11-13
        • 2010-10-12
        • 2012-06-28
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多