Dies ist der zweite Teil einer zweiteiligen Serie zur Verwendung sozialer Medien, um Augenzeugen bei wichtigen Ereignissen zu lokalisieren. Im ersten Teil habe ich Ihnen gezeigt, wie Sie mithilfe der Instagram-API Augenzeugen eines Live-Videodrehs von Macklemore in Seattle finden können. In diesem Teil verwenden wir die Twitter-API, um die Teilnehmer von Präsident Obamas Rede in Selma an der Edmund Pettus Bridge zu finden.
Sie können Code für beide Episoden herunterladen, indem Sie den GitHub-Repository-Link in der Seitenleiste verwenden. Vielleicht interessieren Sie sich auch für meine Tuts + -Serie, Erstellen mit der Twitter-API.
Die Geosearch-Funktionen von Twitter sind eingeschränkt und erfordern daher etwas detaillierteren Code. Geotagged Posts auf Twitter sind nur in den letzten sieben Tagen zu finden. Sie können nur nach Datum (nicht nach Zeit) durchsucht werden, daher müssen Sie die API-Ergebnisse nach Genauigkeit filtern.
Ich nehme an den Diskussionen unten teil. Wenn Sie eine Frage oder ein Thema haben, schreiben Sie bitte einen Kommentar. Sie können mich auch auf Twitter @reifman erreichen oder mich direkt per E-Mail kontaktieren.
Die Handys, die wir in unseren Taschen tragen, dokumentieren jede unserer Bewegungen und teilen sie mit Mobilfunkanbietern und oft auch mit Software-Unternehmen von Drittanbietern, deren Motivation im Allgemeinen auf Gewinn ausgerichtet ist.
Viele Menschen wissen nicht, dass sie das Geotagging in ihren Social-Media-Apps verlassen haben und ihren Standort mit jedem Social-Media-Beitrag vollständig bekannt machen. Dazu gehörte der GOP-Kongressabgeordnete Aaron Schock. Der AP nutzte die Geotags seines Instagram-Kontos, um seine Verwendung von Steuergeldern für extravagante Privatflüge und andere luxuriöse Aktivitäten aufzudecken.
Geotagging kann also zum Guten genutzt werden. In dieser Serie untersuchen wir, wie Journalisten oder Strafverfolgungsbehörden potenzielle Augenzeugen zu wichtigen Ereignissen wie Verbrechen oder Unfallszenen mithilfe von sozialen Medien finden können.
Geotagging kann jedoch auch missbräuchlich eingesetzt werden. Berkeley-Informatiker und Pädagogen bauten das Ready or Not? App, um zu zeigen, wie Geotagging in Twitter und Instagram jeden einzelnen Schritt aufzeichnet.
Hier ist der Twitter-Account von Apple-Mitbegründer Steve Wozniak in der App:
Das Geotagging auf Instagram und Twitter ist so genau, dass jemand Ihren Wohnort, Ihren Arbeitsplatz und Ihre Reiseroutine leicht bestimmen kann.
In dieser Episode werde ich Sie durch die Twitter-API führen. Ich habe ein GitHub-Repository bereitgestellt (der Link befindet sich in der Seitenleiste), damit Sie es herunterladen können, um den Code auszuprobieren. Meine "Augenzeugen-App" ist im Yii-Framework für PHP geschrieben, über das Sie in meiner Serie "Programmieren mit Yii2" für Tuts mehr erfahren können+.
Wenn Sie Ihren Standort nicht teilen möchten, damit die Öffentlichkeit ihn sehen oder einen historischen Weg Ihrer Reisen hinterlassen kann - das Ready oder Not? Die App bietet Links und Anleitungen zum Deaktivieren dieser Funktionen (suchen Sie auf der Startseite nach dem Link). Ehrlich gesagt, ich habe meine ausgeschaltet und ich möchte Sie dazu ermutigen.
Wenn Sie eine Strafverfolgungsbehörde oder ein Medienunternehmen sind, die weitere Informationen wünschen, wenden Sie sich bitte direkt an mich. Ich würde mich auch für eine erfolgreiche Verwendung dieses Codes interessieren (für immer) - sie würden eine interessante Folgegeschichte machen.
In der letzten Episode haben wir die Instagram-API verwendet, um Augenzeugen von Mackelmores Live-Shooting für 2013 für White Cadillac zu finden. Ganz leicht gelang es uns, Instagram-Mitglied Joshua Lewis Foto von Macklemore zu finden, der aus seinem Fahrzeug stieg (cool, was?):
Beginnen wir nun mit der Nutzung der Twitter-API.
Wie bei Instagram müssen Sie sich bei Ihrem Twitter-Konto anmelden und eine Entwickleranwendung registrieren. Sie sollten eine App wie folgt registrieren:
Twitter zeigt Ihnen Ihre Bewerbungsdetails:
Hier ist die Einstellungsseite:
Hier sind die Schlüssel und Zugriffstoken für die Anwendung. Notieren Sie sich diese.
Scrollen Sie dann nach unten und erstellen Sie Zugriffstoken für Ihr Konto. Notieren Sie sich auch diese.
Fügen Sie alle vier dieser Konfigurationsschlüssel und -geheimnisse Ihrem hinzu /var/secure/eyew.ini
Datei:
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"
Anschließend erstellen wir eine Active Record-Migration, um unser Twitter-Modell zu erstellen. Dadurch werden die Tweets gespeichert, die wir von den API-Aufrufen erhalten.
db-> driverName === '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' => 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');
Genau wie in Teil 1 müssen Sie die Migration ausführen:
./ yii migrieren / up Yii Migration Tool (basierend auf Yii v2.0.3) Insgesamt 1 neu anzuwendende Migration: m150309_174014_create_twitter_table Anwenden der obigen Migration? (Ja | Nein) [Nein]: Ja *** Anwendung von m150309_174014_create_twitter_table> Tabelle erstellen % twitter… done (Zeit: 0,008s)> Fremdschlüssel hinzufügen fk_twitter_moment: % twitter (Moment_id) Referenzen % moment (id)… done (Zeit: 0,007s) *** angewendet m150309_174014_create_twitter_table (Zeit: 0.019s) Erfolgreich migriert.
Dann habe ich Giii, den Codegenerator von Yii2, verwendet, um das Modell und die CRUD-Controller für das Twitter-Modell zu erstellen. Wenn Sie den neuesten GitHub-Repository-Code über den Sidebar-Link in diesem Lernprogramm erhalten, erhalten Sie auch den Code.
Da Twitter die Geolocation-Suche auf die vergangene Woche beschränkt, wählte ich schließlich die Rede von Präsident Obamas Selma 50. Jahrestag an der Edmund Pettus Bridge.
Ich habe Google Maps erneut verwendet, um die GPS-Koordinaten für die Brücke zu erhalten:
Dann erstellte ich einen Moment, in dem die Rede gesucht werden sollte. Ich habe es einige Male aktualisiert, um den geographischen Radius der Suche (es ist eine Brücke) und den Zeitraum zu optimieren:
Die Einschränkungen der Twitter-API bestehen darin, dass Sie nur nach Datum suchen können, z. 07.03.2015, während Instagram durch genaue Unix-Zeitstempel indiziert wird. Deshalb müssen wir unsere Twitter-Suche einen ganzen Tag im Voraus beginnen und rückwärts suchen.
Da wir wahrscheinlich viele Tweets außerhalb unseres gewünschten Zeitraums erhalten, müssen wir die Twitter-API wiederholt aufrufen. Twitter gibt bis zu 100 Tweets pro API-Anfrage zurück und erlaubt 180 Anfragen pro 15-Minuten-Fenster.
Ich benutze die API API Library von James Mallison für PHP. So richten Sie die Bibliothek für Anrufe ein:
\ 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'],); // Mit Twitter verbinden $ twitter = new TwitterAPIExchange ($ settings);
Zunächst fordern wir 100 Ergebnisse von Twitter bei unseren GPS-Koordinaten bis zu einem bestimmten Datum an.
öffentliche Funktion searchTwitter () date_default_timezone_set ('America / Los_Angeles'); Yii :: trace ('searchTwitter starten' .date ('y-m-d h: m')); // Laden Sie Ihre Twitter-Anwendungsschlüssel. $ 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'] ['key'], 'consumer_secret' => \ Yii :: $ app-> params ['twitter'] ['secret'],); // Mit Twitter verbinden $ twitter = new TwitterAPIExchange ($ settings); // Abfrageeinstellungen für die Suche $ url = 'https://api.twitter.com/1.1/search/tweets.json'; $ requestMethod = 'GET'; // Ratenlimit von 180 Abfragen $ limit = 180; $ query_count = 1; $ count = 100; $ result_type = 'Recent'; // gültige Zeitmarke berechnen $ valid_start = $ this-> start_at; // $ until_date und $ valid_end = // Startzeit + Dauer $ valid_end = $ this-> start_at + ($ this-> duration * 60); Yii :: trace ('Gültiger Bereich:'. $ Valid_start. '->'. $ Valid_end); $ bis_datum = Datum ('Y-m-d', $ valid_end + (24 * 3600)); // Einen Tag hinzufügen $ distance_km = $ this-> distance / 1000; // Entfernung in km // Nicht verwendet: & since = $ since_date // $ since_date = '2015-03-05'; // Erste Abfrage mit until_date ausführen $ getfield = "? Result_type = $ result_type & geocode =". $ This-> width. ",". $ This-> longitude. ",". $ Distance_km. "Mi & include_entities = false & until = $ until_date & count = $ count ";
Wir erfassen Tweets nur innerhalb unseres genauen Zeitbereichs und ignorieren die anderen Ergebnisse. Während wir diese verarbeiten, notieren wir die niedrigste erhaltene Tweet-ID.
$ tweets = json_decode ($ twitter-> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest ()); if (isset ($ tweets-> errors)) Yii :: $ app-> session-> setFlash ('error', 'Twitter Rate Limit Reached.'); Yii :: error ($ tweets-> errors [0] -> message); Rückkehr; $ max_id = 0; Yii :: trace ('Count Statuses:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> statuses als $ t) // prüfe, ob im gültigen Zeitbereich getwittert wird $ unix_created_at = strtotime ($ t-> created_at); Yii :: trace ('Tweet @'. $ T-> created_at. ". $ Unix_created_at. ':'. $ T-> user-> screen_name.". (Isset ($ t-> text)? $ 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-> user-> id_str, $ t-> user-> screen_name, $ unix_created_at, (isset ($ t-> text)? $ t-> text : ")); if ($ max_id == 0) $ max_id = intval ($ t-> id_str); else $ max_id = min ($ max_id, intval ($ t-> id_str));
Dann wiederholen wir eine Schleife, stellen wiederholte Anfragen an Twitter (bis zu 179 Mal) und fordern zusätzliche Datensätze an, die vor der niedrigsten Tweet-ID des vorherigen Batch liegen. Mit anderen Worten, bei nachfolgenden Anfragen fragen wir nicht nach einem bestimmten Datum, sondern nach der max_id der niedrigsten Tweet-ID, die wir erhalten haben.
Wir hören auf, wenn weniger als 100 Datensätze zurückgegeben werden oder wenn zurückgegebene Tweets vor unserem tatsächlichen Bereich liegen.
Wenn Sie Zugriff auf mehr als 18.000 Tweets benötigen, müssen Sie eine Hintergrundaufgabe implementieren, um die Twitter-API aufzurufen, wie in unserer anderen Twitter-API-Serie.
Bei der Verarbeitung von API-Ergebnissen müssen wir Tweets filtern und nur diejenigen aufzeichnen, die innerhalb unserer tatsächlichen Start- und Endzeit liegen.
Hinweis: Die Twitter-API hat viele frustrierende Macken, die das Paging schwieriger machen, als es sein sollte. Häufig liefert Twitter keine Ergebnisse ohne Fehlercode. Zu anderen Zeiten fand ich eine kleine Anzahl von Ergebnissen, aber dies bedeutete nicht, dass eine andere Anfrage nicht mehr zurückgeben würde. Es gibt keine eindeutigen Möglichkeiten, zu erfahren, wann Twitter die Ergebnisse an Sie zurückgibt. Es ist inkonsistent. Möglicherweise stellen Sie fest, dass mein Code einige interessante Problemumgehungen enthält, z. $ count_max_repeats untersuchen.
$ count_repeat_max = 0; // Führen Sie alle nachfolgenden Abfragen mit dem Zusatz von aktualisierten Maximum_tweet_id while ($ query_count.) Aus<=$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->width. ",". $ 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', 'Twitter Rate Limit Reached.'); Yii :: error ($ tweets-> errors [0] -> message); Rückkehr; // Manchmal schlägt Twitter API fehl, wenn (! isset ($ tweets-> statuses)) continue; Yii :: trace ('Count Statuses:' .count ($ tweets-> statuses)); Yii :: trace ('Max Tweet Id:'. $ Max_id); foreach ($ tweets-> statuses als $ t) // prüfe, ob im gültigen Zeitbereich getwittert wird $ 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-> user-> id_str, $ t-> user-> screen_name, $ unix_created_at, (isset ($ t-> text)? $ 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) // wenn das api nicht mehr ergebnisse zurückgibt; // Ende
Eines der ersten Ergebnisse war der unten stehende Tweet von Fred Davenport, der Präsident Obama auf der Bühne zeigte:
Hier ist es bei Twitter:
Wenn Sie dann weiter durch die Ergebnisse blättern, finden Sie viele weitere Personen, die über Obama twittern, einschließlich der Medien:
Lassen Sie uns jetzt eine lokalere Suche durchführen.
Die Key Arena ist die große Konzert- und Sportarena von Seattle. Am vergangenen Wochenende hielten sie das Pac-12-Basketballturnier für Frauen ab:
Lass uns unsere GPS-Koordinaten für Key Arena von Google Maps erhalten:
Dann erstellte und verbesserte ich einen Moment, um einen längeren Zeitraum für das Wochenende der Tweets zu finden:
Und hier sind einige Ergebnisse. Mein Liebling ist:
"Ich möchte dieses Basketballspiel verlassen. Ich hasse Basketball."
Mir scheint, dass die API von Instagram weitaus leistungsfähiger als die von Twitter ist und im Allgemeinen faszinierendere Ergebnisse liefert. Es hängt jedoch von der Person ab, nach der Sie suchen. Wenn Sie nur Personen identifizieren möchten, die dort waren, funktioniert eine der beiden APIs gut.
Ich hoffe du hast diese Serie genossen. Ich fand es faszinierend und war von den Ergebnissen beeindruckt. Und es unterstreicht die Bedenken, die wir alle hinsichtlich unseres Datenschutzniveaus in diesem vernetzten digitalen Zeitalter haben sollten.
Die APIs für Instagram und Twitter sind beide unglaublich leistungsstarke Dienste, um Benutzer von Social Media zu finden, die sich zu bestimmten Zeiten in der Nähe bestimmter Orte befanden. Diese Informationen können für immer genutzt und missbraucht werden. Sie sollten wahrscheinlich in Betracht ziehen, Ihre Standortbestimmung zu deaktivieren. Folgen Sie den Links unter Bereit oder Nicht? App.
Vielleicht möchten Sie auch meine Gebäude mit der Twitter-API-Serie überprüfen, auch auf Tuts+.
Bitte zögern Sie nicht, unten Ihre Fragen und Kommentare zu posten. Sie können mich auch auf Twitter @reifman erreichen oder mich direkt per E-Mail kontaktieren. Ich würde es besonders schätzen, von Journalisten und Strafverfolgungsbehörden zu hören, die diese Beispiele verwenden.
Sie können auch meine Tuts + Instructor-Seite durchsuchen, um andere Tutorials zu sehen, die ich geschrieben habe.