<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Streaming di dati Twitter in una tabella dati JMP
Scorri fino alla fine se vuoi solo il video.
Ho eseguito alcuni test minimi di questo JSL su Mac e Win, in JMP 11 e 12.Il video sfrutta le funzionalità di una futura versione di JMP, ma non lasciarti fermare da questo.Aggiungi un commento qui sulla tua esperienza.Il JSL si trova nel file ZIP allegato.
Questo post tocca, con leggerezza, una serie di argomenti.
- account Twitter
- dati in streaming
- manipolazione dei bit
- JSON
- Autorizzazione OAuth, firma
- arricciare
- coordinate della mappa
Panoramica: decomprimere il JSL in una directory.Crea un'app Twitter, copia le chiavi in un file JSL.(Windows) prendi una copia di cURL e inserisci il percorso in MAIN.jsl.Esegui il file MAIN.jsl.
Inizio
Avrai bisogno di un account Twitter e dovrai leggere e comprendere i Termini di utilizzo di Twitter prima di iniziare.(I dati che raccogli in uno stream non ti appartengono e sono soggetti a restrizioni su come puoi utilizzarli.Non ti darò consigli su cosa va bene o cosa no.)
Usando il tuo account Twitter, usa https://apps.twitter.com/ per creare una nuova applicazione.Questa NON è un'app come quella di un telefono cellulare.È un insieme di chiavi che consente a un programma di accedere allo stream di Twitter.Quel programma potrebbe essere un'app su un telefono cellulare, oppure potrebbe essere JSL o un programma Python simile http://www.tweepy.org/ fornisce.(Ho iniziato con Tweepy e poi ho seguito il percorso JSL.Tweepy o un'altra soluzione basata su Python potrebbe essere migliore di questa soluzione JSL.)
Fai clic su Nuovo per creare una nuova applicazione, creare un nome che nessun altro ha utilizzato, aggiungere una descrizione, inserire il nome del tuo sito web e lasciare vuoto l'URL di richiamata.Devi fornire il nome di un sito web, ma, come suggerisce, puoi utilizzare un segnaposto.Leggi l'accordo, quindi fai clic su Crea applicazione Twitter.

Sei atterrato su una schermata con schede; la terza scheda, Chiavi e token di accesso, è quella che desideri.

In alto troverai parte di ciò che ti serve, la Consumer Key e il Consumer Secret.Avrai bisogno della chiave e del segreto del consumatore.Vai avanti e avvia il tuo progetto JMP; ci saranno diversi file, quindi crea una directory, decomprimi i file JSL e modifica EncryptedKeys.JSL e inizia a compilarlo:
// usa apps.twitter.com per creare una nuova applicazione.Copia le chiavi qui.
consumerKey = "Pnb…LAZ";
consumatoreSegreto = "AF4C…………qNvXp";
Fai clic sul pulsante Crea il mio token di accesso in basso per ottenere gli ultimi due valori.

Copiali... Il token di accesso è tutto su una riga con un trattino...
accessToken = "3…………-………………………………………………am";
accessTokenSecret = "rc………HJ";
EncryptedKeys.JSL ha cinque righe, incluso il commento.Verrà incluso in un altro file; la sicurezza del computer su cui memorizzi EncryptedKeys.JSL è qualcosa che dovresti considerare.Due delle chiavi sono considerate pubbliche, ma due sono segrete che solo tu dovresti conoscere.Nessun altro ha bisogno delle chiavi pubbliche, quindi possono rimanere tutti nello stesso posto.
Visita https://apps.twitter.com/ e assicurati che l'app esista, quindi puoi disconnetterti da Twitter.
Trasmissione in streaming su Twitter
Twitter offre altri modi per utilizzare il proprio servizio https://dev.twitter.com/ che consentono di recuperare tweet specifici e di creare nuovi tweet, ma lo streaming consiste nel raccogliere tweet in tempo reale utilizzando un filtro.Il filtro che Twitter può applicare è progettato per essere efficiente per i loro computer e potrebbe non fare esattamente quello che desideri (ricorda quanto li stai pagando).Le query più interessanti riguardano parole chiave e aree geografiche; il risultato sarà l'unione (non l'intersezione) di tutti i termini ricercati.Il video di esempio utilizzava "colazione", "pranzo" e "cena" senza un riquadro di delimitazione geografica.A livello mondiale, che ha recuperato circa 3 tweet al secondo.Non è possibile restringere la ricerca a Londra utilizzando un riquadro di delimitazione attorno a Londra; che proverà a restituire tutti i tweet da Londra, nonché colazione, pranzo e cena da tutto il mondo.Non sono ancora chiaro quanti dati trasmetterà Twitter; a un certo punto ho pensato che Twitter avrebbe rallentato, e in un altro punto ho pensato che Twitter avrebbe interrotto lo streaming se non fossi riuscito a elaborare i dati abbastanza velocemente.Forse sono vere entrambe le cose.In un esperimento precedente, ho selezionato "Raleigh" e ho inserito un riquadro di delimitazione attorno a Raleigh, Carolina del Nord.Ho ricevuto tweet su biciclette Raleigh rubate in tutto il mondo.
Attenzione
Dovrai eseguire il tuo filtraggio post-acquisizione e potresti voler creare il tuo elenco di parole che non ti piacciono.Se presenti in pubblico un elenco di tweet non censurati, ti sentirai in imbarazzo, o peggio.Ricorda inoltre che Twitter ha regole su come presentare i dati.
Selezione geografica
Questo frammento di JSL seleziona termini di query e posizioni geografiche.Poiché il codice stava diventando complicato, ho iniziato a utilizzare gli spazi dei nomi:
include("PICK.jsl");
PICK:trackParm = "pranzo,cena,colazione"; //interrogazione predefinita
SCEGLI:scegli(); // GUI per regolare la query

