3
votes

I frequently get the following exception using twitter4j:

2015-06-02 10:04:30,802 DEBUG [Twitter Stream consumer-1[Establishing connection]] TwitterBot(116): Got an exception 420:Returned by the Search and Trends API when you are being rate limited (https://dev.twitter.com/docs/rate-limiting).
Returned by the Streaming API:
 Too many login attempts in a short period of time.
 Running too many copies of the same application authenticating with the same account name.
Exceeded connection limit for user

Since i try to avoid being banned from Twitter, i would like to ask, if I am doing something wrong in my code:

I am using a StatusListener on the Stream API, which is filtered by my own ID and some string values.

If a status matches the criteria an answer for this status is send via twitter. This does not happen very often and therefore this should not be the problem of the rate limitation exception.

The whole thing runs in a TomEE EJB environment, if this is important?

@Startup
@Singleton
public class TwitterBot implements Service {

    private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TwitterBot.class);

    //this is fix for this twitter bot
    public static final String TWITTER_BOT_NAME = "botname";
    public static final long TWITTER_BOT_USER_ID = 99999L; //the bot's user id

    private final TwitterStream twitterStream;
    private final Twitter twitter;

    public TwitterBot() {

        this.twitterStream = new TwitterStreamFactory().getInstance();
        this.twitter = TwitterFactory.getSingleton();
    }


    @PostConstruct
    public void listen() {

        StatusListener listener = new StatusListener() {
            @Override
            public void onStatus(Status status) {

                //this is to avoid a circle... ignore tweets coming from ourselves.
                if (status.getUser().getScreenName().equalsIgnoreCase(TWITTER_BOT_NAME)) {
                    return;
                }

                try {

                    //do something and update own status

                    StatusUpdate update = new StatusUpdate("Hello World!");
                    update.setInReplyToStatusId(status.getId());

                    twitter.updateStatus(update);

                } catch (TwitterException e) {
                    logger.error("Could not complete twitter update, {}", e.getLocalizedMessage(), e);
                }

            }

           //other Status Listener methods, which are not used (default implementation)
        };

        //filtering for ourselves here
        long[] userFilter = {TWITTER_BOT_USER_ID};

        String[] termFilter = {TWITTER_EXPERTIZER_BOT_NAME};

        FilterQuery filter = new FilterQuery(0, userFilter, termFilter);

        twitterStream.addListener(listener);

        twitterStream.filter(filter);

    }
}

The answer on this How to handle rate limit using twitter4j to avoid being banned tells me, that the Streaming API has no rate limitation.

So what is the issue? Is there an explanation in the API documentation?

Thank you in advance!

1
The problem is related to the FilterQuery. If I use it as it is described in the other stackoverflow post, it works like a charm without rate limitations. I will watch this further.rzo1
if you finally have a solution, please post this as an answer to the original questionMWiesner

1 Answers

1
votes

Edit:

The Problem is related to

FilterQuery filter = new FilterQuery(0, userFilter, termFilter);

Using the query like this produces some kind of polling on the Twitter API and therefore exceeds connection limit.

Instead use:

 FilterQuery filter = new FilterQuery(termFilter);