Construire avec l'API Twitter Gérer les listes

Ce que vous allez créer

Ceci est la deuxième partie de notre tutoriel sur les API de liste Twitter dans notre série plus large d’API Twitter. Dans ce tutoriel, nous allons passer en revue la construction de fonctionnalités de liste avec l'API. Des exemples de code sont fournis dans le référentiel Github. Les instructions d'installation sont décrites plus en détail ici (veillez à utiliser le référentiel fourni dans ce tutoriel et non le référentiel Birdcage initial répertorié sur cette page)..

Vue d'ensemble de l'API de liste Twitter

Encore une fois, il y a environ 19 API pour les listes Twitter, divisées en trois domaines principaux:

  • Gestion de liste (CRUD)
  • Liste des membres
  • Liste des abonnés

Commençons par intégrer certaines des fonctionnalités de base du développement d'API List.

Créer une liste

Lorsque vous chargez Birdcage, vous verrez le Gérer les listes page. Clique le Créer une liste option dans le menu de droite.

le Créer une liste formulaire sera affiché. Je vais créer une liste pour suivre les journalistes de Seattle sur Twitter:

Voici le code de création dans TwitterlistController.php. Il gère le code d’affichage du formulaire et, une fois celui-ci posté, le code de traitement:

 fonction publique actionCreate () $ model = new TwitterList; $ this-> performAjaxValidation ($ model); if (! isset ($ _ POST ['TwitterList'])) // chargement initial // charge le compte sélectionné en cours en tant que $ modèle-> account_id = Yii :: app () -> session ['account_id']; // forme d'affichage $ this-> render ('create', array ('model' => $ model,));  else // POSTed - Formulaire de processus $ modèle-> attributs = $ _ POST ['TwitterList']; // charge le compte sélectionné $ account = Account :: model () -> findByPK ($ model-> account_id); // se connecter à twitter $ twitter = Yii :: app () -> twitter-> getTwitterTokened ($ compte ['oauth_token'], $ compte ['oauth_token_secret']); // créer à distance sur Twitter $ new_list = $ twitter-> post ("lists / create", array ('nom' => $ modèle-> nom, 'description' => $ modèle-> description, 'mode' => $ model-> getModeString ($ model-> mode))); if (TwitterList :: model () -> isError ($ new_list)) // à faire - Définir une erreur flash var_dump ($ new_list); yexit ();  else $ model-> owner_id = $ account-> twitter_id; $ model-> list_id = $ new_list-> id_str; $ model-> slug = $ new_list-> slug; $ model-> full_name = $ new_list-> full_name; $ model-> created_at = date ('Y-m-d H: i: s', strtotime ($ new_list-> created_at)); $ model-> modified_at = new CDbExpression ('NOW ()'); if ($ model-> save ()) $ this-> redirect (array ('admin'));  

Vous pouvez lire la documentation sur les listes Twitter / Créer une API ici.

Une fois le formulaire soumis, vous verrez quelque chose comme ceci:

Importer des membres dans une liste

L'une des limites les plus frustrantes de l'interface utilisateur de Twitter List est la difficulté d'ajouter des membres. Vous devez visiter chaque membre et les ajouter individuellement à vos listes - le processus est très compliqué et lent.

Nous allons implémenter une fonctionnalité permettant de souscrire une liste de comptes Twitter séparés par des virgules.

Dans la liste, si vous cliquez sur le bouton Gérer la liste icône à droite de Journalistes de Seattle, tu verras le Afficher la liste page:

Cliquer sur Membres d'importation dans le menu de droite. Ensuite, tapez la liste des comptes Twitter que vous souhaitez ajouter à cette liste:

Passons en revue le code qui télécharge les membres sur Twitter. Le code pour afficher le formulaire ci-dessus commence par ListMemberController.php:

 / ** * Importer des membres dans une liste * / public function actionImport ($ id) $ model = new Import (); $ model-> list_id = $ id; // Décommentez la ligne suivante si la validation AJAX est nécessaire $ this-> performAjaxValidation ($ model); if (isset ($ _ POST ['Import'])) if ($ model-> save ()) $ result = ListMember :: model () -> import ($ id, $ _ POST ['Import'] [' liste des membres']); Yii :: app () -> user-> setFlash ('import_success', 'Merci! Vos membres ont été ajoutés.'); $ this-> redirect (array ('/ twitterlist / view', 'id' => $ id));  // end if save // ​​end if post else $ this-> render ('import', array ('modèle' => $ modèle, 'identifiant_liste' => $ id,)); 

dans le ListMember.php modèle, le code d'importation se présente comme suit. Nous utilisons preg_split convertir la liste des comptes en tableau. Ensuite, pour chaque compte, nous recherchons des informations sur le compte sur Utilisateurs / Afficher et publions l'ID Twitter sur les listes Créer par le membre.

