Construire avec l'API Twitter Utiliser des flux en temps réel

Ce que vous allez créer

Bien que l'API REST de Twitter convienne à de nombreuses applications, si vous souhaitez des mises à jour immédiates et un accès à un plus grand nombre de notifications, l'API Twitter Streaming est essentielle. Par exemple, seule l’API de diffusion en continu vous dira quand un autre utilisateur ajoute un de vos tweets.

L'utilisation de l'API Streaming nécessite une connexion persistante et continue entre votre serveur Web et Twitter. Ce type d'implémentation peut ne pas être familier à de nombreux développeurs PHP. Dès que les tweets arrivent, Twitter avertit votre serveur en temps réel, ce qui vous permet de les stocker dans votre base de données sans délai d'interrogation de l'API REST. L'utilisation de l'API Streaming n'est pas non plus soumise aux limites de taux de l'API de Twitter..

Voici une visualisation de la façon dont cela fonctionne:

Il existe trois variantes de l'API Twitter Streaming:

  1. Le flux public. Cela permet à votre application de surveiller les données publiques sur Twitter, telles que les tweets publics, les filtres de hashtag, etc.. 
  2. Le flux d'utilisateur. Cela vous permet de suivre en temps réel le flux tweet d'un utilisateur. La troisième partie de cette série se concentrera sur le flux d'utilisateurs. 
  3. Site Streams. Les flux de site permettent à votre application de surveiller les flux Twitter en temps réel pour un grand nombre d'utilisateurs.. 

La mise en œuvre de votre diffusion en continu consiste à enregistrer les événements entrants le plus rapidement possible et à les traiter en arrière-plan à l'aide de l'API REST, selon les besoins, pour collecter des données plus profondes. Les flux de sites nécessitent une approbation préalable de Twitter, qui est probablement réservée aux grandes entreprises et aux développeurs..

Heureusement, il existe une bibliothèque libre et open-source appelée Phirehose, qui met en œuvre la plupart des exigences relatives aux API de diffusion en continu. Ce tutoriel décrira comment intégrer Phirehose à notre application open-source Birdcage.

La bibliothèque Phirehose

Phirehose est une fantastique implémentation PHP à code source ouvert des exigences de l’API Twitter Stream écrites par Fenn Bailey. Comme il le décrit, Phirehose est censé:

  • fournir une interface simple à l'API Twitter Streaming pour les applications PHP
  • se conformer aux recommandations de l'API de diffusion en continu pour la gestion des erreurs, la reconnexion, etc..
  • encourager les clients API de streaming bien éduqués
  • fonctionner indépendamment des extensions PHP (mémoire partagée, PCNTL, etc.)

J'ai trouvé la bibliothèque fonctionner parfaitement. Il y a plus de documentation Phirehose ici.

Il est conçu pour maintenir la connexion avec Twitter et répondre au flux de données de Twitter tout en fonctionnant indéfiniment sans interruption. Il n'est pas destiné à effectuer un traitement détaillé sur tweet et une hydratation des données, ce que nous avons décrit dans la deuxième partie de cette série. Cela peut être fait séparément.

Faire tourner Phirehose indéfiniment

En règle générale, vous ne pouvez pas exécuter une tâche périodique Web typique en tant qu'opération de maintien en activité indéfinie. Il vaut mieux créer un démon en ligne de commande.

L'une des fonctionnalités puissantes offertes par Yii est la possibilité d'exécuter des applications basées sur une console à partir de la ligne de commande. Cela nous permettra d’exécuter une application en ligne de commande keep-alive qui utilise l’ensemble du framework Birdcage PHP et MySQL que nous avons construit..

Construire une commande de console Yii

dans le / app / répertoire, en dehors de la racine accessible Web, nous allons ajouter un stream.php fichier qui exécute notre commande de console de streaming Phirehose:

courir();

Ensuite, nous allons construire le fichier de commande réel, StreamCommand.php, dans le / app / protected / orders annuaire:

findByPk (1); $ c = nouveau consommateur ($ result ['oauth_token'], $ result ['oauth_token_secret'], Phirehose :: METHOD_USER); // charge les clés de l'application Twitter $ app = UserSetting :: model () -> loadPrimarySettings (); $ c-> consommateurKey = $ app ['twitter_key']; $ c-> consumerSecret = $ app ['twitter_secret']; $ c-> consomme (); 

Il lancera le processus Phirehose, Consumer, à l'aide de notre application Twitter et de nos clés d'utilisateur..

Remarque: aux fins de l'exemple de diffusion en continu de Birdcage, nous supposons qu'un seul compte Twitter est enregistré et que le code matériel chargeant les informations d'identification, par exemple. account_id = 1.

Intégrer Phirehose

Pour intégrer Phirehose dans Birdcage, j'ai déménagé OAuthPhirehose.php et UserstreamPhirehose.php dans le / app / protected / components annuaire. Dans mon main.php fichier de configuration, j'ai ajouté phirehose à la liste des composants chargés:

 'précharge' => tableau ('log', 'bootstrap', 'mailgun', 'phirehose', 'advanced'), 

Ensuite, j'ai créé une migration de base de données pour créer une table dans laquelle stocker les données brutes du flux Twitter:

