Construire avec l'API Twitter Analyser vos suiveurs

Ce que vous allez créer

introduction

Bienvenue dans le dernier épisode de notre série API Twitter. Dans notre dernier épisode, j'ai construit Twixxr.com qui vous permettra de découvrir des femmes influentes sur Twitter et que votre compte suivra. Aujourd'hui, je vais tourner le focus vers l'intérieur pour regarder mes propres partisans.

Bien que je n’utilise plus vraiment Facebook depuis 2013, je suis restée active sur Twitter, même si mon flux d’annonces était rempli d’annonces et que cela me gênait en essayant de l’optimiser de manière algorithmique.. 

Récemment, j'ai été vérifié et j'ai commencé à rassembler des adeptes à un rythme légèrement plus rapide. J'espérais pouvoir voir plus de réponses à mes tweets. De manière générale, j'ai été surpris par le peu de réponses qu'il y a habituellement sur Twitter pour une personne moyenne..

J'ai près de 1 900 abonnés, mais il est rare que les gens commentent ou retweetent des articles que je considère importants et d’intérêt général. Par exemple, pas une seule personne n'a partagé mon article sur la flambée des rapports sur les viols à Seattle ni sur Bill Gates dans son article le plus scandaleusement hypocrite.. 

Pendant longtemps, j'ai voulu examiner de plus près mes abonnés sur Twitter et répondre à quelques questions: qui me suit exactement? Et pourquoi ne sont-ils pas plus interactifs? Est-il possible que seulement 10% de mes adeptes soient de vraies personnes? 

Twitter a eu du mal à trouver un acheteur, et peut-être que cela a quelque chose à voir avec ça.

L'API Twitter est un bon outil pour étudier cela. Pourtant, il a une tonne de limites de taux qui rendent même quelque chose de simple, comme l'analyse de vos abonnés, assez complexe. Dans l'épisode d'aujourd'hui, je vais vous montrer comment j'ai utilisé les limites de taux pour évaluer et créer un tableau de bord de mes abonnés..

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

Analyser nos abonnés Twitter

Juste au-dessus, vous pouvez voir le tableau de bord de base que j'ai créé. L'épisode d'aujourd'hui portera principalement sur l'infrastructure et l'approche que j'ai adoptées pour le créer. J'espère avoir l'occasion d'écrire davantage sur l'amélioration du mécanisme de notation.

Et oui, comme vous pouvez le voir ci-dessus, le célèbre leader des droits des homosexuels et conseiller en matière de sexualité, Dan Savage, me suit mais ne retweet jamais ce que je partage. Si nous avons le temps aujourd'hui, nous analyserons cela pour répondre à des questions importantes telles que: est-il réel, un bot ou ne me suit-il pas pour des conseils sexuels personnels? Que pouvons-nous apprendre de son compte pour déterminer s’il est susceptible d’interagir avec moi sur Twitter ou, en fait, avec l’un de mes autres abonnés?

Le code de tableau de bord est principalement un prototype que j'ai construit en plus du code Twixxr du dernier épisode, mais ce n'est pas une démonstration en direct à utiliser. Je partage pour que vous puissiez en tirer des enseignements et en tirer parti.

Voici les éléments de base du code:

  • Création de la base de données pour stocker mes followers et les données associées.
  • Télécharger mes followers en pages de 20 followers chacune.
  • Suivi des curseurs des pages pendant le téléchargement 15 pages par fenêtre à tarif limité.
  • Stocker les données collectées sur mes followers dans la base de données.
  • Construire un prototype d'algorithme de notation pour noter tous les suiveurs.
  • Construire une vue pour parcourir le tableau de bord.

Plonger dans le code

Création des migrations de table de base de données

J'ai créé trois tables différentes pour stocker toutes les données et m'aider à travailler avec la limitation de débit de l'API Twitter. Si vous ne maîtrisez pas les migrations de bases de données Yii, veuillez consulter la rubrique Procédure de programmation avec Yii2: Utilisation de la base de données et de l'enregistrement actif..