fonction publique import ($ id, $ import_list) // récupère le compte $ tl = TwitterList :: model () -> findByAttributes (array ('id' => $ id)); $ list_id = $ tl ['list_id']; $ account = Account :: model () -> findByPk ($ tl-> account_id); // récupère les membres et les ajoute à la liste $ twitter = Yii :: app () -> twitter-> getTwitterTokened ($ compte ['oauth_token'], $ compte ['oauth_token_secret']); // convertit les lignes de publication en tableau $ add_list = preg_split ("(\ r | \ n |,)", $ import_list, -1, PREG_SPLIT_NO_EMPTY); $ max_count = 0; foreach ($ add_list as $ item) $ item = trim ($ item); $ user_info = $ twitter-> get ("utilisateurs / show", array ('nom_écran' => $ item)); if (ErrorLog :: model () -> isError ('getUserInfo', $ account ['id'], $ user_info)) continue;  if (ErrorLog :: model () -> isRateLimited ($ user_info)) continue;  // ajouter à distance à la liste $ people = $ twitter-> post ("lists / members / create", array ('id_liste' => $ id_liste, 'nom_écran' => $ item)); // ajoute localement à db $ this-> remote_add ($ list_id, $ user_info-> id_str, $ item); $ max_count + = 1; if ($ max_count> = 99) break;  public function remote_add ($ list_id, $ member_id, $ screen_name = 'tbd') TwitterUser :: model () -> setPlaceholder ($ member_id, $ screen_name); $ lm = ListMember :: model () -> findByAttributes (array ('list_id' => $ list_id, 'member_id' => $ member_id)); if (vide ($ lm)) $ lm = new ListMember; $ lm-> id_liste = $ id_liste; $ lm-> membre_id = $ membre_id; $ lm-> save (); 

Après avoir envoyé les membres, vous verrez quelque chose comme ceci:

le à déterminer représente un utilisateur qui ne figure pas déjà dans notre base de données; les informations de profil seront récupérées (hydratées) en arrière-plan plus tard.

Sur Twitter, vous verrez quelque chose comme ceci:

Synchronisation des listes

Maintenant que nous avons créé une liste, allons chercher les listes qui existent déjà dans notre compte afin de pouvoir les gérer à partir de notre console. Encore une fois, de la Gérer les listes menu, cliquez Synchroniser les listes.

L'action de synchronisation est codée dans TwitterlistController.php:

 fonction publique actionSync () TwitterList :: model () -> sync (); $ this-> redirect (array ('admin'));  

le TwitterList.php La synchronisation des modèles est relativement sophistiquée, comme indiqué ci-dessous. Tout d'abord, le modèle de synchronisation parcourt tous les comptes que vous avez configurés et appelle le syncOne compte pour les listes.

SyncOne appelle fetch Lists / Ownerships dans l’API pour rechercher toutes les listes appartenant à chaque compte.. 

 fonction publique sync () $ users = User :: model () -> findAll (); foreach ($ utilisateurs en tant que $ utilisateur) $ utilisateur_id = $ utilisateur ['id']; $ accounts = Account :: model () -> findAllByAttributes (array ('user_id' => $ user_id)); // boucle dans les comptes Twitter (peut être multiple) foreach ($ comptes en tant que $ compte) $ this-> syncOne ($ account ['id']);  // boucle du compte final // boucle de l'utilisateur final fonction publique syncOne ($ account_id) $ account = Account :: model () -> findByPk ($ account_id); $ twitter = Yii :: app () -> twitter-> getTwitterTokened ($ compte ['oauth_token'], $ compte ['oauth_token_secret']); // récupère les listes appartenant à ce compte $ twitter_lists = $ twitter-> get ("listes / propriétés", array ('count' => 100, 'cursor' => - 1)); // print_r ($ twitter_lists); if (count ($ twitter_lists-> lists) == 0) renvoie; foreach ($ twitter_lists-> se présente sous la forme $ tl) // echo $ tl-> id_str. ". $ tl-> slug.". $ tl-> membre_compte; lb (); $ this-> remote_add ($ account_id, $ tl); // action spawn pour obtenir les membres de la liste $ this-> addMembershipAction ($ account_id, $ tl-> id_str);  // boucle de fin des listes

Cependant, plutôt que d'essayer d'extraire les membres de la liste en temps réel, ce qui entraînerait probablement une expiration du délai, cela crée une action en arrière-plan pour extraire les membres d'une liste donnée..

 fonction publique addMembershipAction ($ account_id, $ item_id) // ajoute une action de tâche en arrière-plan pour extraire les appartenances pour une liste id $ check_dup = Action :: model () -> findByAttributes (array ('account_id' => $ account_id, 'action '=> Action :: ACTION_MEMBERSHIPS,' status '=> Action :: STATUS_ACTIVE,' item_id '=> $ item_id)); if (empty ($ check_dup)) $ a = nouvelle action (); $ a-> account_id = $ account_id; $ a-> action = Action :: ACTION_MEMBERSHIPS; $ a-> item_id = $ item_id; $ a-> last_tweet_id = 0; // set cursor $ a-> status = Action :: STATUS_ACTIVE; $ a-> created_at = new CDbExpression ('NOW ()'); $ a-> modified_at = new CDbExpression ('NOW ()'); $ a-> save ();  

