Java 如何使用Twitter4j检索100多个结果
我使用Twitter4j库来检索tweet,但是我没有得到足够的信息。目前,我从一个页面最多得到100个。如何在处理过程中将maxId和sinceId实现到下面的代码中,以便从Twitter搜索API检索100多个结果?我对处理(和编程)完全是新手,所以在这方面的任何指导都是很棒的!谢谢Java 如何使用Twitter4j检索100多个结果,java,twitter,processing,twitter4j,Java,Twitter,Processing,Twitter4j,我使用Twitter4j库来检索tweet,但是我没有得到足够的信息。目前,我从一个页面最多得到100个。如何在处理过程中将maxId和sinceId实现到下面的代码中,以便从Twitter搜索API检索100多个结果?我对处理(和编程)完全是新手,所以在这方面的任何指导都是很棒的!谢谢 void setup() { ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setOAuthConsumerKey("xxxx");
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() {
}
void setup(){
ConfigurationBuilder cb=新的ConfigurationBuilder();
cb.setOAuthConsumerKey(“xxxx”);
cb.SetOAuthConsumerCret(“xxxx”);
cb.setOAuthAccessToken(“xxxx”);
cb.setOAuthAccessTokenSecret(“xxxx”);
Twitter=newtwitterfactory(cb.build()).getInstance();
查询=新查询(“#和平”);
query.setCount(100);
试一试{
QueryResult result=twitter.search(查询);
ArrayList tweets=(ArrayList)result.getTweets();
对于(int i=0;i
不幸的是,你不能,至少不能用直接的方式,比如
query.setCount(101);
正如政府所说,它最多只允许100条推文
为了克服这一点,您只需分批请求它们,并在每个批次中设置您获得的最大ID,使其比您从上一个批次获得的上一个ID小1。最后,您将流程中的每条tweet收集到一个ArrayList中(顺便说一句,它不应该保持通用性,而是将其类型定义为ArrayList
——一个携带状态对象的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);
}
}
只需跟踪最低的
状态
id,并使用它为后续的搜索
调用设置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);
}
boolean finished=false;
当(!完成){
最终查询结果=twitter.search(查询);
最终列表状态=result.getTweets();
long lowestStatusId=long.MAX_值;
用于(状态:状态){
//在这里进行处理,并确定是否“完成”等。。。
//捕获最低(最早)状态id
lowestStatusId=Math.min(status.getId(),lowestStatusId);
}
//此处减去一,因为“max_id”包含在内
setMaxId(最低状态ID-1);
}
有关更多信息,请参阅上的Twitter指南。以下是我根据过去的答案为我的应用程序制作的功能。谢谢大家的解决方案
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);
}
}
List tweets=new ArrayList();
void getTweets(字符串术语)
{
int wantedTweets=112;
long lastSearchID=long.MAX_值;
int remainingTweets=想要的tweets;
查询=新查询(术语);
尝试
{
while(剩余tweets>0)
{
remainingTweets=wantedTweets-tweets.size();
如果(剩余tweets>100)
{
查询.计数(100);
}
其他的
{
count(remainingTweets);
}
QueryResult result=twitter.search(查询);
addAll(result.getTweets());
状态s=tweets.get(tweets.size()-1);
firstQueryID=s.getId();
setMaxId(firstQueryID);
remainingTweets=wantedTweets-tweets.size();
}
println(“tweets.size()”+tweets.size());
}
捕获(twitter异常)
{
System.out.println(“未能搜索tweets:+te.getMessage());
系统退出(-1);
}
}
来自Twitter搜索API文档:
此时,由访问令牌表示的用户每15分钟可以发出180个请求/查询。使用仅限应用程序的身份验证,应用程序在没有用户上下文的情况下,每15分钟可以代表自己进行450次查询/请求。
您可以等待15分钟,然后收集另一批400条推文,如:
if(tweets.size() % 400 == 0 ) {
try {
Thread.sleep(900000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
令人惊叹的!我现在唯一的问题是,所有大于100条的结果都只是前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);
}
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);
}
}
if(tweets.size() % 400 == 0 ) {
try {
Thread.sleep(900000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}