2016-03-01 89 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