Search code examples
javatwittertwitter4jtwitter-streaming-api

Twitter Api detect my tweet retweeted or favourited


Is it possible to detect that someone retweeted or favourited my status? Does twitter api provide any listeners for a user's tweet RTd or Favourited?

In particular, I am looking for something with twitter4j that allows me to do so.


Solution

  • Ok After thoroughly searching about Twitter Streaming Api, here is the code I have used:

    For Favorite, I used UserStreamListener for listening for tweets of authenticating user favorited by other people(see onFavorite()):

            TwitterStream twitterStream = new TwitterStreamFactory(new ConfigurationBuilder().setJSONStoreEnabled(true).build()).getInstance();
    
            twitterStream.setOAuthConsumer(StaticConstants.API_KEY, StaticConstants.API_SECRET);
            AccessToken token = new AccessToken(StaticConstants.TOKEN_KEY, StaticConstants.TOKEN_SECRET);
            twitterStream.setOAuthAccessToken(token);
    
            UserStreamListener listener = new UserStreamListener() {
                public void onStatus(Status status) {
                    System.out.println("Status: " + status.getText());
                    //do your action here
                }
    
                @Override
                public void onDeletionNotice(StatusDeletionNotice sdn) {
                }
    
                @Override
                public void onTrackLimitationNotice(int i) {
                }
    
                @Override
                public void onScrubGeo(long l, long l1) {
                }
    
                @Override
                public void onStallWarning(StallWarning sw) {
                }
    
                @Override
                public void onException(Exception excptn) {
                }
    
                @Override
                public void onDeletionNotice(long l, long l1) {
                }
    
                @Override
                public void onFriendList(long[] longs) {
                }
    
                @Override
                public void onFavorite(User user, User user1, Status status) {
                    System.out.println("User:"+user.getScreenName());
                    System.out.println("User1 :"+user1.getScreenName());
                    System.out.println("Status: "+status.getText());
                }
    
                @Override
                public void onUnfavorite(User user, User user1, Status status) {
                }
    
                @Override
                public void onFollow(User user, User user1) {
                }
    
                @Override
                public void onDirectMessage(DirectMessage dm) {
                }
    
                @Override
                public void onUserListMemberAddition(User user, User user1, UserList ul) {
                }
    
                @Override
                public void onUserListMemberDeletion(User user, User user1, UserList ul) {
                }
    
                @Override
                public void onUserListSubscription(User user, User user1, UserList ul) {
                }
    
                @Override
                public void onUserListUnsubscription(User user, User user1, UserList ul) {
                }
    
                @Override
                public void onUserListCreation(User user, UserList ul) {
                }
    
                @Override
                public void onUserListUpdate(User user, UserList ul) {
                }
    
                @Override
                public void onUserListDeletion(User user, UserList ul) {
                }
    
                @Override
                public void onUserProfileUpdate(User user) {
                }
    
                @Override
                public void onBlock(User user, User user1) {
                }
    
                @Override
                public void onUnblock(User user, User user1) {
                }
    
            };
            twitterStream.addListener(listener);
            twitterStream.user();
    

    For listening to retweets retweeted by other users for a particular user(not necessarily the authenticating user), I used StatusListener as follows:

              StatusListener statusListner=new StatusListener() {
    
                @Override
                public void onStatus(Status status) {
                    System.out.println("Status Recvd: "+status.getText());
                }
    
                @Override
                public void onDeletionNotice(StatusDeletionNotice sdn) {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
    
                @Override
                public void onTrackLimitationNotice(int i) {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
    
                @Override
                public void onScrubGeo(long l, long l1) {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
    
                @Override
                public void onStallWarning(StallWarning sw) {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
    
                @Override
                public void onException(Exception excptn) {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
            };
    
            TwitterStream twitterStream2 = new TwitterStreamFactory(new ConfigurationBuilder().setJSONStoreEnabled(true).build()).getInstance();
    
            twitterStream2.setOAuthConsumer(StaticConstants.API_KEY, StaticConstants.API_SECRET);
            AccessToken token2 = new AccessToken(StaticConstants.TOKEN_KEY, StaticConstants.TOKEN_SECRET);
            twitterStream2.setOAuthAccessToken(token2);
    
            twitterStream2.addListener(statusListner);
            FilterQuery query = new FilterQuery();
            query.follow(new long[]{12384567l});
            twitterStream2.filter(query);
    

    Here the user id of user whose tweets we have to listen to for being retweeted by others(not necessarily followers), is being passed as parameter in query.follow(). This works perfectly fine for me and is the recommended way for doing so. Its by no means a hack. I am sure that it would help others who have searched the net for a similar topic and would answer many similar unanswered questions on SO.