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.
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.