Construire avec l'API Twitter Créer des amis à suivre

Ce que vous allez créer

Bienvenue! Je sais que cela fait un moment que j'ai ajouté à notre série d'API Twitter. J'ai été un peu occupé. Il y avait d'abord la tumeur au cerveau, puis la radiochirurgie robotique, puis la série de programmes Yii Programming en cours et la série de startups associée, et enfin, le lancement de Meeting Planner..

J'ai décidé d'écrire le tutoriel d'aujourd'hui en utilisant l'API Twitter pour créer des amis (ce que Twitter appelle les personnes que vous suivez).

Pourquoi? Eh bien, la bizarre élection présidentielle américaine de 2016 a mis en lumière certains des abus et du harcèlement qui se produisent tous les jours sur Twitter, quelque chose que la société n’a guère filtré - et en tant que programmeurs, nous savons que ce n’est pas si difficile. On craint simplement de perdre son auditoire de déplorables haineux qui génèrent une part importante des revenus publicitaires.

De nombreuses femmes ont quitté le service en raison de son harcèlement permanent - pour lequel Twitter s'excuse parfois, affirmant qu'il tente de permettre la liberté d'expression. Franchement, il n'y a pas de liberté d'expression lorsque le harcèlement abusif est indéfiniment présent.

Il y a également eu des articles soulignant combien de disciples sont principalement des hommes. Bien que Twitter ne demande pas aux utilisateurs leur sexe, il analyse statistiquement le genre des comptes de ses annonceurs.. 

Et vous pouvez jeter un coup d'œil sur les propres estimations démographiques de Twitter advertising dans ses pages d'analyse. Comme vous pouvez le voir ci-dessous, Twitter estime que 69% de mes abonnés sont des hommes..

Perdu dans le vacarme, les voix de femmes peuvent être plus difficiles à trouver sur Twitter. Mais ils sont dehors. Selon Pew, 21% des femmes Internet utilisent Twitter, tandis que 25% des hommes utilisent Internet..

Alors aujourd'hui, je vais vous guider dans l'utilisation du framework Yii2 pour PHP pour accéder à l'API Twitter et automatiser l'ajout d'amis à des comptes Twitter de personnes.. (Si vous souhaitez en savoir plus sur Yii2, consultez notre série parallèle. Programmation avec Yii2.)

Et, j'ai créé un site Web, Twixxr.com, qui vous permettra de démontrer la fonctionnalité en ajoutant des femmes importantes sur Twitter pour que votre compte suive.

Si vous avez des questions ou des commentaires, merci de les publier ci-dessous dans les commentaires ou de me contacter sur Twitter @reifman.

Regard sur le passé: tutoriels API Twitter

Bien que j'aie écrit une poignée de tutoriels sur les API Twitter dans le passé, ils ont tous été basés sur le code Yii 1.x. Yii2 est disponible depuis longtemps et, bien que j'aie écrit sur la connexion à OAuth, je n'ai pas écrit sur les aspects de l'API pour votre propre compte et / ou sur le compte de comptes authentifiés pour la structure mise à niveau. Et ce n'était pas facile, il n'y a pas encore de bons plugins Yii2 pour Twitter.

Voici quelques-uns de mes tutoriels que vous pourrez relire:

Le tutoriel d'aujourd'hui vous guidera non seulement dans l'utilisation d'OAuth pour authentifier les comptes des visiteurs du site, mais vous montrera également comment ajouter des amis à leur compte à l'aide de l'accès qu'ils vous ont accordé.. 

Utilisation de la bibliothèque PHP TwitterOAuth

Malheureusement, je n'ai pas pu trouver une extension API de travail Twitter robuste pour Yii2. J'ai donc exploité la bibliothèque générique PHP OAuth de Twitter pour créer mon propre modèle Twitter..

Un grand nombre d'API complexes ne fournissent pas une bonne documentation et j'ai apprécié la procédure pas à pas fournie en direct par TwitterOAuth. C'est incroyablement utile:

Objectifs du service produit

Le service Twixxr authentifiera les visiteurs du site, puis ajoutera automatiquement de nouveaux amis à leurs comptes. Les amies seront choisies parmi plus de 600 femmes influentes que j'ai identifiées sur Twitter:

Commençons par parcourir le code.

Authentification d'un utilisateur

Mon TwitterController.php a deux méthodes de base, demande et retour. Voici la méthode de la requête:

fonction publique actionRequest () if (Yii :: $ app-> utilisateur-> isGuest) // l'utilisateur ne s'est pas connecté au yii site $ t = new Twitter (); $ url = $ t-> getAuthorizeUrl (); $ this-> redirect ($ url);  else // déjà vérifié avec nous, recherchez leurs clés d'accès $ t = new Twitter (); $ t-> refreshConnection (Yii :: $ app-> user-> getId ()); $ this-> goHome (); 

Le modèle Twitter.php invoqué dans nouveau Twitter (); obtient un unique getAuthorizeURL () pour que vous redirigiez un visiteur du site vers la page d'authentification Twitter, par exemple. https://api.twitter.com/oauth/authorize?oauth_token=q-7ChxxxxxxxnpXAAABzzzzzzz6E:

Une fois que l'utilisateur a autorisé votre application sur Twitter, il est redirigé vers notre méthode de retour:

fonction publique actionReturn () // retour de l'authentification / * Si oauth_token est ancien, redirige vers la page de connexion. * / if (isset ($ _ REQUEST ['oauth_token'])) && Yii :: $ app-> session ['oauth_token']! == $ _REQUEST ['oauth_token']) Yii :: $ app-> session [' oauth_status '] =' oldtoken '; retourne $ this-> goHome ();  $ t = new Twitter (); $ user_id = $ t-> getConnection ($ _ REQUEST ['oauth_verifier']); $ person = new \ common \ models \ User; $ identity = $ person-> findIdentity ($ user_id); $ u = User :: findOne ($ user_id); if ($ identity-> validateAuthKey ($ u-> auth_key)) Yii :: $ app-> user-> login ($ identity);  $ this-> redirect (['twixxr / amplify']); 

Le modèle Twitter utilise votre clé de consommateur d'application et votre secret de consommateur, que vous recevez lors de son inscription auprès du service:

consumerKey = Yii :: $ app-> composants ['authClientCollection'] ['clients'] ['twitter'] ['consumerKey']]; $ this-> consumerSecret = Yii :: $ app-> composants ['authClientCollection'] ['clients'] ['twitter'] ['consumerSecret'];  

La méthode de retour indiquée ci-dessus enregistre ensuite un utilisateur et stocke ses clés d'accès à long terme pour le compte. Cela vous permet d'effectuer des appels d'API en leur nom indéfiniment:

