Utiliser les médias sociaux pour localiser les témoins oculaires l'API Twitter

Ceci est la deuxième d'une série en deux parties sur l'utilisation des médias sociaux pour localiser les témoins oculaires d'événements importants. Dans la première partie, je vous ai montré comment utiliser l'API Instagram pour trouver des témoins visuels lors d'un tournage en direct de Macklemore's à Seattle. Dans cette partie, nous utiliserons l'API Twitter pour trouver les participants au discours du président Obama à Selma, au pont Edmund Pettus..

Vous pouvez télécharger le code des deux épisodes en utilisant le lien du référentiel GitHub dans la barre latérale. Vous pouvez également être intéressé par ma série Tuts +, Building With the Twitter API.

Les capacités de géolocalisation de Twitter sont plus limitées et nécessitent par conséquent un code un peu plus détaillé. Les posts géolocalisés sur Twitter ne peuvent être trouvés que depuis sept jours. Et ils ne sont consultables que par date (et non par heure), vous devez donc filtrer les résultats de l'API pour plus de précision.. 

Je participe aux discussions ci-dessous. Si vous avez une question ou une suggestion de sujet, veuillez poster un commentaire ci-dessous. Vous pouvez également me joindre sur Twitter @reifman ou m'envoyer un email directement. 

Ce que nous avons couvert dans la première partie

Les téléphones que nous avons dans nos poches enregistrent chacun de nos mouvements et les partagent avec des fournisseurs de cellulaires et souvent avec des éditeurs de logiciels tiers dont les motivations sont généralement centrées sur le profit. 

Beaucoup de gens ne réalisent pas qu'ils ont laissé la géolocalisation sur leurs applications de médias sociaux, publiant pleinement leur emplacement avec chaque message publié sur les médias sociaux. Cela comprenait Aaron Schock, membre du Congrès du GOP. L'AP a utilisé les balises géographiques de son compte Instagram pour exposer son utilisation des fonds des contribuables pour des vols privés extravagants et d'autres activités de luxe.. 


La géolocalisation peut donc être utilisée pour de bon. Dans cette série, nous explorons comment les journalistes ou les forces de l'ordre peuvent localiser des témoins oculaires potentiels d'événements importants tels qu'un crime ou une scène d'accident à l'aide des médias sociaux..

Cependant, la géolocalisation peut également être utilisée de manière abusive. Les informaticiens et les éducateurs de Berkeley ont construit le projet Ready or Not? application pour montrer comment la géolocalisation sur Twitter et Instagram enregistre chacun de nos gestes. 

Voici le compte Twitter du cofondateur d'Apple, Steve Wozniak, dans l'application:

La géolocalisation sur Instagram et Twitter est suffisamment précise pour permettre à une personne de déterminer facilement votre lieu de résidence, votre lieu de travail et votre routine de voyage..

Dans cet épisode, je vais vous guider à travers l'utilisation de l'API Twitter. J'ai fourni un référentiel GitHub (le lien est dans la barre latérale) que vous pouvez télécharger pour essayer le code. Mon "application Eyewitness" est écrite dans le framework Yii pour PHP, sur lequel vous pouvez en apprendre davantage sur ma série de programmation avec Yii2 pour Tuts+. 

Si vous ne souhaitez pas partager votre position pour que le public voie ou laisse un sentier historique de vos voyages, prêt ou non? L'application propose des liens et des guides pour désactiver ces fonctionnalités (recherchez le lien sur sa page d'accueil). Franchement, j'ai désactivé le mien et je vous encourage à le faire aussi.

Si vous êtes un organisme chargé de l'application de la loi ou une entité média qui souhaite obtenir plus d'informations, n'hésitez pas à me contacter directement. Je serais également intéressé par toute utilisation réussie de ce code (pour de bon) - ils feraient une histoire intéressante de suivi.

Ce que nous avons fait avec Instagram

Dernier épisode, nous avons utilisé l'API Instagram pour trouver des témoins oculaires du tournage vidéo en direct de Mackelmore en 2013 pour White Cadillac. Très facilement, nous avons réussi à trouver la photo de Macklemore sortant du véhicule de Joshua Lewis, membre d'Instagram (cool, hein?):

Maintenant, commençons à utiliser l'API Twitter.

Utiliser l'API Twitter

Comme avec Instagram, vous devez vous connecter à votre compte Twitter et enregistrer une application de développement. Vous devriez enregistrer une application comme celle-ci:

Twitter va vous montrer les détails de votre application:

Voici la page des paramètres:

Voici les clés et les jetons d'accès pour l'application. Prenez note de ces.

