<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />將 Twitter 數據流式傳輸到 JMP 數據表中
如果您只想要視頻,請滾動到末尾。
我在 Mac 和 Win 上的 JMP 11 和 12 中對此 JSL 進行了一些最小測試。該視頻利用了 JMP 未來版本中的功能,但不要因此而阻止您。在此處添加有關您的經歷的評論。JSL 位於隨附的 ZIP 文件中。
這篇文章涉及了很多話題。
- 推特賬戶
- 流數據
- 位操作
- JSON
- OAuth授權、簽名
- 捲曲
- 地圖坐標
概述:將 JSL 解壓縮到一個目錄中。創建 Twitter 應用程序,將密鑰複製到 JSL 文件。(Windows) 獲取 cURL 的副本並填寫 MAIN.jsl 中的路徑。運行 MAIN.jsl 文件。
開始
您需要一個 Twitter 帳戶,並且需要在開始之前閱讀並理解 Twitter 使用條款。(您在流中收集的數據不屬於您,並且對您的使用方式有限制。我不會給你關於什麼是好或不好的建議。)
使用您的 Twitter 帳戶,使用https://apps.twitter.com/創建一個新的應用程序。這不是像手機那樣的應用程序。它是一組允許程序訪問 Twitter 流的鍵。該程序可能是手機上的應用程序,也可能是 JSL,或者是 Python 程序,例如http://www.tweepy.org/提供。(我從 tweepy 開始,然後沿著 JSL 路徑走下去。Tweepy 或其他基於 python 的解決方案可能比這個 JSL 解決方案更好。)
單擊“新建”創建一個新應用程序,創建一個沒有人使用過的名稱,添加說明,填寫您的網站名稱並將回調 URL 留空。您必須提供網站名稱,但是,正如其建議的那樣,您可以使用佔位符。閱讀協議,然後單擊“創建 Twitter 應用程序”。

您到達帶有選項卡的屏幕;第三個選項卡“密鑰和訪問令牌”就是您想要的選項卡。

在頂部,您將找到所需的部分內容:消費者密鑰和消費者秘密。您將需要消費者密鑰和秘密。繼續啟動您的 JMP 項目;將會有多個文件,因此創建一個目錄,解壓 JSL 文件,然後編輯 EncryptedKeys.JSL 並開始填寫:
// 使用 apps.twitter.com創建一個新的應用程序。將密鑰複製到此處。
ConsumerKey = "Pnb…LAZ";
ConsumerSecret = "AF4C…………………………qNvXp";
單擊底部的“創建我的訪問令牌”按鈕以獲取最後兩個值。

複製它們...訪問令牌全部位於一行並帶有連字符...
accessToken = "3…………………………-………………………………………………am”;
accessTokenSecret = "rc………………………HJ";
EncryptedKeys.JSL 有五行,包括註釋。它將被另一個文件包含;您應該考慮存儲 EncryptedKeys.JSL 的計算機的安全性。其中兩個密鑰被認為是公開的,但其中兩個是只有您應該知道的秘密。其他人都不需要公鑰,因此他們都可以留在一處。
訪問https://apps.twitter.com/並確保該應用程序存在,然後您可以退出 Twitter。
推特流媒體
Twitter 提供了其他使用其服務的方式https://dev.twitter.com/允許檢索特定推文並創建新推文,但流式傳輸是使用過濾器收集實時推文。Twitter 可以應用的過濾器旨在對他們的計算機有效,並且可能不會完全按照您的要求行事(記住您向他們支付了多少錢)。最有趣的查詢是關鍵字和地理區域;結果將是所有搜索詞的並集(而不是交集)。示例視頻使用了“早餐”、“午餐”和“晚餐”,沒有地理邊界框。在全球範圍內,每秒檢索大約 3 條推文。不可能通過倫敦周圍的邊界框將搜索範圍縮小到倫敦;它將嘗試返回來自倫敦的所有推文,以及來自世界各地的早餐、午餐和晚餐。我仍然不清楚 Twitter 將傳輸多少數據;有一次,我認為 Twitter 會降低流量,而在另一時刻,我認為如果我不能足夠快地處理數據,Twitter 就會停止流。也許兩者都是真的。在之前的實驗中,我選擇了“羅利”,並在北卡羅來納州羅利周圍放置了一個邊界框。我收到了有關世界各地羅利自行車被盜的推文。
警告
您需要進行自己的捕穫後過濾,並且您可能想要構建自己不喜歡的單詞列表。如果你公開展示未經審查的推文列表,你會感到尷尬,甚至更糟。另請記住,Twitter 對如何呈現數據有規則。
地理選擇
JSL 的這段代碼片段選擇查詢術語和地理位置。由於代碼變得越來越複雜,我開始使用命名空間:
包括(“PICK.jsl”);
PICK:trackParm = "午餐,晚餐,早餐"; // 默認查詢
選擇:選擇(); // 用於調整查詢的 GUI

