Questa è la seconda di una serie in due parti sull'uso dei social media per individuare testimoni oculari su eventi importanti. Nella prima parte, ti ho mostrato come usare l'API di Instagram per trovare testimoni oculari di un servizio di ripresa di Macklemore's a Seattle. In questa parte, utilizzeremo l'API di Twitter per trovare i partecipanti al discorso del presidente Obama in Selma al Pettus Bridge di Edmund.
Puoi scaricare il codice per entrambi gli episodi utilizzando il link del repository GitHub nella barra laterale. Potresti anche essere interessato alla mia serie Tuts +, Costruire con l'API di Twitter.
Le funzionalità di geosearch di Twitter sono più limitate e richiedono quindi un codice un po 'più dettagliato da utilizzare. I post geotagged su Twitter possono essere trovati solo negli ultimi sette giorni. E sono ricercabili solo per data (non ora), quindi devi filtrare i risultati dell'API per la precisione.
Parteciperò alle discussioni di seguito. Se hai una domanda o un suggerimento sull'argomento, per favore pubblica un commento qui sotto. Puoi anche raggiungermi su Twitter @reifman o mandarmi un'email direttamente.
I telefoni che portiamo in tasca registrano ogni nostra mossa, condividendola con fornitori di cellulari e spesso con aziende di software di terze parti le cui motivazioni generalmente si concentrano sul profitto.
Molte persone non si rendono conto di aver lasciato il geotagging sulle proprie app dei social media, pubblicizzando appieno la propria posizione in ogni post sui social media. Tra questi c'era il membro del Congresso GOP Aaron Schock. L'AP utilizzava i geotag del suo account Instagram per esporre il suo uso dei fondi dei contribuenti per voli privati stravaganti e altre attività lussuose.
Quindi, il geotagging può essere utilizzato per sempre. In questa serie, stiamo esplorando come i giornalisti o le forze dell'ordine potrebbero individuare potenziali testimoni oculari su eventi importanti come un crimine o una scena dell'incidente usando i social media.
Tuttavia, la geotagging può anche essere utilizzata abusivamente. Gli scienziati informatici e gli educatori di Berkeley hanno costruito Ready o Not? app per mostrare come il geotagging su Twitter e Instagram registra ogni nostra mossa.
Ecco l'account Twitter del co-fondatore di Apple Steve Wozniak nell'app:
Il geotagging su Instagram e Twitter è abbastanza accurato da permettere a qualcuno di determinare facilmente la tua residenza, il luogo di lavoro e la routine di viaggio.
In questo episodio, ti guiderò attraverso l'utilizzo dell'API di Twitter. Ho fornito un repository GitHub (il link si trova nella barra laterale) da scaricare per provare il codice. La mia app "Eyewitness" è scritta in Yii Framework per PHP, che puoi imparare di più sulla mia programmazione con la serie Yii2 per Tuts+.
Se non desideri condividere la tua posizione perché il pubblico possa vedere o lasciare una traccia storica dei tuoi viaggi, il Ready or Not? l'app offre collegamenti e guide per disattivare queste funzioni (cercare il collegamento sulla sua home page). Francamente, ho disattivato la mia e ti incoraggio anche a farlo.
Se sei un'agenzia di protezione della legge o un'entità media che desidera maggiori informazioni, non esitate a contattarmi direttamente. Sarei anche interessato a qualsiasi uso riuscito di questo codice (per sempre) - farebbe una interessante storia di follow-up.
Nell'ultima puntata, abbiamo utilizzato l'API di Instagram per trovare testimoni oculari del video live di Mackelmore del 2013 per White Cadillac. Abbastanza facilmente, siamo riusciti a trovare la foto di Macklemore del membro di Instagram Joshua Lewis che esce dal suo veicolo (figo, eh?):
Ora, iniziamo a utilizzare l'API di Twitter.
Come con Instagram, devi accedere al tuo account Twitter e registrare un'applicazione per sviluppatori. Devi registrare un'app in questo modo:
Twitter ti mostrerà i dettagli dell'applicazione:
Ecco la pagina delle impostazioni:
Ecco le chiavi e i token di accesso per l'applicazione. Prendi nota di questi.
Quindi, scorri verso il basso e crea i token di accesso per il tuo account. Prendi nota di questi anche.
Aggiungi tutte e quattro queste chiavi e segreti di configurazione al tuo /var/secure/eyew.ini
file:
mysql_host = "localhost" mysql_db = "eyew" mysql_un = "xxxxxxxxx" mysql_pwd = "xxxxxxxxxxxx" instagram_client_id = "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7" instagram_client_secret = twitter_key "1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4" = "zxxxxxxxxxxxxxxxxxxxx2" twitter_secret = "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxp" twitter_oauth_token = "1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxs" twitter_oauth_secret = "exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxV"
Quindi, creeremo una migrazione Active Record per creare il nostro modello Twitter. Questo memorizzerà i tweet che riceviamo dalle chiamate API.
db-> driverName === 'mysql') $ tableOptions = 'SET CARATTERE 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' => Schema :: TYPE_BIGINT. 'NOT NULL', 'screen_name' => Schema :: TYPE_STRING. 'NOT NULL DEFAULT 0', 'text' => Schema :: TYPE_TEXT. ' NOT NULL ',' tweeted_at '=> Schema :: TYPE_INTEGER.' NOT NULL ',' created_at '=> Schema :: TYPE_INTEGER.' NOT NULL ',' updated_at '=> Schema :: TYPE_INTEGER.' NOT 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');
Proprio come abbiamo fatto nella prima parte, è necessario eseguire la migrazione:
./ yii migrate / up Yii Migration Tool (basato su Yii v2.0.3) Totale 1 nuova migrazione da applicare: m150309_174014_create_twitter_table Applicare la migrazione sopra? (sì | no) [no]: sì *** applica m150309_174014_create_twitter_table> crea tabella % twitter ... fatto (tempo: 0.008s)> aggiungi chiave esterna fk_twitter_moment: % twitter (momento_id) riferimenti % moment (id) ... done (time: 0.007s) *** applicato m150309_174014_create_twitter_table (time: 0.019s) Migrato con successo.
Quindi, ho utilizzato il generatore di codice di Yii2, Gii, per creare il modello e i controller CRUD per il modello di Twitter. Se ottieni il codice dell'ultimo repository GitHub utilizzando il link della barra laterale in questo tutorial, avrai anche il codice.
Poiché Twitter ha limitato le ricerche di geolocalizzazione alla scorsa settimana, alla fine ho scelto il discorso del presidente Obama per il cinquantesimo anniversario di Selma al Edmund Pettus Bridge.
Ho usato nuovamente Google Maps per ottenere le coordinate GPS per il bridge:
Quindi, ho creato un momento per il discorso da cercare. L'ho aggiornato alcune volte per modificare il raggio geografico della ricerca (è un ponte) e l'intervallo di tempo:
Le limitazioni dell'API di Twitter sono che ti consente solo di cercare per data, ad es. 2015-03-07, mentre Instagram è indicizzato da precisi timestamp Unix. Pertanto, dobbiamo iniziare la ricerca su Twitter per un giorno intero avanti e cercare all'indietro.
Poiché è probabile che otterremo molti tweet al di fuori del nostro intervallo di tempo desiderato, dobbiamo effettuare chiamate ripetute all'API di Twitter. Twitter restituisce fino a 100 tweet per richiesta API e consente 180 richieste per finestra di 15 minuti.
Sto usando la libreria API di James Mallison per PHP. Ecco come configuriamo la libreria per effettuare chiamate:
\ Yii :: $ app-> params ['twitter'] ['oauth_token'], 'oauth_access_token_secret' => \ Yii :: $ app-> params ['twitter'] ['oauth_secret'], 'consumer_key' => \ Yii :: $ app-> params ['twitter'] ['chiave'], 'consumer_secret' => \ Yii :: $ app-> params ['twitter'] ['secret'],); // Connetti a Twitter $ twitter = new TwitterAPIExchange ($ settings);
Inizialmente, richiediamo 100 risultati da Twitter alle nostre coordinate GPS fino a una data specifica.
funzione pubblica searchTwitter () date_default_timezone_set ('America / Los_Angeles'); Yii :: trace ('start searchTwitter' .date ('y-m-d h: m')); // Carica le tue chiavi dell'applicazione 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'] ['chiave'], 'consumer_secret' => \ Yii :: $ app-> params ['twitter'] ['secret'],); // Connetti a Twitter $ twitter = new TwitterAPIExchange ($ settings); // Impostazioni di query per la ricerca $ url = 'https://api.twitter.com/1.1/search/tweets.json'; $ requestMethod = 'GET'; // limite di velocità di 180 query $ limite = 180; $ Query_count = 1; $ count = 100; $ result_type = 'recent'; // calcola l'intervallo timestamp valido $ valid_start = $ this-> start_at; // $ until_date e $ valid_end = // ora di inizio + durata $ valid_end = $ this-> start_at + ($ this-> duration * 60); Yii :: trace ('Intervallo valido:'. $ Valid_start. '->'. $ Valid_end); $ until_date = date ('Y-m-d', $ valid_end + (24 * 3600)); // aggiungi un giorno $ distance_km = $ this-> distance / 1000; // distanza in km // Non utilizzato: & since = $ since_date // $ since_date = '2015-03-05'; // Esegui la prima query con until_date $ getfield = "? Result_type = $ result_type & geocode =". $ This-> latitude. ",". $ This-> longitude. ",". $ Distance_km. "Mi & include_entities = false & until = $ until_date & count = $ count ";
Registriamo solo i tweet nel nostro intervallo di tempo preciso, ignorando gli altri risultati. Mentre li elaboriamo, prendiamo nota dell'ID tweet più basso ricevuto.
$ tweets = json_decode ($ twitter-> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest ()); if (isset ($ tweets-> errors)) Yii :: $ app-> session-> setFlash ('error', 'Twitter Rate Limit Reached.'); Yii :: errore ($ tweets-> errori [0] -> messaggio); ritorno; $ max_id = 0; Yii :: trace ('Count Statuses:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> statuses $ t) // controlla se tweet nell'intervallo di tempo valido $ unix_created_at = strtotime ($ t-> created_at); Yii :: trace ('Tweet @'. $ T-> created_at. ". $ Unix_created_at. ':'. $ T-> user-> screen_name.". (Isset ($ t-> testo)? $ T-> testo: ")); if ($ unix_created_at> = $ valid_start && $ unix_created_at <= $valid_end) // print_r($t); $i = new Twitter(); $i->aggiungere ($ this-> id, $ t-> id_str, $ t-> user-> id_str, $ t-> user-> SCREEN_NAME, $ unix_created_at, (isset ($ t-> testo)? $ t-> text : ")); if ($ max_id == 0) $ max_id = intval ($ t-> id_str); else $ max_id = min ($ max_id, intval ($ t-> id_str));
Quindi eseguiamo il ciclo, inviando richieste ripetute a Twitter (fino a 179 volte in più), richiedendo record aggiuntivi precedenti all'ID tweet più basso del batch precedente. In altre parole, per le richieste successive, invece di interrogare fino a una data specifica, eseguiamo una query sul max_id dell'ID tweet più basso che abbiamo ricevuto.
Ci fermiamo quando vengono restituiti meno di 100 record o quando i tweet restituiti sono precedenti all'intervallo effettivo.
Se hai bisogno di accedere a più di 18.000 tweet, dovrai implementare un'attività in background per chiamare l'API di Twitter, come abbiamo fatto nelle altre nostre API di Twitter.
Mentre elaboriamo i risultati API, dobbiamo filtrare i tweet, registrando solo quelli che rientrano nella nostra ora di inizio e di fine effettiva.
Nota: l'API di Twitter ha un sacco di frustranti capricci che rendono il paging più difficile di quanto dovrebbe essere. Molto spesso Twitter non restituisce risultati senza un codice di errore. Altre volte, ho trovato che restituiva un piccolo numero di risultati, ma ciò non significava che un'altra richiesta non sarebbe tornata più. Non ci sono modi molto chiari per sapere quando Twitter ha finito di restituire i risultati. È incoerente. Pertanto, potresti notare che il mio codice presenta alcune soluzioni alternative interessanti, ad es. esaminare $ count_max_repeats.
$ count_repeat_max = 0; // Esegue tutte le query successive con l'aggiunta di maximum_tweet_id aggiornato mentre ($ 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 & count = $ count".....; $ tweets = json_decode ($ twitter-> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest ()); if (isset ($ tweets-> errors)) Yii :: $ app-> session-> setFlash ('error', 'Twitter Rate Limit Reached.'); Yii :: errore ($ tweets-> errori [0] -> messaggio); ritorno; // a volte twitter api fallisce se (! isset ($ tweets-> statuses)) continua; Yii :: trace ('Count Statuses:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> statuses $ t) // controlla se tweet nell'intervallo di tempo valido $ unix_created_at = strtotime ($ t-> created_at); if ($ unix_created_at> = $ valid_start && $ unix_created_at <= $valid_end) $i = new Twitter(); $i->aggiungere ($ this-> id, $ t-> id_str, $ t-> user-> id_str, $ t-> user-> SCREEN_NAME, $ unix_created_at, (isset ($ t-> testo)? $ t-> text : ")); else if ($ 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->status)<1) $count_repeat_max+=1; if ($count_repeat_max>5) // quando l'API non restituisce più risultati interrompono; // fine while
Uno dei primi risultati restituiti includeva i tweet sottostanti di Fred Davenport che mostravano il presidente Obama sul palco:
Ecco che è su Twitter:
Poi, mentre sfogli i risultati ulteriormente, puoi trovare molte più persone che presentano tweet su Obama, inclusi i media:
Ora, facciamo una ricerca più locale.
Key Arena è il grande concerto e l'arena sportiva di Seattle. Lo scorso fine settimana hanno organizzato il Torneo di pallacanestro femminile Pac-12:
Otteniamo le nostre coordinate GPS per Key Arena da Google Maps:
Quindi, ho creato e ottimizzato un momento per trovare un intervallo di tempo più lungo per il fine settimana dei tweet:
E, ecco alcuni dei risultati. Il mio preferito è:
"Voglio lasciare questa partita di basket, odio il basket".
Per la maggior parte, mi sembra che l'API di Instagram sia molto più potente di Twitter e produce risultati generalmente più intriganti. Tuttavia, dipende dal tipo di persona che stai cercando. Se vuoi solo identificare le persone che erano presenti, l'API funziona bene.
Spero ti sia piaciuta questa serie. L'ho trovato affascinante e sono rimasto impressionato dai risultati. E mette in evidenza le preoccupazioni che dovremmo avere tutti sul nostro livello di privacy in questa era digitale interconnessa.
Le API per Instagram e Twitter sono entrambi incredibilmente potenti servizi per la ricerca di utenti di social media che si trovavano nelle vicinanze di determinati luoghi in determinati momenti. Questa informazione può essere utilizzata per sempre e può essere abusata. Probabilmente dovresti prendere in considerazione la possibilità di disattivare la pubblicazione della geolocalizzazione: segui i collegamenti su Pronto o No? App.
Potresti anche voler controllare il mio edificio con la serie API Twitter, anche su Tuts+.
Non esitate a postare le vostre domande e commenti qui sotto. Puoi anche raggiungermi su Twitter @reifman o mandarmi un'email direttamente. Apprezzerei soprattutto l'ascolto da parte di giornalisti e forze dell'ordine che fanno uso di questi esempi.
Puoi anche sfogliare la mia pagina di istruttori + tutor per vedere altri tutorial che ho scritto.