Ensuite, faites défiler et créez des jetons d’accès pour votre compte. Prenez note de ces aussi.

Ajoutez ces quatre clés de configuration et secrets à votre /var/secure/eyew.ini fichier:

MYSQL_HOST = "localhost" mysql_db = "eyew" mysql_un = "xxxxxxxxx" MYSQL_PWD = "xxxxxxxxxxxx" instagram_client_id = "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7" instagram_client_secret = "1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4" twitter_key = "zxxxxxxxxxxxxxxxxxxxx2" twitter_secret = "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxp" twitter_oauth_token = "1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxs" twitter_oauth_secret = "exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxV" 

Ensuite, nous créerons une migration Active Record pour créer notre modèle Twitter. Cela va stocker les tweets que nous recevons des appels API.

db-> nomDuPort === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% twitter', ['id' => Schema :: TYPE_PK, 'moment_id' => Schema :: TYPE_INTEGER. 'NOT NULL', 'tweet_id' => Schema :: TYPE_BIGINT. 'NOT NULL', 'twitter_id' => Schéma :: TYPE_BIGINT. 'NOT NULL', 'screen_name' => Schéma :: TYPE_STRING. 'NOT NULL DEFAUT 0', 'text' => Schéma :: TYPE_TEXT. ' NOT NULL ',' tweeted_at '=> Schema :: TYPE_INTEGER.' NOT NULL ',' created_at '=> Schéma :: TYPE_INTEGER.' NOT NULL ',' updated_at '=> Schéma :: TYPE_INTEGER.' NON NULL ',] , $ tableOptions); $ this-> addForeignKey ('fk_twitter_moment', '% twitter', 'moment_id', '% moment', 'id', 'CASCADE', 'CASCADE');  public function down () $ this-> dropForeignKey ('fk_twitter_moment', '% twitter'); $ this-> dropTable ('% twitter');  

Comme nous l'avons fait dans la première partie, vous devez exécuter la migration:

./ yii migrate / up Yii Outil de migration (basé sur Yii v2.0.3) Total 1 nouvelle migration à appliquer: m150309_174014_create_twitter_table Appliquer la migration ci-dessus? (yes | no) [no]: yes *** application de m150309_174014_create_twitter_table> créer un tableau % twitter… done (heure: 0.008s)> ajouter une clé étrangère fk_twitter_moment: % twitter (moment_id) références  % moment (id)… fait (heure: 0.007s) *** appliqué m150309_174014_create_twitter_table (heure: 0.019s) Migration réussie.

Ensuite, j'ai utilisé le générateur de code de Yii2, Gii, pour créer le modèle et les contrôleurs CRUD pour le modèle Twitter. Si vous obtenez le dernier code de référentiel GitHub en utilisant le lien de la barre latérale de ce tutoriel, vous aurez également le code..

Créer un nouveau moment

Parce que Twitter limite les recherches de géolocalisation à la semaine dernière, j'ai finalement choisi le discours du 50ème anniversaire du président Obama, Selma, au pont Edmund Pettus..

J'ai encore utilisé Google Maps pour obtenir les coordonnées GPS du pont:

Ensuite, j'ai créé un moment pour le discours à rechercher. Je l'ai mis à jour plusieurs fois pour modifier le rayon géographique de la recherche (c'est un pont) et la plage de temps:

Recherche à l'aide de l'API Twitter

L’API de Twitter présente les limites suivantes: elle vous permet uniquement de rechercher par date, par exemple. 2015-03-07, alors qu'Instagram est indexé par des horodatages Unix précis. Par conséquent, nous devons commencer notre recherche sur Twitter une journée complète à l’avance et en arrière..

Étant donné que nous sommes susceptibles d’obtenir beaucoup de tweets en dehors de la plage souhaitée, nous devons faire des appels répétés à l’API de Twitter. Twitter renvoie jusqu'à 100 tweets par demande d'API et autorise 180 demandes par fenêtre de 15 minutes..

J'utilise la bibliothèque API de Twitter de James Mallison pour PHP. Voici comment nous avons configuré la bibliothèque pour passer des appels:

 \ Yii :: $ app-> params ['twitter'] ['oauth_token'], 'oauth_access_token_secret' => \ Yii :: $ app-> params ['twitter'] ['oauth_secret'], 'consumer_key' => \ Yii :: $ app-> params ['twitter'] ['key'], 'consumer_secret' => \ Yii :: $ app-> params ['twitter'] ['secret'],); // Connectez-vous à Twitter $ twitter = new TwitterAPIExchange ($ settings);

