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