如何使用Twitter4j检索超过100个结果

10

我正在使用Twitter4j库来获取推文,但是我没有得到足够的结果。目前,我从一页中最多只能获取100个结果。如何在以下代码中实现maxId和sinceId,以便从Twitter搜索API检索超过100个结果?我完全是Processing(和编程)的新手,所以对此的任何指导都将非常棒!谢谢!

void setup() {

  ConfigurationBuilder cb = new ConfigurationBuilder();
  cb.setOAuthConsumerKey("xxxx");
  cb.setOAuthConsumerSecret("xxxx");
  cb.setOAuthAccessToken("xxxx");
  cb.setOAuthAccessTokenSecret("xxxx");

  Twitter twitter = new TwitterFactory(cb.build()).getInstance();
  Query query = new Query("#peace");
  query.setCount(100);

  try {
    QueryResult result = twitter.search(query);
    ArrayList tweets = (ArrayList) result.getTweets();

    for (int i = 0; i < tweets.size(); i++) {
      Status t = (Status) tweets.get(i);

      GeoLocation loc = t.getGeoLocation();

      if (loc!=null) {
        tweets.get(i++);

        String user = t.getUser().getScreenName();
        String msg = t.getText();

        Double lat = t.getGeoLocation().getLatitude();
        Double lon = t.getGeoLocation().getLongitude();

        println("USER: " + user + " wrote: " + msg + " located at " + lat + ", " + lon);

      }
    }
  }

  catch (TwitterException te) {
    println("Couldn't connect: " + te);
  };
}

void draw() {
}

1
可能是获取超过100条推文的方法的重复问题。 - surhidamatya
4个回答

24
很抱歉,你不能直接这样做。至少目前还没有直接的方法可以实现。
query.setCount(101);

作为javadoc所说,它只允许最多100条推文。
为了解决这个问题,您只需要分批请求,并在每个批次中将获取到的最大ID设置为比上一个批次获取到的最后一个ID小1。最后,将整个过程中的每个推文收集到一个ArrayList中(顺便说一句,该列表不应保持通用,而应将其类型定义为ArrayList<Status> - 一个携带Status对象的ArrayList),然后打印所有内容!下面是一个实现示例:
void setup() {

  ConfigurationBuilder cb = new ConfigurationBuilder();
  cb.setOAuthConsumerKey("xxxx");
  cb.setOAuthConsumerSecret("xxxx");
  cb.setOAuthAccessToken("xxxx");
  cb.setOAuthAccessTokenSecret("xxxx");

  Twitter twitter = new TwitterFactory(cb.build()).getInstance();
  Query query = new Query("#peace");
  int numberOfTweets = 512;
  long lastID = Long.MAX_VALUE;
  ArrayList<Status> tweets = new ArrayList<Status>();
  while (tweets.size () < numberOfTweets) {
    if (numberOfTweets - tweets.size() > 100)
      query.setCount(100);
    else 
      query.setCount(numberOfTweets - tweets.size());
    try {
      QueryResult result = twitter.search(query);
      tweets.addAll(result.getTweets());
      println("Gathered " + tweets.size() + " tweets");
      for (Status t: tweets) 
        if(t.getId() < lastID) lastID = t.getId();

    }

    catch (TwitterException te) {
      println("Couldn't connect: " + te);
    }; 
    query.setMaxId(lastID-1);
  }

  for (int i = 0; i < tweets.size(); i++) {
    Status t = (Status) tweets.get(i);

    GeoLocation loc = t.getGeoLocation();

    String user = t.getUser().getScreenName();
    String msg = t.getText();
    String time = "";
    if (loc!=null) {
      Double lat = t.getGeoLocation().getLatitude();
      Double lon = t.getGeoLocation().getLongitude();
      println(i + " USER: " + user + " wrote: " + msg + " located at " + lat + ", " + lon);
    } 
    else 
      println(i + " USER: " + user + " wrote: " + msg);
  }
}

注意:该行

ArrayList<Status> tweets = new ArrayList<Status>();

应该正确的写法是:
List<Status> tweets = new ArrayList<Status>();

因为您 应该始终使用接口,以防需要添加不同的实现。当然,如果您正在使用Processing 2.x,则需要在开头执行以下操作:

import java.util.List;

太棒了!我现在唯一遇到的问题是,所有大于100的结果都只是前100条推文的重复。 - hapless_cap
我好像在将代码拆分以将推文收集到列表中时忘记了一行。我进行了编辑!现在应该可以工作了! - Petros Koutsolampros

2
这是我根据之前的答案为我的应用程序制作的函数。感谢大家提供的解决方案。
List<Status> tweets = new ArrayList<Status>();

void getTweets(String term)
{
int wantedTweets = 112;
long lastSearchID = Long.MAX_VALUE;
int remainingTweets = wantedTweets;
Query query = new Query(term);
 try
{ 

  while(remainingTweets > 0)
  {
    remainingTweets = wantedTweets - tweets.size();
    if(remainingTweets > 100)
    {
      query.count(100);
    }
    else
    {
     query.count(remainingTweets); 
    }
    QueryResult result = twitter.search(query);
    tweets.addAll(result.getTweets());
    Status s = tweets.get(tweets.size()-1);
    firstQueryID = s.getId();
    query.setMaxId(firstQueryID);
    remainingTweets = wantedTweets - tweets.size();
  }

  println("tweets.size() "+tweets.size() );
}
catch(TwitterException te)
{
  System.out.println("Failed to search tweets: " + te.getMessage());
  System.exit(-1);
}
}

1

来自Twitter搜索API文档: 目前,使用访问令牌表示的用户可以每15分钟进行180次请求/查询。使用仅应用程序身份验证,应用程序可以代表自己在15分钟内进行450个查询/请求,而无需用户上下文。 您可以等待15分钟,然后收集另一个批次的400条推文,类似于:

            if(tweets.size() % 400 == 0 ) {
            try {
                    Thread.sleep(900000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

0

只需跟踪最低的Status id,并使用它来设置后续search调用的max_id。这将允许您每次返回100个结果,直到您获得足够的结果为止,例如:

boolean finished = false;
while (!finished) {
    final QueryResult result = twitter.search(query);    

    final List<Status> statuses = result.getTweets();
    long lowestStatusId = Long.MAX_VALUE;
    for (Status status : statuses) {
        // do your processing here and work out if you are 'finished' etc... 

        // Capture the lowest (earliest) Status id
        lowestStatusId = Math.min(status.getId(), lowestStatusId);
    }

    // Subtracting one here because 'max_id' is inclusive
    query.setMaxId(lowestStatusId - 1);
}

请查看 Twitter 的 工作时间轴指南 以获取更多信息。


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