繁体   English   中英

在指定位置使用twitter4j获取所有推文

[英]Fetching all tweets using twitter4j around a given location

我想使用Twitter4j从twitter API获取所有推文。 这是我使用geoCode提取推文的代码,但我无法提取所有推文,仅向我显示了约100条推文。 有什么办法我可以全部拿走。 我认为我可以接收的推文数量有一个速率限制,但我不确定。 有人可以帮忙吗?

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

}

您在解决方案方面遇到一些问题。

您的代码很好
您要Twitter在过去几天中在给定位置获得一些推文,而这就是Twitter给您的(目前大约有400条推文),所以...为什么推文这么少? 为什么其他网站有这么多推文 主要问题是搜索API。

搜索api
您需要知道搜索API专注于相关性而不是完整性 ,因此您只能从最近几天(大约一周)获得一些推文,并且如文档所述:

如果您想匹配完整性,则应考虑使用Streaming 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获得它们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM