2016-03-01 33 views
1

我想使用Twitter4j从推特API获取所有推文。这里是我的代码,使用geoCode来获取推文,但我无法获取所有推文,它只是向我展示了大约100条推文。有什么办法可以把他们全部拿走。我认为我可以收到的推文数量有限制,但我不确定。 任何人都可以帮忙吗?在给定位置使用twitter4j获取所有推文

import java.util.List; 

import twitter4j.*; 
import twitter4j.auth.AccessToken; 

public class Main { 
public static void main(String[] args) { 

    final Twitter twitter = new TwitterFactory().getInstance(); 
    final AccessToken accessToken = new AccessToken("XXX", "YYY"); 
    twitter.setOAuthConsumer("AAA", "BBB"); 
    twitter.setOAuthAccessToken(accessToken); 

    try { 
     Query query = new Query(); 
     query.geoCode(new GeoLocation(37.781157,-122.398720),1000.0,"mi"); 
     QueryResult result; 
     System.out.println("Searching..."); 
     int Count=0; 

     do { 
      result = twitter.search(query); 
      List<Status> tweets = result.getTweets(); 
      for (Status tweet : tweets) { 
       if(tweet.getGeoLocation()!=null) 
        System.out.println(tweet.getGeoLocation()); 
      } 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     while ((query = result.nextQuery()) != null); 
     System.out.println(Count); 
     System.exit(0); 
    } catch (TwitterException te) { 
     te.printStackTrace(); 
     System.out.println("Failed to search tweets: " + te.getMessage()); 
     System.exit(-1); 
    } 
} 

}

+1

1 - 永不张贴您的OAUTH凭证。 2 - 您是否阅读过关于此事的API文档? https://dev.twitter.com/overview/documentation – gfelisberto

+0

糟糕。我忘了那个。是的,我阅读过文档,发现它在这个问题上很混乱。 – piyush121

+0

我只是运行你的代码,我得到了403推文 – FeanDoe

回答

1

你有一些问题,你是如何接近你的解决方案。

你的代码是罚款
你问Twitter来获得一些微博在给定位置的最后几天,而这正是Twitter的是给你(大约400个鸣叫当前时刻),所以。 ..为什么有这么几个推文?为什么其他网站有so many tweets?主要的问题是搜索api。

搜索API
你需要知道的是,search API is focused on relevance and not completeness,所以你只能从最后的日子有些鸣叫(一个星期左右),并作为文档状态:

如果你想匹配完整性,你应该考虑使用流API,而不是

这导致我们下一步...

的流媒体API
在流媒体API中,你不能搜索推文,你可以实时获得它们。如果你想要一个月的本地化推文,你需要设置流API的界限,并让它运行一个月。在Twitter4j您需要设置定位滤波器,然后运行流媒体,是这样的:

ConfigurationBuilder cb = new ConfigurationBuilder(); 
    cb.setDebugEnabled(true).setOAuthConsumerKey("---") 
      .setOAuthConsumerSecret("---") 
      .setOAuthAccessToken("---") 
      .setOAuthAccessTokenSecret("---"); 

    TwitterStream twitterStream = new TwitterStreamFactory(cb.build()) 
      .getInstance(); 
    StatusListener listener = new StatusListener() { 

     @Override 
     public void onStatus(Status status) { 
       //here you do whatever you want with the tweet 
      System.out.println(status.getText()); 

     } 

     @Override 
     public void onException(Exception ex) { 
      ex.printStackTrace(); 
     } 

     @Override 
     public void onDeletionNotice(StatusDeletionNotice arg0) { 
        // TODO Auto-generated method stub 

     } 

     @Override 
     public void onScrubGeo(long arg0, long arg1) { 

     } 

     @Override 
     public void onStallWarning(StallWarning arg0) { 
      // TODO Auto-generated method stub 
      System.out.println(arg0); 
     } 

     @Override 
     public void onTrackLimitationNotice(int arg0) { 
      // TODO Auto-generated method stub 
      System.out.println(arg0); 
     } 

    }; 

    twitterStream.addListener(listener); 
    FilterQuery filterQuery = new FilterQuery(); 
    double[][] locations = {{-74,40}, {-73,41}}; //those are the boundary from New York City 
    filterQuery.locations(locations); 
    twitterStream.filter(filterQuery); 
    twitterStream.filter(filterQuery); 

如果你得到太多的鸣叫流API将削减他们,所以尽量边界框未设置为大。
但是...如果我想要过去的推文,我现在想要它们吗?
这是Twitter获得一些额外的钱,你可以得到他们与Gnip

+0

Twitterstream不适用于twitter4j我猜。如何让它工作? 'twitterStream.addListener(listener);'不适合我。 – piyush121

+0

您必须初始化该变量,我只在答案中加入更多代码 – FeanDoe

+0

是的,但是如何获取来自世界各地的所有推文位置?我想在谷歌地图上绘制它们。 – piyush121

相关问题