fonction publique getConnection ($ oauth_verifier = ") $ connection = new TwitterOAuth ($ this-> consumerKey, $ this-> consumerSecret, Yii :: $ app-> session ['oauth_token'], Yii :: $ app-> session ['oauth_token_secret']); / * Création d'un objet TwitteroAuth avec clé / secret d'application et clé de secret / clé de clé par défaut * / $ access_token = $ connection-> oauth ("oauth / access_token", ["oauth_verifier" => $ oauth_verifier ]); / * Enregistrer les jetons d’accès. Normalement, ceux-ci seraient enregistrés dans une base de données pour une utilisation ultérieure. * / $ User_id = $ this-> register ($ access_token); // Yii :: $ app-> session ['access_token '] = $ access_token; / * Supprimer les jetons de demande dont vous n'avez plus besoin * / unset (Yii :: $ app-> session [' oauth_token ']); unset (Yii :: $ app-> session [' oauth_token_secret ']); $ this-> connection = new TwitterOAuth ($ this-> consumerKey, $ this-> consumerSecret, $ access_token ['oauth_token'], $ access_token ['oauth_token_secret']); return $ user_id; fonction publique registre ($ access_token) $ screen_name = $ access_token ['screen_name']; $ source_id = $ access_token ['user_i ré']; $ user = User :: find () -> où (['nomutilisateur' => $ nom_écran]) -> un (); if (is_null ($ user)) // les inscrire $ user = new User (); $ utilisateur-> nom d'utilisateur = $ nom_écran; $ user-> email = $screen_name.'@twixxr.com '; $ user-> setPassword (Yii :: $ app-> security-> generateRandomString (12)); $ user-> generateAuthKey (); $ user-> save ();  $ auth = Auth :: find () -> où (['source_id' => $ source_id]) -> un (); if (is_null ($ auth)) // ajoute une entrée d'authentification $ auth = new Auth (); $ auth-> user_id = $ user-> id; $ auth-> source = 'twitter'; $ auth-> source_id = $ source_id; $ auth-> nom_écran = $ utilisateur-> nom d'utilisateur; $ auth-> oauth_token = $ access_token ['oauth_token']; $ auth-> oauth_token_secret = $ access_token ['oauth_token_secret']; $ auth-> x_auth_expires = 0; $ auth-> save ();  else $ auth-> oauth_token = $ access_token ['oauth_token']; $ auth-> oauth_token_secret = $ access_token ['oauth_token_secret']; $ auth-> update ();  return $ user-> id; 

Pour un accès en lecture-écriture à leurs comptes, j'étends la table Auth à partir du simple accès à l'authentification décrit dans la section Simplification de Onramp avec OAuth de notre série Démarrage, afin d'inclure ces clés de vérification supplémentaires..

Je vous encourage également à parcourir le live étape par étape sur TwitterOAuth. C'est un excellent exemple montrant tout en action avec votre propre compte Twitter.

Importation de noms, de profils de profil et de photos

Ensuite, j'ai créé un modèle Twixxr.php qui fournirait une variété de fonctions importantes spécifiques au service. Tout d'abord, j'ai créé Twixxr :: loadProfiles ()  pour synchroniser les noms, les bios et les décomptes liés à Twitter, par exemple. photos de profil, messages d'état, suiveurs, suivants de chaque femme identifiée dans ma base de données statique d'articles.

fonction publique loadProfiles () // clean Table d'éléments $ this-> cleanup (); $ t = new Twitter (); $ t-> refreshConnection (1); // pour l'utilisateur admin = 1 $ time_stale = time () - (24 * 3600); $ people = Item :: find () -> where ('updated_at<'.$time_stale) ->ouWhere ('updated_at = created_at') -> orderBy ('rand ()') -> all (); $ cnt = 0; foreach ($ personnes comme $ i) // à faire - ou si mises à jour à est périmé si ($ i-> détail == ") $ résultat = $ t-> getUsersShow ($ i-> chemin); echo $ i-> chemin. ','; if (isset ($ résultat-> erreurs)) var_dump ($ result); continuer; if (isset ($ résultat-> nom)) $ i-> title = Html: : encode ($ this-> removeEmoji ($ result-> name)); if ($ i-> title == ") $ i-> title = 'n / a';  if (isset ($ result-> nom_écran)) $ i-> chemin = $ résultat-> nom_écran;  if (isset ($ result-> description)) $ i-> detail = Html :: encode ($ this-> removeEmoji ($ result-> description));  if (isset ($ result-> profile_image_url_https)) $ i-> image_url = $ result-> profile_image_url_https;  $ i-> validate (); var_dump ($ i-> getErrors ()); $ i-> update (); SocialProfile :: fill ($ i-> id, $ result); $ cnt + = 1; si ($ cnt> 25) quitte; 

Ceci est appelé par un travail cron de console que je décrirai plus tard dans la série Yii2. Ces profils sont donc synchronisés progressivement et de manière répétée à des intervalles spécifiques sur plusieurs jours..

Suivre: créer une amitié

Je ne détaillerai pas ici, mais j'ai essentiellement créé un tableau de consignation des demandes individuelles pour chaque utilisateur et compte féminin. En d'autres termes, Samuel aurait 500 entrées demandant l'ajout d'amitié pour chaque femme dans la base de données..

Tout d’abord, cependant, je voudrais que Samuel (et tous les utilisateurs de Twixxr) suivent le compte Twixxr_com.

$ result = $ t-> createFriend ('twixxr_com'); $ demande_totale + = 1; if ($ result! == false) $ action-> status = Log :: STATUS_COMPLETE; $ action-> save (); 

Avant que le travail cron traite ces commandes, il actualise l'autorisation et la connexion Twitter pour Samuel et chaque utilisateur individuel à l'étape appropriée:

$ t-> refreshConnection ($ action-> id_utilisateur);

Ensuite, voici le Twitter :: createFriend ($ nom_écran) méthode:

fonction publique createFriend ($ username) $ add = $ this-> connection -> post ("amitiés / créer", ["nom_écran" => $ username]); if ($ this-> connection-> getLastHttpCode () == 200) // retour réussi $ add;  else // Traitement des cas d'erreur return false; 

Ensuite, il le fait pour toutes les femmes demandées par Samuel, comme indiqué dans le tableau Journal - et bien sûr, il se passe beaucoup de choses ci-dessous, que je vais décrire:

echo 'add'. $ personne-> chemin. ' à '. $ action-> user_id.'
'; if ($ x> 7) $ mode = 'limité'; echo 'Limité au nombre maximal de demandes par utilisateur
'; // ignore cet utilisateur et passe au suivant… continue; // on au prochain utilisateur $ follow_by = $ t-> getFriendshipsShow ($ u-> nom d'utilisateur, $ person-> chemin); if ($ follow_by == -10) echo 'error limit rate
'; $ mode = 'limité'; // ignore cet utilisateur et passe au suivant… continue; // passe à l'utilisateur suivant else if ($ follow_by == 0) $ x + = 1; demande echo suivre
'; $ result = $ t-> createFriend ($ person-> path); $ demande_totale + = 1; if ($ result! == false) $ action-> status = Log :: STATUS_COMPLETE; $ action-> completion_at = time (); $ action-> save (); else echo 'ignorer pour cause d'erreur'; $ action-> status = Log :: STATUS_SKIP_ERROR; $ action-> completion_at = time (); $ action-> save (); else echo 'déjà suivi