La tâche cron en arrière-plan appelle la Action.php modèle qui appelle getListMembership pour une liste à la fois.

 fonction publique getListMembership ($ action, $ limit = 50) // collecte les prochains membres $ limit de la liste $ account = Account :: model () -> findByPk ($ action-> account_id); // last_tweet_id est le curseur $ cursor = $ action-> last_tweet_id; if ($ cursor == 0) $ cursor = -1; // puisque last_tweet_id n'est pas signé, ne peut pas stocker -1 start $ result = TwitterList :: model () -> getMemberships ($ compte, $ action-> item_id, $ curseur, $ limite); $ a = Action :: model () -> findByPk ($ action-> id); if ($ result-> rateLimit) retourne faux;  else if ($ result-> complete) $ a-> status = self :: STATUS_COMPLETE; $ a-> save ();  else // définir le curseur le plus bas $ a-> last_tweet_id = $ result-> cursor; $ a-> save (); 

Lorsque la tâche est exécutée, elle appelle le TwitterList.php des modèles getMemberships méthode. Cette méthode utilise le curseur pour parcourir les enregistrements de membres sans dépassement du délai imparti ni limite de taux. Le dernier curseur est stocké dans la table Action afin que la prochaine invocation en arrière-plan puisse continuer d'ajouter des membres là où elle était précédemment laissée.. 

 fonction publique getMemberships ($ compte, $ id_liste, $ curseur = -1, $ limite = 200) echo 'en entrant getMemberships: id_compte:'. $ compte ['id']. ' list_id: '. $ list_id.' curseur: '. $ curseur; lb (); $ result = new StdClass; $ résultat-> curseur = -1; $ résultat-> compte = 0; $ résultat-> erreur = faux; $ résultat-> complet = faux; $ result-> rateLimit = false; $ count_people = 0; // récupère les membres et les ajoute à la liste $ twitter = Yii :: app () -> twitter-> getTwitterTokened ($ compte ['oauth_token'], $ compte ['oauth_token_secret']); echo 'ici'. $ curseur; lb (); while ($ cursor <> 0) echo 'inside'; lb (); $ people = $ twitter-> get ("lists / members", array ('list_id' => $ list_id, 'cursor' => $ cursor, 'skip_status' => true, 'include_entities' => false)); if (ErrorLog :: model () -> isError ('getMemberships', $ compte ['id'], $ personnes)) $ result-> error = false; return $ result;  if (ErrorLog :: model () -> isRateLimited ($ personnes)) $ result-> rateLimit = true; return $ result;  if (isset ($ people-> next_cursor)) $ cursor = $ people-> next_cursor; sinon $ curseur = 0; $ résultat-> curseur = $ curseur; $ count_people + = count ($ personnes-> utilisateurs); echo 'Compter les personnes:' .count ($ personnes-> utilisateurs); lb (); foreach ($ personnes-> utilisateurs sous la forme $ u) // var_dump ($ u); lb (); echo 'Membre:'. $ u-> nom_écran; lb (); if (isset ($ u-> nom_écran)) $ nom_écran = $ u-> nom_écran; else $ nom_écran = 'tbd'; ListMember :: model () -> remote_add ($ id_list, $ u-> id_str, $ nom_écran);  if (nombre ($ personnes-> utilisateurs) == 0 ou $ curseur == 0) $ résultat-> complet = true; return $ result;  // fin de la boucle echo 'à la sortie de getMemberships'; lb (); return $ result;  

Vous devriez voir quelque chose comme ceci à la fin de l'opération:

Une fois les tâches en arrière-plan terminées, vous verrez les membres de chaque liste comme ceci:

Et après?

J'espère que vous avez apprécié cette série d'api sur Twitter List jusqu'à présent. J'aimerais entendre vos suggestions de scénarios d'API préférés et de demandes de fonctionnalités; merci de les poster dans les commentaires.

Si vous avez des questions ou des suggestions, postez-les dans les commentaires. Si vous souhaitez suivre mes futurs tutoriels Tuts + et d'autres séries, visitez la page de mon instructeur ou suivez @reifman..

Liens connexes

  • Construire avec l'API Twitter: Le pouvoir des listes (Tuts +)
  • API Twitter pour les listes
  • 10 façons d'utiliser les listes Twitter (mashable)