2015-08-25 15 views
6

Ho bisogno di notificare la mia app di nuovi tweet in tempo reale da pochi utenti selezionati. AFAIK, per fare questo ho bisogno di utilizzare l'API di streaming di Twitter. Mi sono imbattuto in Twitter4J ma non sono abbastanza sicuro di come utilizzarlo con l'API Streaming. Qualcuno sa di esempi concreti aggiornati sull'utilizzo di questo?Utilizzo dell'API di streaming Twitter

Inoltre, mi sono imbattuto in questo exerpt in Streaming documentazione API here:

Ogni account può creare solo una connessione permanente gli endpoint pubblici, e la connessione a un flusso di pubblico più di una volta con lo stesso account le credenziali causeranno la disconnessione della connessione meno recente. I client che effettuano tentativi di connessione eccessivi (sia riusciti che falliti) corrono il rischio di bandire automaticamente il loro IP.

L'app dovrà essere aggiornata per tutti gli utenti quando viene ricevuto un nuovo tweet. Questo infrangerebbe questa regola? Devo creare un back-end per ricevere lo stream e poi spingere i nuovi tweet da lì?

risposta

2

Hai davvero bisogno di un back-end, ti suggerisco di creare un file PHP (anche se qualsiasi lingua che ti piace può servire), che si collega all'API di streaming, e su ogni nuovo post invia un messaggio Google Cloud a tutti gli utenti del app. Nella tua app Android puoi quindi implementare un ricevitore broadcast che gestisce il messaggio GCM che dovrebbe contenere almeno il link del tweet, ma può contenere il contenuto completo dei tweet.

Senza un singolo punto di connessione come un server, come avresti suggerito di interrompere le regole dell'API di streaming e, peggio ancora, solo un utente alla volta avrebbe una connessione affidabile.

Spero che questo aiuti.

1

No, non è necessario alcun back-end per questo scopo. Ogni utente autenticato può avere il proprio stream nell'app stessa. Di seguito è riportato lo snippet di codice che sto utilizzando nella mia applicazione.

Suppongo che l'utente stia seguendo tali utenti. Se non stanno seguendo, non riceveranno alcun tweet da loro nel loro stream.

Nel caso in cui si desidera che i tweet di determinati utenti vengano recapitati a tutti, indipendentemente dal fatto che seguano o meno determinati utenti, sarà necessario aprire un flusso pubblico. Questo non può essere fatto nell'app stessa e quindi avrai bisogno di back-end in quel caso. In tal caso, deve essere aperta una sola istanza di stream e ogni volta che arriva un tweet da quegli utenti, quel tweet deve essere notificato a ciascun utente della tua app.

Spero di essere chiaro con la mia spiegazione.

In questo codice è sufficiente filtrare i tweet per gli utenti selezionati.

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

Sì, questo avrebbe bisogno di comunicare a tutti gli utenti di app di nuovi tweet da utenti specifici, indipendentemente se l'utente app li sta seguendo o no. – Orbit

+0

Quindi hai bisogno di un back-end. Perché quegli utenti non riceveranno tweet se non stanno seguendo quegli utenti. Dovrai ottenere tutti i tweet nel tuo server di back-end utilizzando lo streaming e su ogni tweet pertinente notificherà a tutti gli utenti che utilizzano i messaggi push. – sahu

Problemi correlati