Tout d'abord, j'ai étendu la table SocialProfile pour enregistrer beaucoup plus de données des comptes des abonnés, telles que leur vérification, leur emplacement et le nombre d'éléments favoris:

db-> nomDuPort === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> addColumn ('% social_profile', 'id_social', Schema :: TYPE_STRING. 'NOT NULL'); $ this-> addColumn ('% social_profile', 'name', 'string NOT NULL'); $ this-> addColumn ('% social_profile', 'nom_écran', Schema :: TYPE_STRING. 'NOT NULL'); $ this-> addColumn ('% social_profile', 'description', Schema :: TYPE_TEXT. 'NOT NULL'); $ this-> addColumn ('% social_profile', 'url', Schema :: TYPE_STRING. 'NOT NULL'); $ this-> addColumn ('% social_profile', 'protected', Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0'); $ this-> addColumn ('% social_profile', 'favourites_count', Schema :: TYPE_BIGINT. 'NOT NULL DEFAULT 0'); $ this-> addColumn ('% social_profile', 'vérifié', Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0'); $ this-> addColumn ('% social_profile', 'location', Schema :: TYPE_STRING. 'NOT NULL'); $ this-> addColumn ('% social_profile', 'profile_location', Schema :: TYPE_STRING. 'NOT NULL'); $ this-> addColumn ('% social_profile', 'score', Schema :: TYPE_BIGINT. 'NOT NULL DEFAULT 0'); 

Ensuite, j'ai construit une table d'indexation appelée SocialFriend pour suivre des abonnés pour des comptes spécifiques. Si je décide de formaliser ce service publiquement, j'en aurai besoin. Il relie la table User aux suiveurs de l'utilisateur dans la table SocialProfile.

db-> nomDuPort === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% social_friend', ['id' => Schema :: TYPE_PK, 'user_id' => Schema :: TYPE_BIGINT. 'NOT NULL', 'social_profile_id' => Schema :: TYPE_BIGINT. 'NOT NULL',], $ tableOptions);  

Ensuite, l'API Twitter nécessite que vous traçiez parmi les demandes de 20 abonnés à la fois. Pour connaître la page suivante, vous devez suivre les curseurs, essentiellement les balises, qui marquent la page suivante à récupérer..

Etant donné que vous n'êtes autorisé à effectuer que 15 demandes de suiveurs toutes les 15 minutes, vous devez stocker ces curseurs dans la base de données. La table s'appelle SocialCursor:

db-> nomDuPort === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% social_cursor', ['id' => Schema :: TYPE_PK, 'ID_utilisateur' => Schema :: TYPE_BIGINT. 'NOT NULL', 'next_cursor' => Schema :: TYPE_STRING. 'NOT NULL',], $ tableOptions);  

Finalement, je construirai des tâches cron en arrière-plan pour gérer tout cela, mais pour le prototype actuel, je les exécute à la main.

Collecte des abonnés et de leurs données de compte

Ensuite, j'ai créé une méthode Twitter :: getFollowers () faire la demande. Voici les bases du code:

fonction publique getFollowers ($ user_id) $ sp = new SocialProfile (); $ next_cursor = SocialCursor :: getCursor ($ user_id);;… ($ next_cursor> 0) $ followers = $ this-> connection-> get ("followers / list", ['curseur' => $ next_cursor]); if ($ this-> connection-> getLastHttpCode ()! = 200) var_dump ($ this-> connection); sortie;  if (isset ($ followers-> utilisateurs)) foreach ($ followers-> utilisateurs comme $ u) $ n + = 1; $ utilisateurs [] = $ u; $ sp-> add ($ user_id, $ u);  $ next_cursor = $ followers-> next_cursor; SocialCursor :: refreshCursor ($ user_id, $ next_cursor); echo $ next_cursor. '
'; echo '============================================= ======
'; else exit;

Il obtient le next_cursor et demande à plusieurs reprises pour les adeptes, $ followers = $ this-> connection-> get ("followers / list", ['cursor' => $ next_cursor]), jusqu'à ce qu'il atteigne les limites de taux. 