添加矩形按鈕添加了兩個矩形。PICK 命名空間中的值稍後將用於構建 twitter 查詢。存在少量的“與”能力;吃午餐、吃晚餐、吃早餐可用於選擇同時包含“吃”和一頓飯的推文。但大多數情況下一切都是 ORed(並集)。
更多內容包括
包括(“JSON.jsl”); // 用於解析推文的 Xan JSON 庫的子集
包括(“BITS.jsl”); // 位操作代碼
包括(“AUTH.jsl”); // oauth 代碼
包括(“SIGN.jsl”); // 簽名代碼
包括(“PARM.jsl”); // 為curl構建http參數的代碼
其中包括加載一堆 JSL 並進行一些小的健全性檢查和自測試。BITS 需要一分鐘時間來初始化一些數據結構,以便稍後編寫更快的代碼,在 +++ 打印到日誌窗口時請耐心等待。JSON 取自Xan 之前做過的工作; Twitter 流以 JSON 格式發送。AUTH 和 SIGN 包含使用 EncryptedKeys 對 Twitter 進行身份驗證(“登錄”)的 JSL。它很複雜,並且使用計算機上已安裝的外部程序來執行 SHA1 哈希。當我編寫位函數時,我以為我必須實現 SHA1 哈希,但它也很複雜,我很高興使用一個不需要調試的函數。最後一個包含 PARM 為 cURL 構建字符串。
捲曲
您將需要一份 cURL 的副本。MAC 上已經存在。Windows 用戶可以從http://curl.haxx.se/在您先與系統人員核實後。https://en.wikipedia.org/wiki/CURL是您 cURL 問題的起點。我下載了Win64 x86_64 CAB 。(你的電腦是I386,不是IA64)。 將curl.exe拖放到桌面上,並確保JMP知道在哪裡可以找到它(RunProgram不會展開$DESKTOP,請填寫完整的答案!):
cURLlocation="C:\Users\User\Desktop\curl.exe";
cURL 是 JMP 可以通過 RunProgram 函數訪問的命令行實用程序。cURL 程序將連接到 Twitter 並將推文流反饋回 JMP。
RunProgram(可執行文件( cURLlocation ),選項( cURLparms ),
讀取函數(函數({這個},
buftxt ||= this << read( blob );
過程();
如果(這個<< isReadEOF,
寫( 右( Char( buftxt ), 100 ) ) );))
剩下要解釋的就是 cURLparms 和 process() 函數(上面使用的)。
cURLparms 來自PARM:curlParm( PICK:trackParm, PICK:locationParm );它使用 PICK(如上所述)來確定要跟踪哪些術語以及要跟踪哪些位置。PARM 命名空間中的curlParm 函數使用consumerKey...applicationTokenSecret 變量(如上所示)對特定條款和位置進行簽名/授權。
process 函數從 buftxt 中獲取數據並將其放入數據表中。
跑步
完畢!將附加文件與 EncryptedKeys.JSL 放在同一目錄中,打開 main.jsl 並運行它。對話框將打開; (只需第一次按“確定”...使用使地圖點顯示的搜索...)設置一些搜索詞或一個小位置,或者兩者都設置。
在 JSL 的末尾,您將看到一個循環,該循環會在 RunProgram 意外停止時重新啟動它。它會延遲 60 秒,以幫助防止在腳本出現問題時濫用 Twitter 網站。Internet 連接可能會持續數天,或者每小時可能會失敗幾次。Twitter 也有可能因各種原因停止連接。for 循環還被限制只能重新啟動少量次。
這些腳本幾乎沒有經過測試;請問還不行嗎,謝謝!
第二個數據表和地圖取決於打開對話框中的默認早餐/午餐/晚餐值。有一些硬編碼的 JSL 正在尋找早餐/午餐/晚餐推文。您可以重新加工它或完全刪除它。
地圖底部的“停止”按鈕(可能)將使腳本優雅地停止。我修復了一個錯誤,該錯誤可能會阻止 JMP on MAC 在未來版本中正常停止;您可能需要在 JMP 11 或 12 中強制退出。
演示(根據數據表製作視頻)
捕獲早餐/午餐/晚餐推文一段時間後,就有足夠的數據來製作視頻。使用最近幾篇文章中的想法......如果需要更好的顏色編碼標準,請使用綠色表示一天的開始,使用紅色表示一天的結束,使用藍色表示午餐時間。對行進行子集化以僅保留包含位置數據的行。我使用公式從坐標或 placeBounding_boxCooperatives 中心創建 xLon 和 yLat 列:

如果坐標不可用,該公式將值設置為缺失;只有大約 5% 的推文有坐標。
此列公式創建了一個列來對推文進行分類,但對於每種語言仍然不同:

接下來是此列公式來組合類別:

為了加速視頻幀的生成,請將子集數據加載到矩陣中:
dt = open("$desktop/sha1/TwitterFeed3.jmp");
xLonVec=dt:xLon<
yLatVec=dt:yLat<
kindVec = dt:kindCode<
timeVec = dt:dateUTC<
關閉(dt,nosave);
製作一個 GraphBox 來生成框架:
New Window( "Meal Tweets", // 圖表的標記大小用於紅/綠/藍推文位置
g = 圖形框( 幀大小( 1920, 900 ), <<背景地圖( 圖片( "詳細的地球", 透明度( 1 ) ), 邊界( "世界" ) ) , <
);
還有更多的JSL來設置坐標軸,添加地圖。大部分工作是在這個圖形腳本中完成的,該腳本處理從數據表加載的矩陣:
g[framebox( 1 )] << addGraphicsScript(
透明度(.8);
for(idx=lowIndex,idx<=highIndex,idx++,
標記( 顏色狀態( match(kindVec[idx],1,"綠色",2,"藍色",3,"紅色") ),{xLonVec[idx], yLatVec[idx]} );
)
);
以及導致地圖以不同的開始和結束時間重繪並捕獲圖片的驅動程序代碼:
nframes = 秒*30;// 30fps 時的秒數
開始=分鐘(時間向量);
結束= max(timeVec);
持續時間=結束-開始;
增量 = 持續時間 / nframes;
對於( iframe = 0, iframe < nframes, iframe++,
mindate = 開始 + (iframe - 0) * delta - 2*3600; // 回到 2 小時。
最大日期 = 開始 + (iframe + 1) * 增量 + 3600; // 前進1小時
lowIndex=floor(插值(mindate,timeVec,1::nrows(timeVec)));
highIndex=floor(插值(maxdate,timeVec,1::nrows(timeVec)));
g<<重新顯示;
等待(1);
g[framebox(1)]<
);
最終您將獲得用於製作視頻的框架。我使用 Blender(學習曲線較長,但功能強大)製作了這個 5 分鐘的視頻,該視頻在 16 天內發布了 377,765 條推文,其中包括美國感恩節假期。共有 8,187,114 條推文,但大多數不包含緯度和經度數據。如果我再次這樣做,我將在收集數據時對數據進行子集化; 2.5GB全表很大。
https://www.youtube.com/watch?v=N20KsrmdgOU最大化!
沒有附件? 點擊這裡查看帖子。