Folosind Social Media pentru a localiza martori oculari API-ul Twitter

Acesta este al doilea dintr-o serie de două părți cu privire la utilizarea rețelelor sociale pentru a localiza martori oculari la evenimente importante. În prima parte, v-am arătat cum să utilizați API-ul Instagram pentru a găsi martori oculari la un film live al lui Macklemore's din Seattle. În această parte, vom folosi API-ul Twitter pentru a găsi participanții la discursul președintelui Obama din Selma, la Podul Edmund Pettus.

Puteți descărca codul pentru ambele episoade utilizând link-ul de depozitare GitHub din bara laterală. Ați putea fi, de asemenea, interesat de seria Tuts +, construirea cu API-ul Twitter.

Funcțiile de geosearch ale Twitter sunt mai limitate și, prin urmare, necesită un cod mai detaliat de folosit. Mesajele geotagged pe Twitter pot fi găsite numai din ultimele șapte zile. Și ele pot fi căutate numai după dată (nu și în timp), deci trebuie să filtrați rezultatele API pentru precizie. 

Particip la discuțiile de mai jos. Dacă aveți o sugestie de întrebare sau subiect, vă rugăm să postați un comentariu de mai jos. Puteți să mă contactați și pe Twitter @reifman sau să mă trimiteți direct prin e-mail. 

Ce am acoperit în prima parte

Telefoanele pe care le purtăm în buzunarele noastre înregistrează fiecare mișcare, împărtășind-o cu furnizorii de celule și de multe ori cu companii de software terțe părți ale căror motivații se concentrează în general pe profit. 

Mulți oameni nu-și dau seama că au părăsit geotagging-ul pe aplicațiile lor de social media, publicând pe deplin locația lor cu fiecare post social media. Aceasta a inclus congresmanul GOP Aaron Schock. AP a folosit geotagurile contului său Instagram pentru a-și expune utilizarea fondurilor contribuabililor pentru zboruri private extravagante și alte activități de lux. 


Deci, geotagging-ul poate fi folosit pentru bine. În această serie, explorăm modul în care jurnaliștii sau autoritățile de aplicare a legii ar putea localiza potențialii martori oculari la evenimente importante, cum ar fi o crimă sau o scenă de accidente, folosind medii sociale.

Cu toate acestea, geotagging-ul poate fi de asemenea folosit abuziv. Berkeley oamenii de stiinta de calculator și educatori construit Gata sau nu? app pentru a arăta cum geotagging-ul în Twitter și Instagram înregistrează fiecare mișcare. 

Iată contul Twitter al co-fondatorului Apple Steve Wozniak în aplicația:

Geotagging-ul pe Instagram și Twitter este suficient de precis pentru a permite cineva să vă determine cu ușurință locul de reședință, locul de muncă și rutina de călătorie.

În acest episod, vă voi îndruma folosind API-ul Twitter. Am furnizat un depozit GitHub (link-ul este în bara laterală) pentru a descărca pentru a încerca codul. "Aplicația martor ocular" este scrisă în cadrul Yii pentru PHP, despre care puteți afla mai multe despre programul meu de programare cu seria Yii2 pentru Tuts+. 

Dacă nu doriți să vă împărtășiți locația pentru a vedea publicul - sau pentru a lăsa un traseu istoric al călătoriilor dvs. - gata sau nu? aplicația oferă link-uri și ghiduri pentru a dezactiva aceste funcții (căutați link-ul de pe pagina de pornire). Sincer, m-am dezactivat și vă încurajez să faceți asta.

Dacă sunteți o agenție de aplicare a legii sau o entitate media care ar dori mai multe informații, vă rugăm să nu ezitați să mă contactați direct. Aș fi, de asemenea, interesat de orice utilizare reușită a acestui cod (pentru bine) - ar face o poveste interesantă de urmărire.

Ce am făcut cu Instagram

Ultimul episod, am folosit API-ul Instagram pentru a găsi martori oculari la filmul Mackelmore live 2013 pentru White Cadillac. Destul de ușor, am reușit să găsim o fotografie a lui Instagram, despre care Macklemore a ieșit din mașina lui Joshua Lewis (cool, huh?):

Acum, să începem să folosim API-ul Twitter.

Utilizarea API-ului Twitter

Ca și în cazul Instagram, trebuie să vă conectați la contul dvs. Twitter și să înregistrați o aplicație pentru dezvoltatori. Trebuie să înregistrați o aplicație în felul următor:

