使用Twitter流API

6
我需要实时通知我选定的一些用户发布的新推文。据我所知,要实现这一点,需要使用Twitter Streaming API。我了解了Twitter4J,但我不太确定如何将其与Streaming API一起使用。有没有人知道有关使用它的最新实例呢?
此外,在Streaming API文档(在此处)中,我看到了以下摘录:
每个帐户只能创建一个连接到公共端点的常连接,并且使用相同帐户凭据多次连接到公共流会导致最旧的连接断开。 频繁进行连接尝试(无论是成功还是失败)的客户端面临自动禁止IP的风险。
当接收到新推文时,应用程序需要为所有用户进行更新。这是否会违反上述规则?我需要创建一个后端来接收流并从那里向下推送新的推文吗?
2个回答

2
您确实需要一个后端,我建议创建一个PHP文件(尽管您喜欢的任何语言都可以使用),它连接到流API,在每个新帖子上向应用程序的所有用户发送Google Cloud消息。在您的Android应用程序中,您可以实现一个广播接收器来处理包含至少包含推文链接但可以包含完整推文内容的GCM消息。

如果没有像服务器这样的单个连接点,正如您已经提到的,您将违反流API规则,更糟糕的是,一次只有一个用户会有可靠的连接。

希望对您有所帮助。


1
不需要后端,每个已认证的用户可以在应用程序本身中拥有自己的流。以下是我在自己的应用程序中使用的代码片段。
我假设用户正在关注那些用户。如果他们没有关注,则不会从他们那里获取任何推文。
如果您希望来自某些用户的推文被传递给所有人,而不管他们是否关注这些特定用户,则必须打开公共流。这无法在应用程序本身中完成,因此在这种情况下您将需要后端。在这种情况下,只需打开一个流实例,并且每当来自这些特定用户的推文到达时,就必须向您的应用程序的每个用户通知该推文。
我希望我的解释很清楚。
在此代码中,您只需为所选用户过滤推文。
    ConfigurationBuilder config = new ConfigurationBuilder();
    config.setJSONStoreEnabled(true);
    config.setOAuthConsumerKey(Keys.TWITTER_KEY);
    config.setOAuthConsumerSecret(Keys.TWITTER_SECRET);
    config.setOAuthAccessToken(HelperFunctions.currentSession.getAuthToken().token);
    config.setOAuthAccessTokenSecret(HelperFunctions.currentSession.getAuthToken().secret);

    Configuration cf = config.build();
    HelperFunctions.twitter = new TwitterFactory(cf).getInstance();

    HelperFunctions.twitterStream = new TwitterStreamFactory(cf).getInstance();
    HelperFunctions.twitterStream.addListener(listener);
    // user() method internally creates a thread which manipulates TwitterStream and calls these adequate listener methods continuously.
    HelperFunctions.twitterStream.user();







private static final UserStreamListener listener = new UserStreamListener() {
    @Override
    public void onStatus(Status status) {
        // Filter your selected users here
        System.out.println("onStatus @" + status.getUser().getScreenName() + " - " + status.getText());
    }

    @Override
    public void onFriendList(long[] friendIds) {
    }

    @Override
    public void onFavorite(User source, User target, Status favoritedStatus) {
    }

    @Override
    public void onUnfavorite(User source, User target, Status unfavoritedStatus) {

    }

    @Override
    public void onFollow(User source, User followedUser) {
    }

    @Override
    public void onUnfollow(User source, User unfollowedUser) {
    }

    @Override
    public void onDirectMessage(DirectMessage directMessage) {
    }

    @Override
    public void onUserListMemberAddition(User addedMember, User listOwner, UserList list) {
    }

    @Override
    public void onUserListMemberDeletion(User deletedMember, User listOwner, UserList list) {
    }

    @Override
    public void onUserListSubscription(User subscriber, User listOwner, UserList list) {
    }

    @Override
    public void onUserListUnsubscription(User subscriber, User listOwner, UserList list) {
    }

    @Override
    public void onUserListCreation(User listOwner, UserList list) {
    }

    @Override
    public void onUserListUpdate(User listOwner, UserList list) {
    }

    @Override
    public void onUserListDeletion(User listOwner, UserList list) {
    }

    @Override
    public void onUserProfileUpdate(User updatedUser) {
    }

    @Override
    public void onBlock(User source, User blockedUser) {
    }

    @Override
    public void onUnblock(User source, User unblockedUser) {
    }

    @Override
    public void onException(Exception ex) {
    }

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

    @Override
    public void onDeletionNotice(long directMessageId, long userId) {
        System.out.println("Got a direct message deletion notice id:" + directMessageId);
    }

    @Override
    public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
        System.out.println("Got a 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);
    }
};

是的,这需要通知所有应用程序用户有关特定用户的新推文,无论应用程序用户是否正在关注他们。 - Orbit
然后你需要一个后端。因为如果用户不关注那些用户,他们将无法收到推文。您将需要使用流式传输在后端服务器中获取所有推文,并在每个相关推文上使用推送消息通知所有用户。 - Pranjal Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接