<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />將 Twitter 數據流式傳輸到 JMP 數據表中
如果您只想要視頻,請滾動到最後。
在 JMP 11 和 12 中,我在 Mac 和 Win 上對此 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 應用程序。

您進入帶有標籤的屏幕;第三個選項卡 Keys and Access Tokens 是您想要的。

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

複製它們...訪問令牌都在一行中,帶有連字符...
accessToken = “3…………………………-……………………………………………………………………”;
accessTokenSecret = "rc…………………………HJ";
EncryptedKeys.JSL 有五行,包括註釋。它將被另一個文件包含;您應該考慮存儲 EncryptedKeys.JSL 的計算機的安全性。其中兩個密鑰被認為是公開的,但有兩個是只有您應該知道的秘密。沒有其他人需要公鑰,因此它們都可以留在一個地方。
訪問https://apps.twitter.com/並確保該應用程序存在,然後您可以退出推特。
推特流媒體
Twitter 提供其他方式來使用他們的服務https://dev.twitter.com/允許檢索特定推文並創建新推文,但流媒體是關於使用過濾器收集實時推文。Twitter 可以應用的過濾器旨在對他們的計算機有效,並且可能無法完全按照您的意願行事(記住您付給他們多少錢)。最有趣的查詢是關鍵字和地理區域;結果將是所有搜索詞的並集(不是交集)。示例視頻使用“早餐”、“午餐”和“晚餐”,沒有地理邊界框。在全球範圍內,每秒檢索約 3 條推文。用倫敦周圍的邊界框將搜索範圍縮小到倫敦是不可能的;這將嘗試返回來自倫敦的所有推文,以及來自世界各地的早餐、午餐和晚餐。我仍然不清楚 Twitter 將傳輸多少數據。有一次我認為 Twitter 會節流,另一方面我認為如果我不能足夠快地處理數據,Twitter 就會停止數據流。也許兩者都是真的。在之前的實驗中,我選擇了“Raleigh”並在北卡羅來納州的 Raleigh 周圍放置了一個邊界框。我收到了關於世界各地被盜羅利自行車的推文。
警告
您需要進行自己的捕穫後過濾,並且您可能想要建立自己的不喜歡的單詞列表。如果您在公共場合展示未經審查的推文列表,您會感到尷尬,甚至更糟。還要記住 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 駕駛室.(您的計算機是 I386,而不是 IA64)。 將 curl.exe 拖放到桌面上,並確保 JMP 知道在哪裡可以找到它(RunProgram 不會展開 $DESKTOP,請填寫完整的答案!):
cURLlocation="C:\Users\User\Desktop\curl.exe";
cURL 是 JMP 可以通過 RunProgram 函數訪問的命令行實用程序。cURL 程序將連接到 Twitter 並將推文流反饋給 JMP。
運行程序(可執行文件(cURLlocation),選項(cURLparms),
讀函數(函數({這個},
buftxt ||= this << read( blob );
過程();
如果(這個 << isReadEOF,
寫(右(字符(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 正在尋找早餐/午餐/晚餐的推文。你可以重新加工或完全剪掉它。
地圖底部的 STOP 按鈕將(可能)使腳本優雅地停止。我修復了一個錯誤,該錯誤可能會阻止 MAC 上的 JMP 在未來版本中正常停止;您可能需要在 JMP 11 或 12 中強制退出。
演示文稿(從數據表製作視頻)
在捕獲早餐/午餐/晚餐推文一段時間後,有足夠的數據製作視頻。使用最近幾篇文章的想法……如果需要更好的顏色編碼標準,請使用綠色表示一天的開始,紅色表示停止一天,藍色表示午餐時間。對行進行子集以僅保留具有位置數據的行。我使用公式從坐標或 placeBounding_boxCoordinates 的中心創建 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++,
標記(顏色狀態(匹配(kindVec[idx],1,"green",2,"blue",3,"red")),{xLonVec[idx],yLatVec[idx]});
)
);
以及導致地圖以不同的開始和結束時間重繪並捕獲圖片的驅動程序代碼:
nframes = seconds*30;// 30fps 的秒數
開始 = min(timeVec);
結束 = 最大值(時間向量);
持續時間 = 結束 - 開始;
增量 = 持續時間 / nframes;
For(iframe = 0, iframe < nframes, iframe++,
mindate = start + (iframe - 0) * delta - 2*3600; // 後退 2 小時。
最大日期 = 開始 + (iframe + 1) * 增量 + 3600; // 前進 1 小時
lowIndex=floor(interpolate(mindate,timeVec,1::nrows(timeVec)));
highIndex=floor(interpolate(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最大化!
沒有附件? 點擊這裡看到帖子。