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.
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:
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.
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 ();
J'ai eu une poignée de buts pour mes scores sur Twitter:
De même, je voulais souligner certains aspects positifs:
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
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; ?>= Html::encode($this->titre)?>
render ('_ search', ['model' => $ searchModel]); ?> = GridView::widget([ 'dataProvider' => $ dataProvider, 'filterModel' => $ searchModel, 'columns' => [['class' => 'yii \ grid \ SerialColumn'], ['label' => 'Nom', 'format' => 'raw' , 'valeur' => fonction ($ model) return 'nom_écran. '">'. $ modèle-> nom. ''; ,], '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'
'. $ modèle-> nom_écran.''; ,],],]); ?>
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:
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.