'; $ action-> status = Log :: STATUS_SKIPPED; $ action-> save ();

L'API de Twitter impose une limitation stricte du débit, et rend parfois difficile l'utilisation de leur API. La tâche cron ci-dessus crée des amitiés pour sept comptes cibles à la fois avant de passer à la demande d'un autre utilisateur jusqu'à son appel ultérieur..

Voici Twitter :: getFriendshipsShow (), qui vérifie si ce compte suit déjà le compte souhaité. Dans le code ci-dessus, il ignore les demandes redondantes, afin d’épargner la limite de débit..

fonction publique getFriendshipsShow ($ nom_source, $ nom_cible) $ result = $ this-> connexion-> get ("amitiés / show", ["nom_écran_source" => $ nom_source, "nom_écran_cible" => $ nom_cible]); if (isset ($ résultat-> erreurs)) if ($ résultat-> erreurs [0] -> message == 'Limite de débit dépassée') return -10;  else si (isset ($ résultat-> relation-> cible-> suivi_by)) si ($ résultat-> relation-> cible-> suivi_by) retour 1;  else retour 0;  return -1; 

Dans un proche avenir, je vais implémenter l'API en masse de Twitter pour cela, en effectuant un seul appel au lieu de centaines par utilisateur à l'aide de get / friendships / lookup. Notez que vous aurez besoin d'un compte de développeur pour accéder à cette page..

Non suivi: Détruire une amitié