Initialement, nous demandons 100 résultats de Twitter à nos coordonnées GPS jusqu'à une date précise.. 

fonction publique searchTwitter () date_default_timezone_set ('America / Los_Angeles'); Yii :: trace ('start searchTwitter' .date ('y-m-d h: m')); // Chargez vos clés d'application Twitter $ settings = array ('oauth_access_token' => \ Yii :: $ app-> params ['twitter'] ['oauth_token'], 'oauth_access_token_secret' => \ Yii :: $ app params ['twitter'] ['oauth_secret'], 'consumer_key' => \ Yii :: $ app-> params ['twitter'] ['clé'], 'consumer_secret' => \ Yii :: $ app-> params ['twitter'] ['secret'],); // Connectez-vous à Twitter $ twitter = new TwitterAPIExchange ($ settings); // Paramètres de requête pour la recherche $ url = 'https://api.twitter.com/1.1/search/tweets.json'; $ requestMethod = 'GET'; // limite de débit de 180 requêtes $ limit = 180; $ query_count = 1; $ count = 100; $ result_type = 'récent'; // calcule la plage d'horodatage valide $ valid_start = $ this-> start_at; // $ Until_date et $ valid_end = // heure de début + durée $ valid_end = $ this-> start_at + ($ this-> duration * 60); Yii :: trace ('Plage valide:'. $ Valid_start. '->'. $ Valid_end); $ Until_date = Date ('Y-m-d', $ valid_end + (24 * 3600)); // ajouter un jour $ distance_km = $ ceci-> distance / 1000; // distance en km // Inutilisé: & Since = $ Since_date // $ Since_date = '2015-03-05'; // Exécute la première requête avec till_date $ getfield = "? Result_type = $ result_type & geocode =". $ This-> latitude. ",". $ This-> longitude. ",". $ Distance_km. " $ count ";

