<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Streaming von Twitter-Daten in eine JMP-Datentabelle
Scrollen Sie bis zum Ende, wenn Sie nur das Video sehen möchten.
Ich habe einige minimale Tests dieser JSL auf Mac und Win in JMP 11 und 12 durchgeführt.Das Video nutzt Funktionen in einer zukünftigen Version von JMP, aber lassen Sie sich davon nicht aufhalten.Fügen Sie hier einen Kommentar zu Ihrer Erfahrung hinzu.Die JSL befindet sich in der angehängten ZIP-Datei.
Dieser Beitrag berührt leicht eine Reihe von Themen.
- Twitter-Konto
- Streaming-Daten
- bisschen Manipulation
- JSON
- OAuth-Autorisierung, Signierung
- cURL
- Kartenkoordinaten
Überblick: Entpacken Sie die JSL in ein Verzeichnis.Erstellen Sie eine Twitter-App, kopieren Sie die Schlüssel in eine JSL-Datei.(Windows) Holen Sie sich eine Kopie von cURL und füllen Sie den Pfad in MAIN.jsl aus.Führen Sie die MAIN.jsl-Datei aus.
Start
Sie benötigen ein Twitter-Konto und müssen die Twitter-Nutzungsbedingungen lesen und verstehen, bevor Sie beginnen.(Die Daten, die Sie in einem Stream sammeln, gehören Ihnen nicht und sind mit Einschränkungen hinsichtlich der Verwendung dieser Daten verbunden.Ich werde dir keinen Rat geben, was in Ordnung ist oder nicht.)
Verwenden Sie Ihr Twitter-Konto https://apps.twitter.com/ um eine neue Anwendung zu erstellen.Dies ist KEINE App wie ein Handy.Es handelt sich um eine Reihe von Schlüsseln, mit denen ein Programm auf den Twitter-Stream zugreifen kann.Dieses Programm kann eine App auf einem Handy sein, oder es könnte JSL oder ein Python-Programm sein http://www.tweepy.org/ bietet.(Ich habe mit tweepy angefangen und bin dann den JSL-Pfad hinuntergegangen.Tweepy oder eine andere Python-basierte Lösung ist möglicherweise besser als diese JSL-Lösung.)
Klicken Sie auf Neu, um eine neue Anwendung zu erstellen, erfinden Sie einen Namen, den noch niemand verwendet hat, fügen Sie eine Beschreibung hinzu, geben Sie den Namen Ihrer Website ein und lassen Sie die Rückruf-URL leer.Sie müssen einen Website-Namen angeben, aber wie es nahelegt, können Sie einen Platzhalter verwenden.Lesen Sie die Vereinbarung und klicken Sie dann auf Twitter-Anwendung erstellen.

Sie sind auf einem Bildschirm mit Registerkarten gelandet; Die dritte Registerkarte, Schlüssel und Zugriffstoken, ist die gewünschte.

Oben finden Sie einen Teil dessen, was Sie benötigen, den Verbraucherschlüssel und das Verbrauchergeheimnis.Sie benötigen den Verbraucherschlüssel und das Geheimnis.Fangen Sie an und starten Sie Ihr JMP-Projekt; Es wird mehrere Dateien geben, also erstellen Sie ein Verzeichnis, entpacken Sie die JSL-Dateien, bearbeiten Sie EncryptedKeys.JSL und beginnen Sie mit dem Ausfüllen:
// apps.twitter.com verwenden um eine neue Anwendung zu erstellen.Kopieren Sie die Schlüssel hier.
ConsumerKey = "Pnb…LAZ";
ConsumerSecret = "AF4C…………………………qNvXp";
Klicken Sie unten auf die Schaltfläche Meinen Zugriffstoken erstellen, um die letzten beiden Werte zu erhalten.

