【问题标题】:Using the Twitter Streaming API使用 Twitter 流 API
【发布时间】:2015-11-19 09:20:51
【问题描述】:

我需要将来自选定的少数用户的新推文实时通知我的应用。 AFAIK,为此我需要使用 Twitter Streaming API。我遇到了 Twitter4J,但我不太确定如何将它与 Streaming API 一起使用。有谁知道使用这个的具体最新示例吗?

另外,我在 Streaming API 文档here 中看到了这段摘录:

每个帐户只能创建一个到公共端点的常设连接,并且使用相同的帐户凭据多次连接到公共流将导致最旧的连接断开。 进行过多连接尝试(成功和不成功)的客户端将面临其 IP 被自动禁止的风险。

当收到新推文时,需要为所有用户更新应用程序。这会打破这个规则吗?我是否需要创建一个后端来接收流,然后从那里向下推送新推文?

【问题讨论】:

    标签: android twitter twitter4j


    【解决方案1】:

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

    如果没有像服务器这样的单一连接点,您可能会像您已经建议的那样破坏流 API 规则,更糟糕的是,一次只有一个用户可以拥有可靠的连接。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      不,您不需要任何后端来实现此目的。每个经过身份验证的用户都可以在应用程序本身中拥有自己的流。以下是我在自己的应用程序中使用的代码 sn-p。

      我假设用户正在关注这些用户。如果他们没有关注,那么他们将不会在他们的流中从他们那里获得任何推文。

      如果您希望将某些用户的推文发送给所有人,而不管他们是否关注这些特定用户,那么您必须打开一个公共流。这不能在应用程序本身中完成,因此在这种情况下您将需要后端。在这种情况下,只需打开一个流实例,并且每当来自这些特定用户的推文到达时,都必须将该推文通知给应用程序的每个用户。

      我希望我的解释清楚。

      在此代码中,您只需过滤那些选定用户的推文。

          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);
          }
      };
      

      【讨论】:

      • 是的,这需要通知所有应用用户来自特定用户的新推文,无论应用用户是否关注他们。
      • 那么你需要一个后端。因为如果这些用户不关注这些用户,他们将不会收到推文。您将必须使用流媒体获取后端服务器中的所有推文,并在每条相关推文上使用推送消息通知所有用户。
      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 2015-12-31
      • 2011-06-11
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多