la classe m140919_193106_create_stream_table étend CDbMigration protected $ MySqlOptions = 'ENGINE = InnoDB CHARSET = utf8 COLLATE = utf8_unicode_ci'; public $ tablePrefix; public $ tableName; fonction publique before () $ this-> tablePrefix = Yii :: app () -> getDb () -> tablePrefix; if ($ this-> tablePrefix <> ") $ this-> tableName = $ this-> tablePrefix.'stream '; fonction publique safeUp () $ this-> before (); $ this-> createTable ($ this -> tableName, array ('id' => 'pk', 'tweet_id' => 'bigint (20) unsigned NOT NULL', 'code' => 'text NULL', 'is_processed' => 'tinyint default 0' , 'created_at' => 'DATETIME NOT NULL DEFAULT 0', 'modified_at' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',), $ this-> MySqlOptions); $ this-> createIndex ('tweet_id', $ this- > nom_table, 'tweet_id', true);

J'ai aussi créé un nouveau modèle appelé Consumer.php qui s'étend OauthPhirehose avec son requis enqueueStatus méthode. 

Nous souhaitons minimiser le temps de traitement requis par la réponse en temps réel. Essentiellement, nous souhaitons simplement enregistrer les données reçues de Twitter dans notre base de données, et rien d’autre. Nous pouvons effectuer d'autres traitements dans nos propres tâches d'arrière-plan sans ralentir la connexion en continu de Phirehose. Ma fonction prend juste les données tweet du flux entrant et les stocke dans la table des flux:

id_str))) return; $ s = new Stream; $ s-> tweet_id = $ stream_item-> id_str; $ s-> code = base64_encode (serialize ($ stream_item)); $ s-> is_processed = 0; $ s-> created_at = new CDbExpression ('NOW ()'); $ s-> modified_at = new CDbExpression ('NOW ()'); $ s-> save (); var_dump ($ stream_item); ?> 

Nous nous appuierons sur les tâches d’arrière-plan exécutées par notre DaemonController pour traiter les données dans le modèle Bircdcage Tweet. Ceci est décrit plus en détail ci-dessous.

Activer le Phirehose

Vous pouvez tester Phirehose en utilisant la commande de la console PHP:

php ./app/stream.php Stream

Twitter enverra un flux d’informations suivies pour le compte de l’utilisateur, suivies des données en temps réel à l’arrivée..

Pour activer Phirehose en tant que commande de console persistante, toujours active, nous allons utiliser la commande nohup, par exemple. pas de blocage, et redirige la sortie vers dev / null:

nohup php ./app/stream.php Flux> / dev / null 2> & 1 &

Ubuntu répondra avec un identifiant de travail de votre processus pour une surveillance et une résiliation futures:

[1] 9768

Si vous souhaitez vérifier que le processus est en cours d'exécution, recherchez dans la liste des tâches l'identifiant du travail:

ps -e tous | grep 9768

Vous devriez voir quelque chose comme ça:

0 1000 9768 9743 20 0 273112 16916 sondages Pts / 0 0:00 php ./app/stream.php Flux

Et vous pouvez mettre fin à Phirehose en éliminant l'identifiant du travail:

tuer 9768

D'après mon expérience, Phirehose a parfaitement fonctionné avec cette technique sans interruption au cours des deux dernières semaines..

Traitement des données en streaming

Nous devons également créer un processus d'arrière-plan dans Birdcage, qui traitera les données en continu dans nos tables Tweet, Mention, URL et Hashtag, comme si elles provenaient de l'API REST..

Change ton twitter.ini paramètre de fichier pour utiliser les flux:

twitter_stream = true

Et nous pouvons utiliser le même travail cron de la deuxième partie pour exécuter cette opération:

# Pour définir l'heure, vous pouvez fournir des valeurs concrètes pour # minute (m), heure (h), jour du mois (dom), mois (lun), # et jour de la semaine (Dow) ou utilisez '*' dans ces champs. (pour 'any'). # # Notez que les tâches seront démarrées en fonction de la notion de temps et de fuseaux horaires du démon système de cron. # # Par exemple, vous pouvez exécuter une sauvegarde de tous vos comptes utilisateurs # à 5 heures du matin chaque semaine avec: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # mh commande mon mon * / 5 * * * * wget -O / dev / null http://birdcage.votredomaine.com/daemon/index

Ensuite, lorsque DaemonController est appelé, il activera le flux modèle() méthode de traitement:

 fonction publique actionIndex () // si nous n'utilisons pas les flux Twitter, nous traiterons les tweets par l'API REST si (! Yii :: app () -> params ['twitter_stream']) Tweet :: model () -> getStreams ();  else Stream :: model () -> process (); 

La méthode de processus décompresse les données du flux codé et analyse chaque entrée comme nous l'avons fait avec le contenu de l'API REST:

 public function process () // récupère les tweets non traités du moteur de flux // à faire $ account_id = 1; $ items = Stream :: model () -> non traité () -> findAll (); foreach ($ items en tant que $ i) $ tweet = unserialize (base64_decode ($ i ['code']))); Tweet :: model () -> parse ($ account_id, $ tweet); $ this-> setStatus ($ i ['id'], self :: STREAM_PROCESSED); 

Birdcage ignore actuellement les données du flux qui ne sont pas un tweet, par exemple. notifications, messages directs, etc. Je vous laisse développer, ou vous pouvez consulter mon application étendue, Birdhouse.

En clôture

J'espère que vous avez trouvé cette série d'API Twitter en trois parties informative et utile. A présent, vous avez découvert OAuth, l'API REST, l'API Streaming, la construction d'une base de données pour Twitter, le traitement de la timeline avec les deux types d'API, le comptage correct des caractères dans les tweets et leur publication, et plus encore..

S'il vous plaît poster des commentaires, des corrections ou des idées supplémentaires ci-dessous. Vous pouvez parcourir mes autres tutoriels Tuts + sur ma page d’auteur ou me suivre sur Twitter @reifman.