Kopieren Sie sie ... Access Token ist alles in einer Zeile mit einem Bindestrich ...
accessToken = "3…………………………-………………………………………………am";
accessTokenSecret = "rc………………………HJ";
EncryptedKeys.JSL hat fünf Zeilen, einschließlich des Kommentars.Es wird von einer anderen Datei eingefügt; die Sicherheit des Computers, auf dem Sie EncryptedKeys.JSL speichern, sollten Sie berücksichtigen.Zwei der Schlüssel gelten als öffentlich, aber zwei sind Geheimnisse, die nur Sie kennen sollten.Niemand sonst benötigt die öffentlichen Schlüssel, sodass sie alle an einem Ort bleiben können.
Besuch https://apps.twitter.com/ und stellen Sie sicher, dass die App existiert, dann können Sie sich von Twitter abmelden.
Twitter-Streaming
Twitter bietet andere Möglichkeiten, seinen Dienst zu nutzen https://dev.twitter.com/ die das Abrufen bestimmter Tweets und das Erstellen neuer Tweets ermöglichen, aber beim Streaming geht es um das Sammeln von Echtzeit-Tweets mithilfe eines Filters.Der Filter, den Twitter anwenden kann, ist so konzipiert, dass er für ihre Computer effizient ist und möglicherweise nicht genau das tut, was Sie wollen (denken Sie daran, wie viel Sie ihnen zahlen).Die interessantesten Suchanfragen beziehen sich auf Schlüsselwörter und geografische Gebiete. das Ergebnis ist die Vereinigung (nicht die Schnittmenge) aller Suchbegriffe.Das Beispielvideo verwendete „Frühstück“, „Mittagessen“ und „Abendessen“ ohne geografischen Begrenzungsrahmen.Weltweit wurden damit etwa 3 Tweets pro Sekunde abgerufen.Es ist nicht möglich, die Suche mit einem Begrenzungsrahmen um London herum auf London einzugrenzen; Das wird versuchen, alle Tweets aus London sowie Frühstück, Mittag- und Abendessen aus der ganzen Welt zurückzugeben.Ich bin mir noch nicht sicher, wie viele Daten Twitter streamen wird; An einem Punkt dachte ich, Twitter würde drosseln und an einem anderen Punkt dachte ich, Twitter würde den Stream stoppen, wenn ich die Daten nicht schnell genug verarbeiten könnte.Vielleicht stimmt beides.In einem früheren Experiment habe ich „Raleigh“ ausgewählt und einen Begrenzungsrahmen um Raleigh, NC, gelegt.Ich habe Tweets über gestohlene Raleigh-Fahrräder auf der ganzen Welt erhalten.
Vorsicht
Sie müssen Ihre eigene Post-Capture-Filterung durchführen, und Sie möchten möglicherweise Ihre eigene Liste mit Wörtern erstellen, die Sie nicht mögen.Wenn Sie eine Liste mit unzensierten Tweets öffentlich präsentieren, werden Sie in Verlegenheit gebracht oder schlimmer.Denken Sie auch daran, dass Twitter Regeln dafür hat, wie Sie die Daten präsentieren können.
Geografische Auswahl
Dieses Snippet von JSL wählt Suchbegriffe und geografische Standorte aus.Da der Code kompliziert wurde, fing ich an, Namespaces zu verwenden:
include("PICK.jsl");
PICK:trackParm = "Mittagessen, Abendessen, Frühstück"; // Standardabfrage
PICK:Pick(); // GUI zum Anpassen der Abfrage