Vous pouvez également annuler ces amitiés via l’API:

$ statuses = $ connection-> post ("amitiés / détruire", ["nom_écran" => $ u]);

J'enregistre chaque connexion établie par Twixxr. Si les limites de taux des API de Twitter étaient moins lourdes et fastidieuses, j'autoriserais les visiteurs à avoir une fonctionnalité d'annulation pour Twixxr, permettant de ne plus suivre toutes les femmes si elles n'apprécient pas les nouvelles comptes. 

Performance

J'ai beaucoup travaillé dans Twixxr pour gérer les performances. Fondamentalement, j'ai construit la table Log pour enregistrer rapidement toutes les amitiés demandées par l'utilisateur. Mais tout cela est traité en arrière-plan.

Malheureusement, l'API Twitter ne permet pas de publier en bloc une liste de comptes à suivre. Il n'y a simplement aucun moyen de le faire en temps réel lorsque l'utilisateur est sur votre site..

La réponse de l'utilisateur à une demande Twixxr est donc immédiate, mais le suivi de tous les comptes peut prendre plusieurs heures..

Voici la méthode TwixxrController.php follow All:

fonction publique actionAll () // demande à l'utilisateur authentifié de suivre tous les profils Twitter $ x = new Twixxr (); $ x-> followTwixxr (Yii :: $ app-> user-> getId ()); $ x-> followAll (Yii :: $ app-> user-> getId ()); Yii :: $ app-> getSession () -> setFlash ('success', Yii :: t ('frontend', 'Votre demande a été ajoutée à notre file d'attente.')); $ this-> redirect (['twixxr / complete', ['task' => 'all']]); // redir la maison

Voici les Twixxr :: followAll et suivreCompte méthodes qui sont également utilisées par les boutons numérotés ci-dessus, pour suivre 100, 200, 300 femmes, etc..

fonction publique followAll ($ user_id) $ allWomen = Item :: find () -> count (); $ this-> followCount ($ user_id, $ allWomen);  fonction publique followCount ($ user_id, $ cnt = 100) $ women = Item :: find () -> orderBy ('rand ()') -> limit ($ cnt) -> all (); foreach ($ femmes en tant que $ w) $ l = Log :: find () -> où (['user_id' => $ user_id, 'item_id' => $ w-> id]) -> one (); if (! is_null ($ l)) $ l-> status = Log :: STATUS_PENDING; $ l-> update ();  else $ l = new Log (); $ l-> user_id = $ user_id; $ l-> item_id = $ w-> id; $ l-> event_id = Twixxr :: EVENT_ADD; $ l-> status = Log :: STATUS_PENDING; $ l-> save (); 

Ils créent juste des entrées de journal pour chaque demande d'amitié que le travail cron doit traiter en arrière-plan..

Et après?

J'espère que vous avez aimé apprendre à utiliser TwitterOAuth.php dans Yii2 et à autoriser et appliquer l'API Twitter au nom des utilisateurs de votre site..

Ensuite, j'aimerais utiliser l'API Twitter pour analyser mes propres suiveurs. Je soupçonne que la grande majorité des abonnés sur Twitter sont des robots spammy, et j'aimerais utiliser l'API pour le prouver. Restez à l'écoute.

Si vous avez des questions ou des suggestions, postez-les dans les commentaires. Si vous souhaitez suivre mes futurs tutoriels et séries d’Envato Tuts +, veuillez visiter la page de mon instructeur ou suivre @reifman. Vérifiez certainement ma série de démarrage et planificateur de réunion.

Liens connexes

  • Twixxr 
  • Comment programmer avec la série Yii2 (Envato Tuts +)
  • Yii2 Developer Exchange, mon site de ressources Yii2
  • Comment utiliser yii2-authclient pour communiquer avec Twitter à l'aide d'un jeton d'accès unique (Documentation Yii)
  • Documentation développeur Twitter
  • Bibliothèque Twitter OAuth PHP