Java 如何使用Twitter4j检索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");

我使用Twitter4j库来检索tweet,但是我没有得到足够的信息。目前,我从一个页面最多得到100个。如何在处理过程中将maxId和sinceId实现到下面的代码中,以便从Twitter搜索API检索100多个结果?我对处理(和编程)完全是新手,所以在这方面的任何指导都是很棒的!谢谢

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