如何在twitter中检查流式api中的速率限制

时间:2014-07-07 09:36:03

标签: java twitter twitter4j

我设法获取某个关键字的实时推文。到目前为止,我试图添加一些RateLimitStatusListener,以防我达到速率限制。

问题是,永远不会被调用。即使我达到了速率限制,它也不会被调用。我无法理解。 我的意图是,如果我得到速率限制错误做一些错误处理。尽管如此,有没有其他方法可以检查是否达到了速率限制?

public final class PrintSampleStream {

    public static void main(String[] args) throws TwitterException {

        TwitterStream twitterStream = new TwitterStreamFactory().getInstance();
        StatusListener listener = new StatusListener() {
            @Override
            public void onStatus(Status status) {
                System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText());
            }

            @Override
            public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
                System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
            }

            @Override
            public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
                System.out.println("Got track limitation notice:" + numberOfLimitedStatuses);
            }

            @Override
            public void onScrubGeo(long userId, long upToStatusId) {
                System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
            }

            @Override
            public void onStallWarning(StallWarning warning) {
                System.out.println("Got stall warning:" + warning);
            }

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

        twitterStream.addRateLimitStatusListener( new RateLimitStatusListener() {
            @Override
            public void onRateLimitStatus( RateLimitStatusEvent event ) {
                System.out.println("Limit["+event.getRateLimitStatus().getLimit() + "], Remaining[" +event.getRateLimitStatus().getRemaining()+"]");
            }

            @Override
            public void onRateLimitReached( RateLimitStatusEvent event ) {
                System.out.println("Limit["+event.getRateLimitStatus().getLimit() + "], Remaining[" +event.getRateLimitStatus().getRemaining()+"]");
            }
        } );

        FilterQuery filterQuery = new FilterQuery();
        String[] query = {"#WorldCup2014"};
        filterQuery.track(query);

        twitterStream.addListener(listener);
        twitterStream.filter(filterQuery); 

    }
}

1 个答案:

答案 0 :(得分:4)

您提到的费率限制仅适用于Twitter rest api,而不适用于流API。在流式传输中,不需要添加类似的代码,因为限制是以不同的方式处理的:

  

您将以总量的1%流式传输

这意味着您将获得流式API中跟踪或关注的内容的1%。

  

如何在Streaming API上确定速率限制?

     

公共流式API会限制发送给您的邮件数量   客户到任何给定的推文总量的一小部分   时刻。

     

样品软管,如下所述   https://stream.twitter.com/1/statuses/sample.json,随机发送   所有推文的抽样数量等于公共流媒体上限。

     

过滤的流将所有匹配的推文返回到等于的卷   流媒体上限。如果有更多的推文符合你的   标准,您将流式传输速率限制消息,指示有多少   推文未送达。

https://dev.twitter.com/discussions/2907