La sortie ressemble à ceci, car elle parcourt chaque page de 20 résultats:

actualiser le curseur: 1489380833827620370 =========================================== ======== actualise le curseur: 1488086367811119559 ===================================== ================ actualiser le curseur: 1486452899268510188 ============================= ======================= Actualiser le curseur: 1485593015909209633 ===================== =============================== actualiser le curseur: 1485330282069552137 ============== ====================================== actualiser le curseur: 1485256983607000799 ====== =============================================== Actualiser le curseur : 1484594012550322889 ============================================== ====== actualise le curseur: 1483359799854574028 ======================================= ============== actualiser le curseur: 1481615590678791493 =============================== ===================== Actualiser le curseur: 1478424827838161031 ====================== ============================= actualiser le curseur: 1477449626282716582 ================ ====================================== actualiser le curseur: 1475751176809638917 =========================================== ======== actualise le curseur: 1473539961706830585 ===================================== ================ actualiser le curseur: 1471375035531579849 ============================= =========================

Les données sont stockées par ceux $ sp-> add ($ user_id, $ u); méthodes. le Profil social :: add () méthode est une version différente de la remplir() méthode du tutoriel Twixxr. Il stocke plus de données et gère l'index SocialFriend:

fonction statique publique add ($ user_id, $ profileObject = null) $ sp = SocialProfile :: find () -> où (['social_id' => $ profileObject-> id_str]) -> one (); if (! isset ($ profileObject-> name) || vide ($ profileObject-> name)) $ profileObject-> name = 'Sans nom';  if (! isset ($ profileObject-> url) || empty ($ profileObject-> url)) $ profileObject-> url = "; if (! isset ($ profileObject-> nom_écran) || vide ($ profileObject -> nom_écran)) $ profileObject-> nom_écran = 'error_sn'; if (! isset ($ profileObject-> description) || vide ($ profileObject-> description)) $ profileObject-> description = '(vide) '; if (! isset ($ profileObject-> emplacement_profil) || vide ($ profileObject-> profil_location)) $ profilObject-> profil_location = ";  if (! isset ($ profileObject-> profile_image_url_https) || vide ($ profileObject-> profil_image_url_https)) $ profileObject-> profile_image_url_https = "; if (! is_null ($ sp)) $ sp-> social_id = $ profileObject-> id; $ sp-> image_url = $ profileObject-> profile_image_url_https; $ sp-> follower_count = $ profileObject-> followers_count; $ sp-> status_count = $ profileObject-> statuses_count; $ sp-> friend_count = $ friend_count = $ profileObject- > friends_count; $ sp-> Listed_in = $ profileObject-> Listed_count; $ sp-> url = $ profileObject-> url; if ($ profileObject-> protected) $ sp-> protected = 1; sinon $ sp- > protected = 0; if ($ profileObject-> vérifié) $ sp-> vérifié = 1; sinon $ sp-> vérifié = 0; $ sp-> favourites_count = $ profileObject-> favourites_count; $ sp- > location = $ profileObject-> location; $ sp-> emplacement_profil = $ profilObject-> emplacement_profil; $ sp-> nom = $ profilObjet-> nom; $ sp-> description = $ profilObject-> description; $ sp-> image_url = $ profileObject-> profile_image_url_https; if ($ sp-> validate ()) $ sp-> update (); else va r_dump ($ sp-> getErrors ());  else $ sp = new SocialProfile (); $ sp-> social_id = $ profileObject-> id; $ sp-> score = 0; $ sp-> header_url = "; $ sp-> url = $ profileObject-> url; $ sp-> favourites_count = $ profileObject-> favourites_count; if ($ profileObject-> protected) $ sp-> protected = 1; else $ sp-> protected = 0; if ($ profileObject-> vérifié) $ sp-> vérifié = 1; else $ sp-> vérifié = 0; $ sp-> emplacement = $ profileObject-> emplacement; $ sp-> emplacement_profil = $ profileObject-> emplacement_profil; $ sp-> nom = $ profileObject-> nom; $ sp-> description = $ profileObject-> description; $ sp-> nom_écran = $ profilObjet-> nom_écran; $ sp-> image_url = $ profileObject-> profile_image_url_https; $ sp-> follower_count = $ profileObject-> followers_count; $ sp-> status_count = $ profileObject-> statuses_count; $ sp-> ami_count = $ profileObject-> amis_count; $ -> Listed_in = $ profileObject-> Listed_count; if ($ sp-> validate ()) $ sp-> save (); else var_dump ($ sp-> getErrors ()); sf = SocialFriend: : find () -> where (['social_profile_id' => $ sp-> id]) -> andWhere (['user_id' => $ user_id]) -> un (); if (is_null ($ sf))  $ sf = new SocialFriend (); $ sf-> user_id = $ u ser_id; $ sf-> social_profile_id = $ sp-> id; $ sf-> save ();  return $ sp-> id; 

