获取公共Twitter账户的推文

28

我有一份推特用户名单,这些用户的个人资料是公开的。我希望能获取他们从创建账号那天起发布的“所有推文”。我在GitHub上检查了Twitter4J示例。GitHub链接 根据Twitter API文档,只会返回最近的20条推文。是否有任何方法可以完成我的任务?


值得注意的是,您只能使用分页和计数访问多达3200条推文 - http://apiwiki.twitter.com/Things-Every-Developer-Should-Know#6Therearepaginationlimits - Anurag
1
每个开发者都应该知道的东西的新链接:https://dev.twitter.com/overview/general/things-every-developer-should-know - LE GALL Benoît
3个回答

27

要使用Twitter4J获取用户的所有帖子,您需要在多个页面上进行请求。

以下代码基于GitHub上的示例

Twitter unauthenticatedTwitter = new TwitterFactory().getInstance();
//First param of Paging() is the page number, second is the number per page (this is capped around 200 I think.
Paging paging = new Paging(1, 100);
List<Status> statuses = unauthenticatedTwitter.getUserTimeline("google",paging);

只需循环并不断获取新页面,直到没有新帖子为止应该就可以了。


谢谢你的回复! 然而,当我运行与上述相同的代码时,我遇到了这个错误<code> "[Thu Jun 03 01:29:51 IST 2010]使用twitter4j.internal.logging.StdOutLoggerFactory作为日志工厂。 [Thu Jun 03 01:29:51 IST 2010]使用twitter4j.internal.http.HttpClientImpl作为HttpClient实现。 失败:连接被拒绝:连接" </code> 我能够使用getPublicTimeLine()函数获取公共时间线。 - Dexter
我尝试使用我的个人公共身份验证 Twitter 实例进行相同的操作,顺便说一下。PS:很抱歉以这种未格式化的方式发布错误。我尝试了所有 HTML 标签,包括 <code> 和 <blockquote> 标签。 - Dexter
1
你不应该需要进行身份验证才能完成这个操作,你不能使用上面的代码获取谷歌或你自己页面的公共时间线吗?你用什么来分页?你可以尝试只使用“用户名”作为getUserTimeline()的唯一参数。 - Tyler
Tyler,感谢您的回复。我今天能够检索到推文!由于过去两天一直在测试,API的输出非常不稳定。无论如何,下一个问题是代码仅适用于分页参数1,100。我尝试了不同的公共用户名,但都没有成功。根据网站上的说明,API限制为3200 {16,200},每个请求的计数为200。然而,我无法使用该功能。 - Dexter

15

以下是获取用户的所有推文(或至少高达~3200条)的方法:

import java.util.*;
import twitter4j.*;
import twitter4j.conf.*;

public static void main(String[] a) {

    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setOAuthConsumerKey("YOUR KEYS HERE");
    cb.setOAuthConsumerSecret("YOUR KEYS HERE");
    cb.setOAuthAccessToken("YOUR KEYS HERE");
    cb.setOAuthAccessTokenSecret("YOUR KEYS HERE");

    Twitter twitter = new TwitterFactory(cb.build()).getInstance();

    int pageno = 1;
    String user = "cnn";
    List statuses = new ArrayList();

    while (true) {

      try {

        int size = statuses.size(); 
        Paging page = new Paging(pageno++, 100);
        statuses.addAll(twitter.getUserTimeline(user, page));
        if (statuses.size() == size)
          break;
      }
      catch(TwitterException e) {

        e.printStackTrace();
      }
    }

    System.out.println("Total: "+statuses.size());
}

嗨@rednoyz,我尝试了这段代码,但它总是给我一个错误的认证错误。 * 400:请求无效。随附的错误消息将解释原因。这是版本1.0速率限制期间将返回的状态代码(https://dev.twitter.com/pages/rate-limiting)。在API v1.1中,没有身份验证的请求被视为无效,并且您将收到此响应。 消息-坏的认证数据。 代码-215* - viren
@viren,你设置了认证密钥吗? - hello_its_me
你需要设置你的认证密钥 -- 在 ConfigurationBuilder 中填写相应的值。 - rednoyz
你只需要使用消费者密钥,而不是访问令牌。这是一个小细节。 - requinard
我会收到一个错误提示:“缺少身份验证凭据”,除非我同时使用访问令牌。 - rednoyz

6
如果您仔细阅读Twitter文档,在API请求中指定“count = 200”,您可以一次检索多达200条推文。
您还可以使用“page = x”获取不同的分页结果;您可以一直这样做,直到检索到用户发布的每个推文为止。
我不确定您的Java应用程序如何创建此内容,但您的请求可能如下所示:
http://api.twitter.com/1/statuses/user_timeline.xml?id=SomeUsername&count=200&page=1
http://api.twitter.com/1/statuses/user_timeline.xml?id=SomeUsername&count=200&page=2
http://api.twitter.com/1/statuses/user_timeline.xml?id=SomeUsername&count=200&page=3

请记住,这些请求受到速率限制,因此您需要小心,不要超过限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接