2015-08-25 2 views
6

Мне нужно уведомить приложение о новых твитах в реальном времени от нескольких пользователей. AFAIK, для этого мне нужно использовать API Streaming Stream. Я столкнулся с Twitter4J, но я не совсем уверен, как это использовать с Streaming API. Кто-нибудь знает какие-либо конкретные современные примеры использования этого?Использование API Streaming Twitter

Кроме того, я наткнулся на этот отрывок в API документации Streaming here:

Каждая учетная запись может создать только одно постоянное подключение к публичным оконечных и подключения к публичному потока более чем один раз с одной и той же учетной записи учетные данные приведут к отключению самого старого соединения. Клиенты, которые совершают чрезмерные попытки подключения (как успешные, так и неудачные), рискуют автоматически заблокировать свой IP-адрес.

Приложение должно будет обновить для всех пользователей, когда будет получен новый твит. Разве это нарушит это правило? Мне нужно создать бэкэнд вместо того, чтобы получать поток, а затем оттолкнуть новые твиты?

ответ

2

Вам действительно нужен бэкэнд, я предлагаю создать файл PHP (хотя любой язык, который вам нравится, может служить), который подключается к потоковому API, и на каждом новом посту отправляет Google Cloud Message всем пользователям приложение. В вашем приложении 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); 
    } 
}; 
+0

Да, это должно было бы уведомить всех пользователей приложений о новых твитах от конкретных пользователей, независимо от того, следит за ними пользователь приложения. – Orbit

+0

Тогда вам нужен бэкэнд. Поскольку эти пользователи не будут получать твиты, если они не следуют этим пользователям. Вам нужно будет получить все твиты на вашем бэкэнд-сервере, используя потоковое вещание, и на каждом соответствующем твите уведомите всех пользователей, используя push-сообщения. – sahu