Il est écrit pour sauvegarder de nouveaux enregistrements ou mettre à jour d'anciens enregistrements afin de pouvoir, à l'avenir, suivre vos données de suiveur et les mettre à jour régulièrement, en remplaçant les anciennes..

Cette dernière section à la fin s'assure qu'il existe un index SocialFriend entre la table User et la table SocialProfile.

$ sf = SocialFriend :: find () -> where (['social_profile_id' => $ sp-> id]) -> andWhere (['user_id' => $ user_id]) -> un (); if (is_null ($ sf)) $ sf = new SocialFriend (); $ sf-> user_id = $ user_id; $ sf-> social_profile_id = $ sp-> id; $ sf-> save (); 

Scoring des abonnés Twitter

J'ai eu une poignée de buts pour mes scores sur Twitter:

  • Éliminez les comptes qui suivent tout le monde qui les suit. Par exemple, ils comptent 12 548 abonnés et suivent 12 392 personnes (voir ci-dessus)..
  • Éliminer les comptes qui suivent plus de 1 500 comptes qui ne verront probablement jamais ce que je partage. Par exemple, Dan Savage suit 1 536 personnes..
  • Éliminer les comptes qui ont très peu de messages ou très peu de comptes qu'ils suivent, probablement des comptes abandonnés.
  • Éliminer les comptes avec peu de favoris - ce sont probablement des bots, n'utilisant pas vraiment l'application.

De même, je voulais souligner certains aspects positifs:

  • Comptes vérifiés
  • Comptes qui ont beaucoup d'adeptes 
  • Les comptes qui ont moins de 1 000 personnes qu'ils suivent, un point favorable pour moi

Voici un code de base approximatif de Profil social :: score () cela met en évidence certains des points positifs:

foreach ($ all as $ sp) // score sp $ score = 0; // REGLE IN si ($ sp-> vérifié == 1) $ score + = 1000;  // POSITIVE if ($ sp-> protected == 1) $ score + = 500;  if ($ sp-> follower_count> 10000) $ score + = 500;  else if ($ sp-> follower_count> 3500) $ score + = 750;  else if ($ sp-> follower_count> 1100) $ score + = 1000;  else if ($ sp-> follower_count> 1000) $ score + = 250;  else if ($ sp-> follower_count> 500) $ score + = 250; 

Voici un code qui élimine certains des mauvais comptes:

 // RULE OUT // en fait un pourcentage de magnitude $ magnitude = $ sp-> follower_count / 1000; if ($ sp-> follower_count> 1000 et abs ($ sp-> follower_count- $ sp-> friend_count)<$magnitude)  $score-=2500;  if ($sp->nombre d'ami> 7500) $ score- = 10000;  else if ($ sp-> friend_count> 5000) $ score- = 5000;  else if ($ sp-> friend_count> 2500) $ score- = 2500;  else if ($ sp-> friend_count> 2000) $ score- = 2000;  else if ($ sp-> friend_count> 1000) $ score- = 250;  else if ($ sp-> friend_count> 750) $ score- = 100;  if ($ sp-> follower_count<100)  $score-=1000;  if ($sp->status_count < 35)  $score-=5000; 