Twitter vă va arăta detaliile aplicației:

Iată pagina de setări:

Aici sunt cheile și token-urile de acces pentru aplicație. Luați act de acestea.

Apoi, derulați în jos și creați jetoane de acces pentru contul dvs. Rețineți și acestea.

Adăugați toate cele patru aceste chei de configurare și secrete la dvs. /var/secure/eyew.ini fişier:

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" 

Apoi, vom crea o migrare Active Record pentru a crea modelul nostru Twitter. Aceasta va stoca mesajele tweet pe care le primim din apelurile API.

db-> driverName === 'mysql') $ tableOptions = 'SETAREA CHARACTERULUI utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('% twitter', ['id' => Schema :: TYPE_PK, 'moment_id' => Schema :: TYPE_INTEGER. TYPE_BIGINT 'NOT NULL', 'twitter_id' => Schema :: TYPE_BIGINT. 'NOT NULL', 'screen_name' => Schema :: TYPE_STRING 'NOT NULL DEFAULT 0', 'text' => Schema :: TYPE_TEXT. NU NULL ',' tweeted_at '=> Schema :: TYPE_INTEGER.NOT NULL', 'created_at' => Schema :: TYPE_INTEGER.NOT NULL, 'updated_at' => Schema :: TYPE_INTEGER. , $ tableOptions); $ this-> addForeignKey ('fk_twitter_moment', '% twitter', 'moment_id', 'moment', 'id', 'CASCADE', 'CASCADE');  funcția publică jos () $ this-> dropForeignKey ('fk_twitter_moment', '% twitter'); $ This-> dropTable ( '% twitter');  

Așa cum am făcut în prima parte, trebuie să rulați migrația:

./ yii migrați / up Instrument de migrare Yii (bazat pe Yii v2.0.3) Total 1 migrare nouă care urmează să fie aplicată: m150309_174014_create_twitter_table Aplicați migrarea de mai sus? (da: nu): da *** aplicând m150309_174014_create_twitter_table> creați tabelul % twitter ... done (time: 0.008s)> adăugați cheie străină fk_twitter_moment: twitter % moment (id) ... făcut (timpul: 0.007s) *** aplicat m150309_174014_create_twitter_table (time: 0.019s) Migrate cu succes.

Apoi, am folosit generatorul de cod Yii2, Gii, pentru a crea modelul și controlerele CRUD pentru modelul Twitter. Dacă obțineți ultimul cod al repozitorului GitHub folosind link-ul din bara laterală din acest tutorial, veți avea și codul.

Creați un moment nou

Deoarece Twitter limitează căutările de geolocație în săptămâna trecută, am ales în cele din urmă discursul președintelui Obama, Selma, 50th Anniversary, la Podul Edmund Pettus.

Am folosit Google Maps din nou pentru a obține coordonatele GPS pentru pod:

Apoi, am creat un moment pentru discursul de căutare. Am actualizat-o de câteva ori pentru a regla raza geografică a căutării (este o punte) și intervalul de timp:

Căutați utilizând API-ul Twitter

Limitările aplicației Twitter API sunt că vă permit doar să căutați după dată, de ex. 2015-03-07, în timp ce Instagram este indexat prin timestamps precise Unix. Prin urmare, trebuie să începem căutarea pe Twitter cu o zi întreagă și să căutăm înapoi.

Deoarece probabil că vom obține o mulțime de tweet-uri în afara intervalului de timp dorit, trebuie să efectuăm apeluri repetate la API-ul Twitter. Twitter returnează până la 100 de tweet-uri pe cerere API și permite 180 de solicitări pe o fereastră de 15 minute.

