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

我正在使用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() { } 

不幸的是你不能,至少不能直接这样做

 query.setCount(101); 

正如javadoc所说,它只允许最多100条推文。

为了克服这个问题,您只需要批量询问它们,并且在每个批次设置中,您获得的最大ID比最后一个ID少1。 为了解决这个问题,你将每个推文从进程收集到一个ArrayList(顺便说一下,它不应该保持通用,但是它的类型定义为ArrayList – 一个携带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 tweets = new ArrayList(); 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 tweets = new ArrayList(); 

应该是:

 List tweets = new ArrayList(); 

因为如果要添加其他实现,应始终使用该接口 。 当然,如果你在Processing 2.x上,那么在开始时需要这个:

 import java.util.List; 

这是我根据过去的答案为我的应用程序所做的function。 谢谢大家的解决方案。

 List tweets = new ArrayList(); 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); } } 

来自Twitter搜索API文档:此时,访问令牌所代表的用户每15分钟可以发出180个请求/查询。 使用仅应用程序身份validation,应用程序可以代表自己每15分钟发出450个查询/请求,而无需用户上下文。 您可以等待15分钟,然后再收集另一批400条推文,例如:

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

只需跟踪最低的Status ID,然后使用它来为后续search调用设置max_id 。 这将允许您一次退回结果100,直到您有足够的,例如:

 boolean finished = false; while (!finished) { final QueryResult result = twitter.search(query); final List 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的使用时间轴指南。