Il pulsante Aggiungi rettangolo ha aggiunto due rettangoli.I valori nello spazio dei nomi PICK verranno utilizzati in seguito per creare la query di Twitter.C'è una piccola quantità di capacità "e"; mangia pranzo, mangia cena, mangia colazione può essere utilizzato per selezionare tweet contenenti sia "mangia" che un pasto.Ma soprattutto tutto è ORed (unione).
Altro include
include("JSON.jsl"); // sottoinsieme della libreria JSON di Xan per analizzare un tweet
include("BITS.jsl"); // codice per la manipolazione dei bit
include("AUTH.jsl"); // codice per oauth
include("SIGN.jsl"); // codice per la firma
include("PARM.jsl"); // codice per creare il parametro http per curl
Questi includono caricare un sacco di JSL ed eseguire alcuni piccoli controlli di integrità e autotest.BITS impiega un minuto per inizializzare alcune strutture dati per creare codice più veloce in seguito, sii paziente mentre +++ viene stampato nella finestra di registro.JSON è tratto da lavoro che Xan ha fatto prima ; lo stream Twitter viene inviato in formato JSON.AUTH e SIGN contengono JSL che utilizza EncryptedKeys per autenticarsi ("accesso") a Twitter.È complicato e utilizza un programma esterno già installato sul tuo computer per eseguire l'hash SHA1.Quando ho scritto le funzioni bit, ho pensato che avrei dovuto implementare l'hash SHA1, ma anche questo è complicato e sono felice di usarne uno che non richieda il debug.L'ultima inclusione, PARM, crea una stringa per cURL.
arricciare
Avrai bisogno di una copia di cURL.Esiste già su MAC.Gli utenti di Windows possono ottenerlo da http://curl.haxx.se/ dopo aver controllato prima con le persone dei tuoi sistemi.https://en.wikipedia.org/wiki/CURL è un punto di partenza per le tue domande cURL.ho scaricato Win64 x86_64CAB .(il tuo computer è I386, non IA64). Trascina e rilascia curl.exe sul desktop e assicurati che JMP sappia dove trovarlo (RunProgram non espanderà $DESKTOP, inserisci la risposta completa!):
cURLlocation="C:\Users\Utente\Desktop\curl.exe";
cURL è un'utilità della riga di comando a cui JMP può accedere tramite la funzione RunProgram.Il programma cURL stabilirà la connessione a Twitter e reinvierà il flusso di tweet a JMP.
EseguiProgramma(eseguibile( cURLlocation ),opzioni( cURLparms ),
readFunction(Funzione( {questo},
buftxt ||= questo << leggi(blob);
processi();
Se( questo << èLeggiEOF,
Scrivi( Destra( Char( buftxt ), 100 ) ) );))
La funzione cURLparms e process() (usata sopra) è tutto ciò che resta da spiegare.
proviene cURLparms PARM:curlParm( PICK:trackParm, PICK:locationParm); che utilizza PICK (molto sopra) per capire quali termini tracciare e quali posizioni monitorare.La funzione curlParm nello spazio dei nomi PARM utilizza le variabili consumerKey...applicationTokenSecret (molto sopra) per eseguire la firma/autorizzazione per termini e posizioni specifici.
La funzione di processo prende i dati da buftxt e li inserisce in una tabella dati.
Correre
Fatto!Metti i file allegati nella stessa directory con EncryptedKeys.JSL, apri main.jsl ed eseguilo.Si aprirà la finestra di dialogo; (basta premere OK la prima volta... per utilizzare la ricerca che fa apparire i punti sulla mappa...) imposta alcuni termini di ricerca, o una piccola posizione, o magari entrambi.
Alla fine del JSL vedrai un ciclo che riavvia RunProgram quando si ferma inaspettatamente.Ritarda di 60 secondi per aiutare a prevenire l'abuso del sito Twitter se qualcosa va storto nello script.Le connessioni Internet potrebbero rimanere attive per giorni o potrebbero interrompersi più volte in un'ora.È anche possibile che Twitter interrompa la connessione per vari motivi.Il ciclo for è inoltre limitato a riavviarsi solo un numero limitato di volte.
Gli script vengono appena testati; chiedi se non funziona, grazie!
La seconda tabella dati e la mappa dipendono dai valori predefiniti di colazione/pranzo/cena nella finestra di dialogo di apertura.C'è qualche JSL hardcoded che cerca i tweet di colazione/pranzo/cena.Potresti rielaborarlo o eliminarlo completamente.
Il pulsante STOP nella parte inferiore della mappa porterà (probabilmente) lo script a fermarsi con grazia.Ho corretto un bug che potrebbe impedire a JMP su MAC di arrestarsi correttamente per una versione futura; potrebbe essere necessario forzare l'uscita in JMP 11 o 12.
Presentazione (realizzazione di un video dalla tabella dati)
Dopo aver catturato per un po' i tweet di colazione/pranzo/cena, ci sono dati sufficienti per realizzare un video.Utilizzando idee da diversi post recenti...In mancanza di uno standard di codifica dei colori migliore, utilizzare il verde per iniziare la giornata, il rosso per interromperla e il blu per l'ora di pranzo.Sottoimposta le righe per mantenere solo quelle con i dati sulla posizione.Ho utilizzato una formula per creare colonne xLon e yLat dalle coordinate o dal centro di placeBounding_boxCoordinates:

La formula imposta il valore su mancante se le coordinate non sono disponibili; solo il 5% circa dei tweet ha coordinate.
Questa formula di colonna crea una colonna per classificare i tweet, ma è comunque diversa per ogni lingua:

Seguito da questa formula di colonna per combinare le categorie:

Per velocizzare la generazione dei fotogrammi video, caricare i dati sottoinsiemi in matrici:
dt = open("$desktop/sha1/TwitterFeed3.jmp");
xLonVec=dt:xLon<
yLatVec=dt:yLat<
kindVec = dt:kindCode<
timeVec = dt:dateUTC<
chiudi(dt,nosalva);
Crea un GraphBox per produrre i frame:
Nuova finestra("Tweet pasto", // la dimensione del marcatore del grafico viene utilizzata per le posizioni dei tweet rosso/verde/blu
g = Riquadro grafico( Dimensioni fotogramma( 1920, 900 ), <
);
C'è più JSL per impostare gli assi, aggiungere la mappa.La maggior parte del lavoro viene svolto in questo script grafico che elabora le matrici caricate dalla tabella dati:
g[framebox( 1 )] << aggiungiGraphicsScript(
trasparenza(.8);
for(idx=indicebasso,idx<=indicealto,idx++,
Marker( Stato colore( match(kindVec[idx],1,"verde",2,"blu",3,"rosso") ),{xLonVec[idx], yLatVec[idx]} );
)
);
E il codice del driver che fa ridisegnare la mappa con orari di inizio e fine diversi e cattura un'immagine:
nframes = secondi*30;// secondi a 30 fps
inizio = min(tempoVec);
fine = max(tempoVec);
durata = fine - inizio;
delta = durata/nframe;
For( iframe = 0, iframe < nframe, iframe++,
mindate = inizio + (iframe - 0) * delta - 2*3600; // indietro di 2 ore.
data massima = inizio + (iframe + 1) * delta + 3600; // avanti di 1 ora
lowIndex=floor(interpolate(mindate,timeVec,1::nrows(timeVec)));
highIndex=floor(interpolate(maxdate,timeVec,1::nrows(timeVec)));
g<
Aspetta(1);
g[framebox(1)]<
);
Alla fine avrai i fotogrammi per produrre un video.Ho usato Blender (curva di apprendimento lunga, ma potente) per realizzare questo video di cinque minuti, che contiene 377.765 tweet in 16 giorni che includono la festa del Ringraziamento negli Stati Uniti.C'erano 8.187.114 tweet in tutto, ma la maggior parte non includeva dati di latitudine e longitudine.Se lo faccio di nuovo, sottoinsiemerò i dati man mano che vengono raccolti; la tabella completa da 2,5 GB è grande.
https://www.youtube.com/watch?v=N20KsrmdgOU Massimizza!
Nessun allegato? clicca qui per vedere il post.