【问题标题】:Fetching all tweets using twitter4j around a given location使用 twitter4j 获取给定位置周围的所有推文
【发布时间】:2016-03-03 01:01:27
【问题描述】:

我想使用 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);
    }
}

}

【问题讨论】:

  • 1-切勿发布您的 OAUTH 凭据。 2-您是否阅读过有关此问题的 API 文档? dev.twitter.com/overview/documentation
  • 糟糕。我忘记了。是的,我已经阅读了文档,发现它在这个问题上令人困惑。
  • 我刚刚运行了你的代码,我收到了 403 条推文
  • 是的..但我需要更多来执行一些分析。我也需要他们的经纬度。
  • “搜索 API 专注于相关性而不是完整性”,并且您无法从超过几天的时间内收到推文,因此如果您想做一个类似该链接的情节,您应该使用流 api 和设置您想要获取这些推文的位置范围dev.twitter.com/streaming/overview/request-parameters#locations

标签: java twitter twitter4j


【解决方案1】:

您在处理解决方案时遇到了一些问题。

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

搜索 API
你需要知道search API is focused on relevance and not completeness,所以你只会收到最后几天(大约一周)的一些推文,正如文档所述:

如果你想匹配完整性,你应该考虑使用 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);

如果您收到的推文过多,Streaming Api 会削减它们,因此请尽量不要将边界框设置为大。
但是...如果我想要过去的推文并且我希望它们正确现在?
这是 Twitter 获得额外资金的地方,您可以通过 Gnip 获得它们

【讨论】:

  • 我猜 Twitterstream 在 twitter4j 中不起作用。如何让它工作? twitterStream.addListener(listener); 不适合我。
  • 你必须初始化那个变量,我只是在我的答案上放了更多代码
  • 是的,但是如何获取来自世界各地的所有推文位置?我想在谷歌地图上绘制它们。
  • “如果你收到的推文太多,Streaming Api 会剪掉它们,所以尽量不要将边界框设置得过大。”您可以设置包裹全世界的债券,如果缺少某些推文,那么您将需要被 twitter 列入白名单或从 Gnip 购买
  • 这是真的,但是。我想要推文的位置,比如说#oscar,这样我就可以在谷歌地图上绘制它们。在上述情况下,我提供了位置。我猜 1000 - 2000 就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多