Nous n'enregistrons que les tweets dans notre intervalle de temps précis, en ignorant les autres résultats. Pendant que nous les traitons, nous prenons note du plus petit identifiant de tweet reçu.

 $ tweets = json_decode ($ twitter-> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest ()); if (isset ($ tweets-> errors)) Yii :: $ app-> session-> setFlash ('error', 'Limite de taux Twitter atteinte.'); Yii :: error ($ tweets-> errors [0] -> message); revenir;  $ max_id = 0; Yii :: trace ('Count Statuses:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> statuses comme $ t) // vérifie si tweet dans la plage de temps valide $ unix_created_at = strtotime ($ t-> created_at); Yii :: trace ('Tweet @'. $ T-> created_at. ". $ Unix_created_at. ':'. $ T-> utilisateur-> nom_écran.". (Isset ($ t-> texte)? $ T-> text: ")); if ($ unix_created_at> = $ valid_start && $ unix_created_at <= $valid_end)  // print_r($t); $i = new Twitter(); $i->add ($ this-> id, $ t-> id_str, $ t-> utilisateur-> id_str, $ t-> utilisateur-> nom_écran, $ unix_created_at, (isset ($ t-> texte)? $ t-> texte : ")); if ($ max_id == 0) $ max_id = intval ($ t-> id_str); else $ max_id = min ($ max_id, intval ($ t-> id_str));

Ensuite, nous effectuons une boucle en faisant des demandes répétées à Twitter (jusqu'à 179 fois supplémentaires), en demandant des enregistrements supplémentaires antérieurs à l'ID de tweet le plus faible du lot précédent. En d'autres termes, lors de demandes ultérieures, au lieu d'interroger jusqu'à une date spécifique, nous interrogeons l'identifiant max_id du plus petit identifiant tweet que nous ayons reçu..

Nous nous arrêtons lorsque moins de 100 enregistrements sont renvoyés ou lorsque les tweets renvoyés sont antérieurs à notre plage réelle.. 

Si vous avez besoin d'accéder à plus de 18 000 tweets, vous devez implémenter une tâche en arrière-plan pour appeler l'API Twitter, comme nous l'avons fait dans notre autre série d'API Twitter..

Lors du traitement des résultats de l'API, nous devons filtrer les tweets, en enregistrant uniquement ceux qui correspondent à notre heure de début et de fin réelle..

Remarque: L'API Twitter présente de nombreuses bizarreries frustrantes qui rendent la pagination plus difficile qu'elle ne devrait l'être. Très souvent, Twitter ne renvoie aucun résultat sans code d'erreur. D'autres fois, je trouvais qu'elle renvoyait un petit nombre de résultats, mais cela ne signifiait pas qu'une autre demande ne renverrait plus. Il n'y a pas de moyen très clair de savoir quand Twitter a fini de vous renvoyer des résultats. C'est incohérent. Ainsi, vous remarquerez peut-être que mon code contient quelques solutions de contournement intéressantes, par exemple. examiner $ count_max_repeats.

 $ count_repeat_max = 0; // Effectue toutes les requêtes suivantes avec l'ajout de la valeur maximale maximum_tweet_id while ($ query_count<=$limit)  $prior_max_id = $max_id; $query_count+=1; Yii::trace( 'Request #: '.$query_count); // Perform subsequent query with max_id $getfield ="?result_type=$result_type&geocode=".$this->latitude. ",". $ this-> longitude. ",". $ distance_km. "mi & include_entities = false & max_id = $ max_id & count = $ count"; $ tweets = json_decode ($ twitter-> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest ()); if (isset ($ tweets-> errors)) Yii :: $ app-> session-> setFlash ('error', 'Limite de taux Twitter atteinte.'); Yii :: error ($ tweets-> errors [0] -> message); revenir;  // parfois, l'API Twitter échoue si (! isset ($ tweets-> statuses)) continue; Yii :: trace ('Count Statuses:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> statuses comme $ t) // vérifie si tweet dans la plage de temps valide $ unix_created_at = strtotime ($ t-> created_at); if ($ unix_created_at> = $ valid_start && $ unix_created_at <= $valid_end)  $i = new Twitter(); $i->add ($ this-> id, $ t-> id_str, $ t-> utilisateur-> id_str, $ t-> utilisateur-> nom_écran, $ unix_created_at, (isset ($ t-> texte)? $ t-> texte : ")); sinon si ($ unix_created_at < $valid_start)  // stop querying when earlier than valid_start return;  $max_id = min($max_id,intval($t->id_str)) - 1;  if ($ prior_max_id - $ max_id <=1 OR count($tweets->statuts)<1)  $count_repeat_max+=1;  if ($count_repeat_max>5) // lorsque l’API ne renvoie pas plus de résultats, break;  // fin tout en 

L'un des premiers résultats obtenus est le tweet ci-dessous de Fred Davenport montrant le président Obama sur scène:

Voici c'est sur Twitter:

Ensuite, à mesure que vous parcourez les résultats, vous pouvez trouver de nombreuses autres personnes présentes sur Twitter, y compris les médias:

Maintenant, faisons une recherche plus locale.

Une seconde, plus de recherche locale

Key Arena est le grand arène de concert et de sport de Seattle. La fin de semaine dernière, ils ont organisé le tournoi de basketball féminin Pac-12:

Obtenons nos coordonnées GPS pour Key Arena à partir de Google Maps:

Ensuite, j'ai créé et peaufiné un moment pour trouver une plage de temps plus longue pour le week-end de tweets:

Et voici quelques résultats. Mon favori est:

"Je veux quitter ce match de basket. Je déteste le basket-ball."

Pour la plupart, il me semble que l'API d'Instagram est beaucoup plus puissante que celle de Twitter et donne des résultats généralement plus intrigants. Cependant, cela dépend du type de personne que vous recherchez. Si vous voulez juste identifier les personnes qui étaient là, l'une ou l'autre API fonctionne bien.

Ce que nous avons appris

J'espère que vous avez apprécié cette série. J'ai trouvé cela fascinant et j'ai été impressionné par les résultats. Et cela met en évidence les préoccupations que nous devrions tous avoir concernant notre niveau de confidentialité en cette ère numérique interconnectée..

Les API pour Instagram et Twitter sont des services incroyablement puissants pour rechercher des utilisateurs de médias sociaux proches de certains endroits à certains moments. Cette information peut être utilisée pour de bon et il peut en être abusé. Vous devriez probablement envisager de désactiver votre publication de géolocalisation - suivez les liens au niveau Prêt ou Pas? app.

Vous voudrez peut-être aussi consulter mon série Building with the Twitter API, également sur Tuts+.

N'hésitez pas à poster vos questions et commentaires ci-dessous. Vous pouvez également me joindre sur Twitter @reifman ou m'envoyer un courriel directement. J'apprécierais tout particulièrement les journalistes et les forces de l'ordre qui utilisent ces exemples.

Vous pouvez également parcourir ma page d’instructeur Tuts + pour voir les autres tutoriels que j’ai écrits.. 

Liens connexes

  • L'API Twitter
  • L'API Instagram
  • Prêt pas prêt? (Enseignement de la vie privée)
  • Evan Ratliff, auteur du magazine Wired manquant
  • Yii2 Developer Exchange