Bot“智能计划程序”:完全理解

如果您想让一位私人服务员使您想起您告诉他的所有事情,但是没有机会雇用他,那么我开发的机器人将是他的理想替代品。







您是否要测试功能?使用此链接写信给机器人,他会回答您。



对于那些对它的工作原理以及16岁的学生如何编写它感兴趣的人,我很乐意在本文中详细介绍所有内容。



背景



一切都始于我在节点js上的另一个VK机器人,该机器人解密了语音消息(由于这种机器人是一角钱,所以我决定不写有关其发展的文章,尽管它也具有一些独特的功能)。启动后,父亲建议我通过电报为家庭聊天开发另一个机器人。该机器人的本质很简单-从一个人的短信中提取日期和时间,并使用电报延迟的消息,在家庭聊天中创建提醒。



但是很快我就失望了。原来,僵尸程序无法发出延迟的消息,因此我决定编写自己的系统来存储和执行提醒。



发展历程



一般信息



该机器人是用node js编写的,位于heroku上



它能够存储精确到分钟的任何文本提醒。



他还可以在小组对话中工作。



目前,该漫游器仅以俄语识别日期和时间。



SmartScheduler是在我的github上可用的一个开源项目



从消息中提取日期和时间



我决定从最困难的任务开始:将文本提示分为日期和提示本身。为此,我们必须考虑所有可能的标准,以便由一个人编写日期,从“ 12:00 ”到“下周日25:00到晚上8 ”。



创建了一个大型数据库(constValues.js),用于存储一个人在讲话中使用的常量表达式及其属性。然后编写函数以识别时间的每个拼写。



例如,使用一个函数以“通过Xtime_type%”的形式识别日期FindAdditiveLiterals,并查找星期几FindDayOfWeek



每次指定选项都有其自己的优先级。



结果,解析器的算法如下所示:



  1. 原始字符串分为单词。进行搜索的单词不能超过40个。
  2. 单词数组通过单词到数字的转换函数传递。
  3. 在消息中可以找到所有时间指示,并在指令中使用的单词也被标记(例如,在“八点钟闹钟”指示中,标记了“ 8”和“ hours”)。

  4. 如果在文本消息中未找到时间的某些特征(例如,月份),则采用该特征的当前值。
  5. 对于最终判决,选择优先级最高的时间指示和具有相同源单词的相邻指示(例如,在单词“ 10:30”中同时显示小时和分钟)。
  6. , , , .
  7. , .
  8. ,

    { 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命令时确定时区的过程开始,出现带有三个按钮的键盘:







  1. 使用用户的位置。
  2. 手动输入。
  3. 取消。



第一个按钮向用户询问他的位置,根据该位置计算时区。



使用范例




第二个按钮允许您以±HH:MM的格式手动输入时区

其中±-加或减,HH-小时,MM-分钟。



使用范例




第三个按钮取消定义过程。



用户指定时区后,机器人将正确显示并保存提醒时间。



最终改进



完成主要功能后,我添加了具有主要功能的主键盘,更正了/ start/ help命令以及一些小问题的答案



我还决定用莫斯科替换所有用户的默认时区



结果



当然,SmartScheduler机器人的主要优点是可以进行日期解析,即使在最不可预测的情况下,它也可以以提醒的形式快速方便地写下必要的信息或任务。



您不再需要翻阅日历来寻找合适的日子,也不用花时间设定合适的时间,只要人工告诉机器人“什么”和“什么时候”就足够了,然后他将自己做所有事情。



结论



在使用node js开发机器人之前,我完全不熟悉javascript,因此,我在编写代码时所使用的所有知识都是从Internet上获得的,在那里您常常找不到确切的需求。因此,很可能在我的代码中的某个地方存在非常愚蠢的错误,对于这些错误我仍然不太了解。



最初,我的目标不是从项目结构的角度创建最先进,最理想的应用程序,对我来说最重要的事情是获得新知识,学习新的编程语言以增进对计算机科学的总体理解并创建MVP产品。



但是,如果需要这种开发,那么我将继续愉快地进行改进,如果您有任何想法或发现错误,那么欢迎访问该项目的github。我已经有了在哪里以及如何更改内容的想法(例如,使用常规的Visitor模式在解析模块中重写可怕的意大利面条代码),以及计划增加对英语的支持。



我希望这个机器人可以在您的日常活动中为您提供帮助,也可以帮助我和我的家人。



感谢您的关注!



UPD:受欢迎的需求增加了对语音消息的支持。

UPD 2:自文章发布以来,机器人已进行了重大更新。变更清单



All Articles