Folosesc biblioteca API Twitter lui James Mallison pentru PHP. Iată cum am creat biblioteca pentru a efectua apeluri:

 \ Yii :: $ app-> params ['twitter'] ['oauth_token'], 'oauth_access_token_secret' => \ Yii :: $ app-> params ['twitter' \ Yii :: $ app-> params ['twitter'] ['cheie'], 'consumer_secret' => \ Yii :: $ app-> params ['twitter'] ['secret']; // Conectați-vă la Twitter $ twitter = noul TwitterAPIExchange ($ settings);

Inițial, solicităm 100 de rezultate de la Twitter la coordonatele noastre GPS până la o anumită dată. 

funcția publică searchTwitter () date_default_timezone_set ('America / Los_Angeles'); Yii :: trace ('începe searchTwitter' .date ('y-m-d h: m')); // Încărcați cheile de aplicație Twitter $ settings = array ('oauth_access_token' => \ Yii :: $ app-> params ['twitter'] ['oauth_token'], 'oauth_access_token_secret' => paramurile ['twitter'] ['oauth_secret'], 'consumer_key' => \ Yii :: $ app-> params ['twitter'] [ params ['twitter'] ['secret']); // Conectați-vă la Twitter $ twitter = noul TwitterAPIExchange ($ settings); // Setările interogării pentru căutare $ url = 'https://api.twitter.com/1.1/search/tweets.json'; $ requestMethod = 'GET'; // limita de rată de 180 interogări $ limit = 180; $ QUERY_COUNT = 1; $ count = 100; $ result_type = 'recent'; // se calculează intervalul valabil al timestului valutar $ valid_start = $ this-> start_at; // $ until_date și $ valid_end = // timpul de pornire + durata $ valid_end = $ this-> start_at + ($ this-> duration * 60); Yii :: trace ('Domeniu valabil:'. $ Valid_start. '->'. $ Valid_end); $ până_date = data ('Y-m-d', $ valid_end + (24 * 3600)); // adăugați o zi $ distance_km = $ this-> distance / 1000; // distanța în km // neutilizată: & since = $ since_date // $ since_date = '2015-03-05'; // Efectuați prima interogare cu until_date $ getfield = "? Result_type = $ result_type & geocode =". $ This-> latitude "," $ $ this-> longitude "," $ distance_km. "Mi & include_entities = false & until = $ until_date & count = $ count ";

Înregistrăm numai tweets în intervalul de timp precis, ignorând celelalte rezultate. Pe măsură ce procesăm aceste lucruri, notăm cel mai mic ID de tweet primit.

 $ tweets = json_decode ($ twitter-> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest ()); dacă (isset ($ tweets-> erori)) Yii :: $ app-> session-> setFlash ("eroare", "limita de viteză Twitter atinsă"); Yii :: eroare ($ tweets-> erori [0] -> mesaj); întoarcere;  $ max_id = 0; Yii :: trace ('Count Stables:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> stadii ca $ t) // verifica dacă tweet-ul în intervalul de timp valabil $ unix_created_at = strtotime ($ t-> created_at); Yii :: trace ('Tweet @'. $ T-> create_at. ". $ Unix_created_at. ':'. $ T-> user-> screen_name." (Isset ($ t-> text) text: ")); dacă ($ unix_created_at> = $ valid_start && $ unix_created_at <= $valid_end)  // print_r($t); $i = new Twitter(); $i->se adaugă ($ this-> id, $ T-> id_str, $ T-> user-> id_str, $ T-> user-> SCREEN_NAME, $ unix_created_at, (isset ($ T-> text)? $ T-> Text ($ max_id == 0) $ max_id = intval ($ t-> id_str); altceva $ max_id = min ($ max_id, intval ($ t-> id_str));

Apoi bifăm, făcând cereri repetate la Twitter (de până la 179 de ori mai mult), solicitând înregistrări suplimentare care sunt mai devreme decât cel al celui mai mic ID tweet al lotului precedent. Cu alte cuvinte, în cazul cererilor ulterioare, în loc să interogăm până la o anumită dată, vom interoga la max_id din cel mai mic ID de tweet pe care l-am primit.

Ne oprim atunci când sunt returnate mai puțin de 100 de înregistrări sau când tweeturile returnate sunt mai devreme decât intervalul nostru real. 

Dacă aveți nevoie de acces la mai mult de 18.000 de tweet-uri, va trebui să implementați o sarcină de fundal pentru a apela API-ul Twitter, așa cum am făcut în celelalte serii de servere API Twitter.

Pe măsură ce procesăm rezultatele API, trebuie să filtrăm tweets, înregistrându-le doar pe cele care se încadrează în timpul real de pornire și la sfârșit.

Notă: API-ul Twitter are o mulțime de ciudățenii frustrante care fac paginarea mai dificilă decât ar trebui să fie. Destul de frecvent Twitter nu întoarce nici un rezultat fără un cod de eroare. Alteori, mi se părea că se întoarce un număr mic de rezultate, dar asta nu înseamnă că o altă cerere nu ar reveni mai mult. Nu există modalități foarte clare de a ști când Twitter se termină cu returnarea rezultatelor. Este inconsistentă. Astfel, puteți observa că codul meu are câteva soluții interesante în el, de ex. examinează $ count_max_repeats.

 $ count_repeat_max = 0; // Efectuați toate interogările ulterioare cu adăugarea unui maxim_tweet_id actualizat în timp ce ($ 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->latitudine "" $ this-> longitudine "" $ distance_km "mi & include_entities = false & max_id = $ max_id & conta = $ count".....; $ tweets = json_decode ($ twitter-> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest ()); dacă (isset ($ tweets-> erori)) Yii :: $ app-> session-> setFlash ("eroare", "limita de viteză Twitter atinsă"); Yii :: eroare ($ tweets-> erori [0] -> mesaj); întoarcere;  // uneori twitter api eșuează dacă (! isset ($ tweets-> statuses)) continuă; Yii :: trace ('Count Stables:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> stadii ca $ t) // verifica dacă tweet-ul în intervalul de timp valabil $ unix_created_at = strtotime ($ t-> created_at); dacă ($ unix_created_at> = $ valid_start && $ unix_created_at <= $valid_end)  $i = new Twitter(); $i->se adaugă ($ this-> id, $ T-> id_str, $ T-> user-> id_str, $ T-> user-> SCREEN_NAME, $ unix_created_at, (isset ($ T-> text)? $ T-> Text :))); altfel dacă ($ unix_created_at < $valid_start)  // stop querying when earlier than valid_start return;  $max_id = min($max_id,intval($t->id_str)) - 1;  dacă ($ prior_max_id - $ max_id <=1 OR count($tweets->stările)<1)  $count_repeat_max+=1;  if ($count_repeat_max>5) // atunci când api nu întoarce mai multe rezultate;  // se termină în timp 

Unul dintre primele rezultate care au revenit au fost incluse în tweet-ul de mai jos de Fred Davenport care arată președintele Obama pe scenă:

Iată-l pe Twitter:

Apoi, pe măsură ce răsfoiți rezultatele mai departe, puteți găsi mai mulți oameni care prezintă tweeting despre Obama - inclusiv despre mass-media:

Acum, să facem o căutare mai locală.

O a doua căutare mai locală

Key Arena este concertul mare și arena sportivă din Seattle. În weekendul trecut, au avut loc turneul de baschet pentru femei Pac-12:

Să obținem coordonatele noastre GPS pentru Key Arena din Google Maps:

Apoi, am creat și ameliorat un moment pentru a găsi un interval de timp mai lung pentru weekendul de tweets:

Și, iată câteva rezultate. Preferatul meu este:

"Vreau să las jocul de baschet, urăsc baschetul."

În cea mai mare parte, mi se pare că API-ul de la Instagram este mult mai puternic decât cel al Twitter-ului și are în general rezultate mai interesante. Cu toate acestea, depinde de tipul de persoană pe care o căutați. Dacă doriți doar să identificați persoanele care au fost acolo, fie API funcționează bine.

Ce am învățat

Sper că v-ați bucurat de această serie. Mi sa parut fascinant si a fost impresionat de rezultate. Și subliniază preocupările pe care ar trebui să le avem despre nivelul nostru de confidențialitate în această eră digitală interconectată.

API-urile pentru Instagram și Twitter sunt ambele servicii incredibil de puternice pentru găsirea utilizatorilor de medii sociale care erau în anumite locuri în anumite locuri în anumite momente. Aceste informații pot fi folosite pentru totdeauna și pot fi abuzate. Ar trebui să vă gândiți probabil să vă dezactivați postarea în geolocație - urmați linkurile de la Ready sau Not? aplicaţia.

Puteți, de asemenea, doriți să verificați clădirea mea cu seria API Twitter, de asemenea, pe Tuts+.

Vă rugăm să nu ezitați să postați întrebările și comentariile dvs. de mai jos. Puteți să mă contactați și pe Twitter @reifman sau să mă trimiteți direct prin e-mail. Aș aprecia în special audierea de la jurnaliști și organele de drept care utilizează aceste exemple.

De asemenea, puteți să răsfoiți pagina instructorului Tuts + pentru a vedea alte tutoriale pe care le-am scris. 

Link-uri conexe

  • API-ul Twitter
  • API-ul Instagram
  • Gata sau nu? (Predarea confidențialității)
  • Cum ne-am prins Lipsa Wired Magazine Writer Evan Ratliff
  • Yii2 Developer Exchange
Cod