
您是否要测试功能?使用此链接写信给机器人,他会回答您。
对于那些对它的工作原理以及16岁的学生如何编写它感兴趣的人,我很乐意在本文中详细介绍所有内容。
背景
一切都始于我在节点js上的另一个VK机器人,该机器人解密了语音消息(由于这种机器人是一角钱,所以我决定不写有关其发展的文章,尽管它也具有一些独特的功能)。启动后,父亲建议我通过电报为家庭聊天开发另一个机器人。该机器人的本质很简单-从一个人的短信中提取日期和时间,并使用电报延迟的消息,在家庭聊天中创建提醒。
但是很快我就失望了。原来,僵尸程序无法发出延迟的消息,因此我决定编写自己的系统来存储和执行提醒。
发展历程
一般信息
该机器人是用node js编写的,位于heroku上。
它能够存储精确到分钟的任何文本提醒。
他还可以在小组对话中工作。
目前,该漫游器仅以俄语识别日期和时间。
SmartScheduler是在我的github上可用的一个开源项目。
从消息中提取日期和时间
我决定从最困难的任务开始:将文本提示分为日期和提示本身。为此,我们必须考虑所有可能的标准,以便由一个人编写日期,从“ 12:00 ”到“下周日25:00到晚上8 ”。
创建了一个大型数据库(constValues.js),用于存储一个人在讲话中使用的常量表达式及其属性。然后编写函数以识别时间的每个拼写。
例如,使用一个函数以“通过X%time_type%”的形式识别日期
FindAdditiveLiterals
,并查找星期几FindDayOfWeek
。
每次指定选项都有其自己的优先级。
结果,解析器的算法如下所示:
- 原始字符串分为单词。进行搜索的单词不能超过40个。
- 单词数组通过单词到数字的转换函数传递。
- 在消息中可以找到所有时间指示,并在指令中使用的单词也被标记(例如,在“八点钟闹钟”指示中,标记了“ 8”和“ hours”)。
- 如果在文本消息中未找到时间的某些特征(例如,月份),则采用该特征的当前值。
- 对于最终判决,选择优先级最高的时间指示和具有相同源单词的相邻指示(例如,在单词“ 10:30”中同时显示小时和分钟)。
- , , , .
- , .
- ,
{ string: answer, string: text, date: date }
{ string: answer, string: text }
(answer – , text – , date – ).
接下来的问题是在哪里存储所有提醒,以及如何跟踪它们的实施。
最初,我想使用node-schedule库,但是放弃了这个想法,因为我不想在所有提醒的情况下阻塞RAM。
相反,我决定研究SQL数据库的工作方式并创建自己的数据库。
在阅读了Internet上的许多文章之后,我在heroku平台上创建了一个postgresql数据库,因为您可以将数据库嵌入其中的应用程序中,这非常方便。
为了与数据库进行交互,我编写了一个小脚本(db.js),其中实现了所有必要的功能,例如初始化数据库,获取提醒列表等。
我的数据库中有两个表:第一个用于存储提醒,第二个用于存储用户的时区(稍后会详细介绍)。
之后,我实现了将已解析的提醒从文本消息保存到数据库。计时器每分钟工作一次,用于检查提醒时间。如果已经到了提醒的时间,则将其从数据库中删除,并将带有提醒文本的消息发送给发出提醒的用户。
我还通过/ list命令添加了所有提醒的显示。

(在每个提醒旁边,有一个clickable / N命令,当您单击它时将其删除)
时区设定
在我决定写这篇文章并将其放在Habr上之前,莫斯科时区已在环境变量中进行了硬编码。这足以在我们的家庭中使用,但是为了利用任何人都可以使用的SmartScheduler机器人带来的所有生活乐趣和便利,我决定添加一个单独的时区设置。
要完成配置,您需要编写/ tz命令,机器人会警告用户是否尚未指示其时区:(

由于未指定时区,因此响应未使用本地时间,而是格林尼治时间)
。输入/ tz命令时确定时区的过程开始,出现带有三个按钮的键盘:

- 使用用户的位置。
- 手动输入。
- 取消。
第一个按钮向用户询问他的位置,根据该位置计算时区。
使用范例

第二个按钮允许您以±HH:MM的格式手动输入时区,
其中±-加或减,HH-小时,MM-分钟。
使用范例

第三个按钮取消定义过程。
用户指定时区后,机器人将正确显示并保存提醒时间。
最终改进
完成主要功能后,我添加了具有主要功能的主键盘,更正了/ start和/ help命令以及一些小问题的答案。
我还决定用莫斯科替换所有用户的默认时区。
结果
当然,SmartScheduler机器人的主要优点是可以进行日期解析,即使在最不可预测的情况下,它也可以以提醒的形式快速方便地写下必要的信息或任务。
您不再需要翻阅日历来寻找合适的日子,也不用花时间设定合适的时间,只要人工告诉机器人“什么”和“什么时候”就足够了,然后他将自己做所有事情。
结论
在使用node js开发机器人之前,我完全不熟悉javascript,因此,我在编写代码时所使用的所有知识都是从Internet上获得的,在那里您常常找不到确切的需求。因此,很可能在我的代码中的某个地方存在非常愚蠢的错误,对于这些错误我仍然不太了解。
最初,我的目标不是从项目结构的角度创建最先进,最理想的应用程序,对我来说最重要的事情是获得新知识,学习新的编程语言以增进对计算机科学的总体理解并创建MVP产品。
但是,如果需要这种开发,那么我将继续愉快地进行改进,如果您有任何想法或发现错误,那么欢迎访问该项目的github。我已经有了在哪里以及如何更改内容的想法(例如,使用常规的Visitor模式在解析模块中重写可怕的意大利面条代码),以及计划增加对英语的支持。
我希望这个机器人可以在您的日常活动中为您提供帮助,也可以帮助我和我的家人。
感谢您的关注!
UPD:受欢迎的需求增加了对语音消息的支持。
UPD 2:自文章发布以来,该机器人已进行了重大更新。变更清单。