Die Schaltfläche Rechteck hinzufügen fügte zwei Rechtecke hinzu.Die Werte im PICK-Namespace werden später zum Erstellen der Twitter-Abfrage verwendet.Es gibt eine kleine Menge an „und“-Fähigkeiten; Mittagessen essen, Abendessen essen, Frühstück essen könnte verwendet werden, um Tweets auszuwählen, die sowohl „essen“ als auch eine Mahlzeit enthalten.Aber meistens ist alles ODER-verknüpft (Union).
Mehr beinhaltet
include("JSON.jsl"); // Teilmenge der JSON-Bibliothek von Xan, um einen Tweet zu parsen
include("BITS.jsl"); // Code für Bitmanipulation
include("AUTH.jsl"); // Code für Eid
include("SIGN.jsl"); // Code zum Signieren
include("PARM.jsl"); // Code zum Erstellen des http-Parameters für curl
Dazu gehören das Laden einer Reihe von JSL und einige kleine Plausibilitätsprüfungen und Selbsttests.BITS benötigt eine Minute, um einige Datenstrukturen zu initialisieren, um später schnelleren Code zu erstellen. Seien Sie geduldig, während +++ in das Protokollfenster gedruckt wird.JSON wird entnommen Arbeit, die Xan früher gemacht hat ; Der Twitter-Stream wird im JSON-Format gesendet.AUTH und SIGN enthalten JSL, das die EncryptedKeys zur Authentifizierung („Anmeldung“) bei Twitter verwendet.Es ist kompliziert und verwendet ein externes Programm, das bereits auf Ihrem Computer installiert ist, um den SHA1-Hash zu erstellen.Als ich die Bitfunktionen schrieb, dachte ich, ich müsste den SHA1-Hash implementieren, aber er ist auch kompliziert, und ich bin froh, einen zu verwenden, der nicht debuggt werden muss.Das letzte Include, PARM, baut einen String für cURL auf.
cURL
Sie benötigen eine Kopie von cURL.Es existiert bereits auf MAC.Windows-Leute können es von bekommen http://curl.haxx.se/ nachdem Sie zuerst mit Ihren Systemleuten nachgefragt haben.https://en.wikipedia.org/wiki/CURL ist ein Ausgangspunkt für Ihre cURL-Fragen.Ich habe heruntergeladen Win64 x86_64 CAB .(Ihr Computer ist I386, nicht IA64). Ziehen Sie curl.exe per Drag & Drop auf den Desktop und stellen Sie sicher, dass JMP weiß, wo es zu finden ist (RunProgram erweitert $DESKTOP nicht, geben Sie die vollständige Antwort ein!):
cURLlocation="C:\Benutzer\Benutzer\Desktop\curl.exe";
cURL ist ein Befehlszeilendienstprogramm, auf das JMP über die RunProgram-Funktion zugreifen kann.Das cURL-Programm stellt die Verbindung zu Twitter her und leitet den Tweet-Stream zurück an JMP.
RunProgram(executable( cURLlocation ),options( cURLparms ),
readFunction(Funktion( {dies},
buftxt ||= this << read( blob );
Prozess();
If( this << isReadEOF,
Schreiben ( Rechts ( Char ( buftxt ), 100 ) ) );))
Die Funktionen cURLparms und process() (oben verwendet) sind alles, was noch erklärt werden muss.
cURLparms kommt von PARM:curlParm(PICK:trackParm, PICK:locationParm); die PICK (ganz oben) verwendet, um herauszufinden, welche Begriffe und welche Orte verfolgt werden sollen.Die curlParm-Funktion im PARM-Namespace verwendet die ConsumerKey...applicationTokenSecret-Variablen (ganz oben), um die Signierung/Autorisierung für die spezifischen Begriffe und Speicherorte durchzuführen.
Die Prozessfunktion nimmt Daten aus buftxt und fügt sie in eine Datentabelle ein.
Laufen
Fertig!Legen Sie die angehängten Dateien im selben Verzeichnis wie die EncryptedKeys.JSL ab, öffnen Sie die main.jsl und führen Sie sie aus.Der Dialog wird geöffnet; (Drücken Sie einfach beim ersten Mal auf OK ... um die Suche zu verwenden, die die Kartenpunkte anzeigt ...) Geben Sie ein paar Suchbegriffe oder einen kleinen Ort oder vielleicht beides ein.
Am Ende der JSL sehen Sie eine Schleife, die das RunProgram neu startet, wenn es unerwartet stoppt.Es verzögert sich um 60 Sekunden, um zu verhindern, dass die Twitter-Site missbraucht wird, wenn im Skript etwas schief geht.Internetverbindungen können tagelang bestehen bleiben oder mehrmals pro Stunde ausfallen.Es ist auch möglich, dass Twitter die Verbindung aus verschiedenen Gründen anhält.Die for-Schleife ist auch darauf beschränkt, nur wenige Male neu zu starten.
Die Skripte sind kaum getestet; frag wenn es nicht geht danke!
Die zweite Datentabelle und die Karte hängen von den Standardwerten für Frühstück/Mittagessen/Abendessen im Eröffnungsdialog ab.Es gibt einige hartcodierte JSL, die nach Frühstücks-/Mittagessen-/Abendessen-Tweets suchen.Sie können es nachbearbeiten oder ganz herausschneiden.
Die STOP-Schaltfläche am unteren Rand der Karte bringt (wahrscheinlich) das Skript zu einem eleganten Stopp.Ich habe einen Fehler behoben, der möglicherweise verhindert, dass JMP auf MAC für eine zukünftige Version ordnungsgemäß beendet wird. Möglicherweise müssen Sie das Beenden in JMP 11 oder 12 erzwingen.
Präsentation (ein Video aus der Datentabelle erstellen)
Nachdem Sie die Frühstücks-/Mittags-/Abendessen-Tweets für eine Weile aufgenommen haben, sind genügend Daten vorhanden, um ein Video zu erstellen.Verwenden von Ideen aus mehreren kürzlich veröffentlichten Beiträgen …In Ermangelung eines besseren Farbcodierungsstandards verwenden Sie Grün, um den Tag zu beginnen, Rot, um den Tag zu beenden, und Blau für die Mittagszeit.Unterteilen Sie die Zeilen, um nur diejenigen mit Standortdaten zu behalten.Ich habe eine Formel verwendet, um xLon- und yLat-Spalten entweder aus Koordinaten oder dem Zentrum von placeBounding_boxCoordinates zu erstellen:

Die Formel setzt den Wert auf fehlend, wenn die Koordinaten nicht verfügbar sind; nur etwa 5 % der Tweets haben Koordinaten.
Diese Spaltenformel hat eine Spalte erstellt, um die Tweets zu kategorisieren, aber immer noch unterschiedlich für jede Sprache:

Gefolgt von dieser Spaltenformel, um Kategorien zu kombinieren:

Um die Generierung der Videoframes zu beschleunigen, laden Sie die Teildaten in Matrizen:
dt = open("$desktop/sha1/TwitterFeed3.jmp");
xLonVec=dt:xLon<
yLatVec=dt:yLat<
kindVec = dt:kindCode<
timeVec = dt:dateUTC<
schließen (dt, nosave);
Erstellen Sie eine GraphBox, um die Frames zu erstellen:
New Window( "Meal Tweets", // die Markierungsgröße des Diagramms wird für die roten/grünen/blauen Tweet-Positionen verwendet
g = Diagrammfeld (Rahmengröße (1920, 900), <
);
Es gibt mehr JSL, um die Achsen festzulegen, die Karte hinzuzufügen.Die meiste Arbeit wird in diesem Grafikskript erledigt, das die aus der Datentabelle geladenen Matrizen verarbeitet:
g[framebox( 1 )] << addGraphicsScript(
Transparenz (.8);
for(idx=lowIndex,idx<=highIndex,idx++,
Marker(Color State(match(kindVec[idx],1,"green",2,"blue",3,"red")),{xLonVec[idx], yLatVec[idx]});
)
);
Und der Treibercode, der bewirkt, dass die Karte mit unterschiedlichen Start- und Endzeiten neu gezeichnet wird und ein Bild erfasst:
nframes = Sekunden*30;// Sekunden bei 30fps
start = min (timeVec);
Ende = max (timeVec);
Dauer = Ende - Beginn;
Delta = Dauer / nFrames;
Für ( iframe = 0, iframe < nframes, iframe ++,
mindate = start + (iframe - 0) * delta - 2*3600; // 2 Stunden zurück.
maxdate = start + (iframe + 1) * delta + 3600; // 1 Stunde weiter
lowIndex=floor(interpolate(mindate,timeVec,1::nrows(timeVec)));
highIndex=floor(interpolate(maxdate,timeVec,1::nrows(timeVec)));
g<
Warte( 1 );
g[framebox(1)]<
);
Schließlich haben Sie die Frames für die Produktion eines Videos.Ich habe Blender (lange Lernkurve, aber leistungsstark) verwendet, um dieses fünfminütige Video zu erstellen, das 377.765 Tweets über 16 Tage enthält, einschließlich der US-amerikanischen Thanksgiving-Feiertage.Es gab insgesamt 8.187.114 Tweets, aber die meisten enthielten keine Längen- und Breitengraddaten.Wenn ich dies noch einmal mache, werde ich die Daten bei der Erfassung unterteilen; die 2,5 GB volle Tabelle ist groß.
https://www.youtube.com/watch?v=N20KsrmdgOU Maximieren!
Keine Befestigung? Klick hier um den Beitrag zu sehen.