镜子里的音乐会和活动KudaGo

我将告诉您如何通过镜子在公共KudaGo API上接收和显示信息。 当然,这不是简单的而是“智能”镜像。

什么是智能镜?


最有可能的是,许多人听说过MagicMirror²模块化平台,该平台允许您在Raspberry Pi上部署应用程序,该应用程序可以将门厅或浴室的镜子变成您的个人助手。 您可以使用所谓的“双向镜”,监视器,直臂和上述微型计算机来实现此目的。

MagicMirror中的Magic仅是名称。 如果我理解正确,那么所有这些都是在Electron上开发的,这意味着与此相关的是Node.js.。 “应用程序”创建一个html页面,该页面在启动时会在浏览器窗口中打开,并且已经在其中显示了所谓的模块,这些模块既已预先安装(时钟,日历,当前天气,天气预报,新闻订阅源),又由社区开发 。 并且有足够的有趣(既有用又顽固的异常),例如,以下是一百多个模块中的几个:

有用的



花式的



背景知识


关于我如何收集镜子,我将不作详细绘画。 如果有人感兴趣,可以在这里阅读 。 如果您想放在一起,那么简单的Google搜索将返回数十个示例\指南\手册。 我想展示如何为这样的镜子制作模块。

我非常喜欢参加圣彼得堡的各种音乐会和活动。 但是有时会发生这样的事情(即使考虑到上下文广告,垃圾邮件和海报的大量存在),我在即将到来的前一两天也了解到一些事件。 因此,我一直在寻找一种优化筛选有关它们的信息流的方法。 具有类似功能的智能手机上的应用程序长时间没有徘徊(更确切地说,我忘记了它们)。 所有张贴者都需要时间并不断通过任务“选择10个过滤器,并猜测哪个是正确的”。 社交媒体订阅源通常变成了广告垃圾邮件。 然后,提出一个实现“解析器”的想法,该解析器将根据自己的标准定期选择信息并将其显示在某个地方。

开发模块


如果有人立即想要查看结果,或者将模块安装在“镜像”上,那么这里是到存储库链接 。 也有安装说明。

作为信息来源, kudago服务被证明是最合适的。 无需注册。 Sane方法。 答案中的简明数据。 覆盖范围并不奇怪,它不仅包括“城市路边”和“非橡胶”,而且还包括俄罗斯的9个主要城市。

我们开发的模块应存储在modules / modulename文件夹中 。 要创建一个简单的模块(如我的模块),我们需要在此文件夹中创建两个文件:

  • modulename / modulename.js是主模块的脚本。
  • modulename / node_helper.js是脚本将加载的“可选帮助程序”。 辅助程序和模块脚本可以使用集成的套接字系统相互通信。

在修改了MagicMirror开发人员指南以及其他人的解决方案之后,我上传了一个脚本,以使用XMLHttpRequest从kudago API中获取条目。 并遇到了跨域查询的问题。 我根本不是JavaScript专家(甚至也不是开发人员)。 我所能理解的只是发送一个请求“在浏览器中运行脚本”并获得kudago的回复,我无法成功。 这是learn.javascript解释的内容

跨域请求经过特殊的安全控制,其目的是防止恶意黑客占领互联网。

说真的 该标准的开发者提供了所有的障碍,以使“邪恶的黑客”无法使用新标准来做与他以前可以做的根本不同的事情,从而“破坏”一些运行旧标准的服务器并没有期待任何根本的新事物。

好吧,不是我真正想要的。 我不想了解JavaScript问题。 毕竟,手头是熟悉且可预测的Python。 我将仅从请求库中获取信息,并将结果写入json。 剩下的只是解决如何从js执行Python代码的问题。

事实证明,node_helper.js对我有用! 启动模块时,可以使用python-shell的功能。 只需指定Python解释器的路径,脚本的路径,参数及其值即可。 以这种形式,kudago很好地给了我一个成功的答案。

Python脚本调用代码
kudagoGetData: function () { //call python script for collecting events from KudaGo api self = this; var options = { pythonPath: this.config.pythonPath, scriptPath: './modules/MMM-KudaGo', mode: 'json', args: [ "--location", this.config.location, "--days", this.config.days, "--categories", this.config.categories, "--tags", this.config.tags, ] }; pyshell.PythonShell.run('KudaGo.py', options, function (err) { if (err) throw err; }); } 


此外,只有node_helper.js才能从json文件中读取信息(默认情况下,该文件位于kudago / events.json路径中),其中包含从kudago下载的数据。 我们在其中实现了对文件的相同读取。

用于从文件读取信息的代码
 readData: function () { //read a file with events fs.readFile("./modules/MMM-KudaGo/kudago/events.json", "utf8", (err, data) => { if (err) throw err; this.sendSocketNotification("DATA", data); }); } 


正如我已经写过的,在MagicMirror中,所有模块都通过套接字系统进行通信,因此为了使我们的Python脚本在启动时运行,请将适当的代码添加到node_helper.js

在启动时启动模块的代码
 socketNotificationReceived: function (notification, payload) { if (notification === "START") { this.config = payload; this.kudagoGetData(); setInterval(() => { this.kudagoGetData(); }, this.config.updateInterval); } } 


this.config获取的所有参数要么是主模块文件中的预定义变量,要么是在config.js中指定的那些参数-所有MagicMirror模块的常规配置文件。

创建的模块的示例配置
 { module: 'MMM-KudaGo', disabled: false, position: 'bottom_bar', config: { location: "spb", categories: "concert", tags: "  --,", days: 7 } } 


好吧,在我们的MMM-KudaGo.js模块的主文件中, 默认参数,用于处理事件数据的功能(从json文件中获取),用于绘制板的标志(很可能知道的人会从中流血,但我在储罐中,对我来说主要的是工作)。 由于我在python文件中使用了API,因此.js文件不会被代码(与大多数其他模块不同),嵌套(或在这里称为“什么”),函数,循环和其他面条所覆盖。

结果


模块本身的屏幕截图
图片

镜像截图
图片

事实证明,可以实现对一个或多个事件类别的搜索,按标签搜索,按给定的天数间隔搜索,并按指定的间隔进行更新(有关类别和标签的更详细列表,请参见readme )。 并以可读的形式将其全部显示在屏幕上,指示地点,名称,日期和价格,而不会浪费时间进行独立搜索。

当然,您需要仔细观察小程序返回到那里的次数,以了解您需要放置什么标签,以便它不显示音乐会或剧院表演,而是例如您所在城市的瑜伽课程或免费节日。 但就我个人而言,我的需求已得到完全满足!

我希望您也想出并创建一个对社区有用的模块,您可以在项目的特殊页面上与他人共享该模块。 顺便说一句,如果您有好主意或需要某些东西,请在评论中写下。 也许将某人推向创意!

Source: https://habr.com/ru/post/zh-CN473344/


All Articles