<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最大化!
没有附件? 点击这里看到帖子。