De toute évidence, il y a beaucoup de choses à jouer ici et de nombreuses façons d'améliorer cela. J'espère avoir l'occasion de passer plus de temps à ce sujet.

Lorsque la méthode s'exécute, elle ressemble à ceci, mais met à jour la table SocialProfile avec les scores au fur et à mesure:

-Le niveau supérieur est le même que celui-ci: 1250 drbobbiwegner -8500 Mizzfit_Bianca -7300 wilsonmar 700 CoachVibeke -7300 jhurwitz 0 PiedPiperComms 500 Prana2thePeople -1100 singlemomspower -2250 mouselink -7300 MotivatedGenY -7300 branchant

Affichage du tableau de bord

La grille par défaut de Yii facilite l'affichage du tableau SocialProfile et la personnalisation des colonnes du tableau de bord..

Voici SocialProfileController :: actionIndex ():

/ ** * Répertorie tous les modèles SocialProfile. * @return mixed * / public function actionIndex () $ searchModel = new SocialProfileSearch (); $ dataProvider = $ searchModel-> search (Yii :: $ app-> request-> queryParams); return $ this-> render ('index', ['searchModel' => $ searchModel, 'dataProvider' => $ dataProvider,]);  

Et voici la vue grille personnalisée:

title = Yii :: t ('frontend', 'Profils sociaux'); $ this-> params ['breadcrumbs'] [] = $ this-> title; ?> 

titre)?>

render ('_ search', ['model' => $ searchModel]); ?> $ dataProvider, 'filterModel' => $ searchModel, 'columns' => [['class' => 'yii \ grid \ SerialColumn'], ['label' => 'Nom', 'format' => 'raw' , 'valeur' ​​=> fonction ($ model) return '
nom_écran. '">'. $ modèle-> nom. '
'. $ modèle-> nom_écran.'
'; ,], 'score', ['label' => 'Suit', 'format' => 'raw', 'attribut' => 'ami_compte',], ['label' => 'Abonnés', 'formaté '=>' raw ',' attribut '=>' follower_count ',], [' label '=>' Tweets ',' format '=>' raw ',' attribut '=>' status_count ',], [' label '=>' Favs ',' format '=>' raw ',' attribut '=>' favourites_count ',], [' label '=>' Listé ',' format '=>' raw ',' attribut ' => 'Listed_in',], ['label' => 'P', 'format' => 'raw', 'attribut' => 'protégé',], ['label' => 'V', 'format '=>' raw ',' attribut '=>' vérifié ',], //' emplacement ', //' emplacement_profil ', [//' contentOptions '=> [' class '=>' col-lg-11 col-xs-10 '],' label '=>' Pic ',' format '=>' raw ',' value '=> function ($ model) return'
'; ,],],]); ?>

Voici à quoi ressemblent les meilleurs scores avec mon algorithme initial:

Il y a tellement de façons d'améliorer et d'optimiser les scores. J'ai hâte de jouer avec elle plus.

Et puis, j'aimerais écrire du code et développer l'utilisation de l'API, par exemple:

  • Utiliser le genre PHP pour aider à éliminer les entreprises des personnes (les entreprises n'interagissent pas beaucoup).
  • Recherchez la fréquence des publications que les utilisateurs ont publiées et la dernière fois qu'ils ont utilisé Twitter..
  • Utilisez l'API de recherche de Twitter pour voir quels abonnés ont réellement interagi avec mon contenu..
  • Fournir des commentaires à la notation pour le régler.

Regarder vers l'avant

J'espère que l'approche de scoring vous intrigue. Il y a tellement plus qui peut être fait pour améliorer cela. N'hésitez pas à jouer avec et poster vos idées ci-dessous.

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 (exemple récent d'application Twitter API pour découvrir les femmes influentes à suivre)
  • Documentation développeur Twitter
  • Comment programmer avec la série Yii2 (Envato Tuts +)