[API, JavaScript, Node.JS, Социальные сети и сообщества] Бот «Умный планировщик»: понимает с полуслова
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Если вы когда-нибудь желали иметь личного слугу, который бы напоминал вам обо всем, о чем вы ему скажите, но не имели возможности нанять такого, то разработанный мною бот станет ему достойной заменой.
Хотите проверить функционал? Напишите в лс боту по этой ссылке и он ответит вам.
А тем, кому интересно как он работает и как 16-летний школьник смог написать его, я с удовольствием расскажу всё в подробностях в этой статье.
Предыстория
Началось все с другого моего бота для вк на node js, который расшифровывал голосовые сообщения (и так как таких ботов пруд пруди, я решил не писать статью о его разработке, хотя и он имеет несколько отличительных особенностей). После того, как я запустил его, мой отец предложил мне разработать другого бота для нашего семейного чата в телеграмме. Суть этого бота была простой – извлекать дату и время из текстового сообщения человека, и, используя телеграмовские отложенные сообщения, создавать напоминания прямо в семейном чате.
Но вскоре меня ждало разочарование. Оказалось, что боты не могут делать отложенных сообщений, поэтому я решил написать свою систему хранения и выполнения напоминаний.
Разработка
Общие сведения
Этот бот написан на node js и живет на heroku.
Он способен хранить любые текстовые напоминания с точностью до минуты.
Также он может работать в групповых беседах.
На данный момент бот распознает дату и время только на русском языке.
SmartScheduler — open source проект, доступный на моем гитхабе.
Извлечение даты и времени из сообщения
Начать я решил с самой сложной задачи: разбиения текстового напоминания на дату и на само напоминание. Для этого пришлось учесть все возможные стандарты написания даты человеком, от «в 12:00« до «в следующее воскресенье в без двадцати пяти восемь вечера«.
Была создана большая база данных (constValues.js), хранящая в себе константные выражения и их свойства, которые человек использует в своей речи. Затем были написаны функции для распознавания каждого варианта написания времени.
К примеру для распознавания даты в виде «через X %тип_времени%» используется функция FindAdditiveLiterals, а для поиска дня недели FindDayOfWeek.
Для каждого варианта обозначения времени выставлялся свой приоритет.
В итоге алгоритм работы парсера выглядит следующим образом:
- Исходная строка делится на слова. Слов, в которых производится поиск времени, не может быть больше 40.
- Массив слов пропускается через функцию конвертации слов в числа.
- Находятся все указания времени в сообщении, а также помечаются использованные в указаниях слова (например в указании «будильник 8 часов» отмечаются слова «8» и «часов»).
- Если какая-то характеристика времени не была найдена (например месяц) в текстовом сообщении, то берется текущее значение этой характеристики.
- Для окончательного вердикта выбираются указания времени с наибольшим приоритетом и смежные указания, имеющие одинаковое исходное слово (например в слове «10:30» одновременно указан и час, и минута).
- После выбора окончательных характеристик времени формируется штамп времени из выбранных минуты, часа, дня, месяца и года.
- Из массива слов удаляются все помеченные слова, а из оставшихся формируется текст напоминания.
- Если сформированный штамп времени больше текущего времени, то мы считаем что такое напоминание пригодно и функция возвращает объект типа
{ string: answer, string: text, date: date }
В противном случае функция возвращает объект
{ string: answer, string: text }
(answer – ответ для пользователя, text – текст напоминания, date – дата напоминания).
База данных напоминаний
Следующими вопросами были где хранить все напоминания и как следить за их выполнением.
Изначально я хотел воспользоваться библиотекой node-schedule, но отказался от этой идеи, так как я не хотел засорять оперативную память всеми напоминаниями.
Вместо этого я решил изучить принцип работы SQL баз данных и создать свою.
После прочтения множество статей в интернете я создал postgresql базу данных на платформе heroku, так как в ней можно встраивать бдшки в свои приложения, что очень удобно.
Чтобы взаимодействовать с бд я написал небольшой скрипт (db.js), в котором реализовал все необходимые функции, такие как инициализация бд, получение списка напоминаний и т.д.
В моей базе данных присутствует две таблицы: первая для хранения напоминаний, вторая для хранения часовых зон пользователей (о ней чуть позже).
После этого я реализовал сохранение распарсенного напоминания из текстового сообщения в базу данных. Проверкой времени напоминаний занимается таймер, срабатывающий раз в минуту. Если же пришло время для какого-то напоминания, то оно удаляется из базы данных, а пользователю, сделавшему его, отправляется сообщение с текстом из напоминания.
Также я добавил отображение всех напоминаний через команду /list.
(рядом с каждым напоминанием есть кликабельная команда /N, которая удаляет его при клике на неё)
Настройка часового пояса
До того, как я решил написать эту статью и выложить её на Хабр, в переменных среды был захардкожен часовой пояс Москвы. Для пользования внутри нашей семьи этого было достаточно, но для того, чтобы воспользоваться всеми прелестями и удобствами жизни с ботом SmartScheduler мог каждый, я решил добавить индивидуальную настройку часового пояса.
Для выполнения настройки требуется написать команду /tz, о чем предупредит бот пользователя, если он еще не указал свой часовой пояс:
(из-за того что часовой пояс не указан, в ответе используется не локальное время, а гринвичское)
При вводе команды /tz запускается процесс определения часового пояса и появляется клавиатура с тремя кнопками:
- Использование локации пользователя.
- Ручной ввод.
- Отмена.
Первая кнопка запрашивает у пользователя его местоположение, на основе которого вычисляется часовой пояс.
Пример использования
SPL
Вторая кнопка позволяет вручную ввести свою часовую зону в формате ±HH:MM,
где ± – плюс или минус, HH – часы, MM – минуты.
Пример использования
SPL
Третья кнопка отменяет процесс определения.
После того как пользователь указал свой часовой пояс, бот будет верно отображать и сохранять время напоминаний.
Финальные доработки
Закончив с основным функционалом, я добавил главную клавиатуры с основными функциями, откорректировал ответы для команд /start и /help, ну и по мелочам.
Также я решил заменить часовой пояс по умолчанию для всех пользователей на Московский.
Результат
Главным преимуществом бота SmartScheduler является конечно же парсинг даты, который позволяет даже в самых непредсказуемых ситуациях быстро и удобно записать нужную информацию или задачу в форме напоминания.
Больше не нужно листать календарь в поиске нужного дня и крутить часы для выставления нужного времени, достаточно по-человечески сказать боту «что» и «когда», а дальше он сам все сделает.
Заключение
До разработки ботов на node js я был совершенно не знаком с javascript’ом, посему все знания, которые я использовал в написании кода, брались из интернета, где зачастую можно найти не совсем то, что тебе на самом деле нужно. Из-за этого, скорее всего, где-то в моем коде встречаются очень глупые ошибки, для определения которых я еще недостаточно много знаю.
Изначально моей целью не было создание максимально продвинутого и идеального с точки зрения структуры проекта, для меня было важнее всего получить новые знания, изучить новый язык программирования для улучшения понимания информатики в целом, а также создать MVP продукт.
Но если данная разработка будет пользоваться спросом, то я с удовольствием продолжу улучшать её, а если у вас есть какие-то идеи или вы обнаружили баг, то добро пожаловать на гитхаб проекта. У меня уже есть идеи где и как что изменить (например переписать ужасный спагетти-код в модуле парсинга с использованием нормального Visitor-паттерна), а также в планах добавление поддержки английского языка.
Надеюсь, что этот бот поможет вам также, как помогает мне и моей семье в повседневных делах.
Спасибо за внимание!
===========
Источник:
habr.com
===========
Похожие новости:
- [Open source, Разработка под Linux] CVE и квадратная вероятность
- [Java, Разработка игр] Игра «Быки и коровы». Часть 1
- [Разработка веб-сайтов, Python, Программирование, Функциональное программирование] Какая асинхронность должна была бы быть в Python
- [Agile, Управление продуктом, Управление проектами, Управление разработкой] Интеграция Youtrack со встроенным (embedded) Hub с Teamcity, Gitlab
- [IT-компании, Управление продуктом, Управление разработкой] Продуктовая трансформация в Delivery Club Tech
- [IT-компании] Снятся ли логистике электропочтальоны
- [Видеокарты, Математика, Научно-популярное, Обработка изображений, Процессоры] Что такое тензорные ядра: вычисления со смешанной точностью (перевод)
- [API, Java, Node.JS] Работаем с NPM реестром из Java (перевод)
- [Социальные сети и сообщества, Читальный зал] Сегментированная свобода слова
- [API, Python, Контекстная реклама, Яндекс API] Обзор python-пакета yadirstat — самый простой способ получить статистику из API Яндекс Директ
Теги для поиска: #_api, #_javascript, #_node.js, #_sotsialnye_seti_i_soobschestva (Социальные сети и сообщества), #_bot (бот), #_planirovschik (планировщик), #_telegrambot (телеграм-бот), #_udobno (удобно), #_api, #_javascript, #_node.js, #_sotsialnye_seti_i_soobschestva (
Социальные сети и сообщества
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:54
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Если вы когда-нибудь желали иметь личного слугу, который бы напоминал вам обо всем, о чем вы ему скажите, но не имели возможности нанять такого, то разработанный мною бот станет ему достойной заменой. Хотите проверить функционал? Напишите в лс боту по этой ссылке и он ответит вам. А тем, кому интересно как он работает и как 16-летний школьник смог написать его, я с удовольствием расскажу всё в подробностях в этой статье. Предыстория Началось все с другого моего бота для вк на node js, который расшифровывал голосовые сообщения (и так как таких ботов пруд пруди, я решил не писать статью о его разработке, хотя и он имеет несколько отличительных особенностей). После того, как я запустил его, мой отец предложил мне разработать другого бота для нашего семейного чата в телеграмме. Суть этого бота была простой – извлекать дату и время из текстового сообщения человека, и, используя телеграмовские отложенные сообщения, создавать напоминания прямо в семейном чате. Но вскоре меня ждало разочарование. Оказалось, что боты не могут делать отложенных сообщений, поэтому я решил написать свою систему хранения и выполнения напоминаний. Разработка Общие сведения Этот бот написан на node js и живет на heroku. Он способен хранить любые текстовые напоминания с точностью до минуты. Также он может работать в групповых беседах. На данный момент бот распознает дату и время только на русском языке. SmartScheduler — open source проект, доступный на моем гитхабе. Извлечение даты и времени из сообщения Начать я решил с самой сложной задачи: разбиения текстового напоминания на дату и на само напоминание. Для этого пришлось учесть все возможные стандарты написания даты человеком, от «в 12:00« до «в следующее воскресенье в без двадцати пяти восемь вечера«. Была создана большая база данных (constValues.js), хранящая в себе константные выражения и их свойства, которые человек использует в своей речи. Затем были написаны функции для распознавания каждого варианта написания времени. К примеру для распознавания даты в виде «через X %тип_времени%» используется функция FindAdditiveLiterals, а для поиска дня недели FindDayOfWeek. Для каждого варианта обозначения времени выставлялся свой приоритет. В итоге алгоритм работы парсера выглядит следующим образом:
База данных напоминаний Следующими вопросами были где хранить все напоминания и как следить за их выполнением. Изначально я хотел воспользоваться библиотекой node-schedule, но отказался от этой идеи, так как я не хотел засорять оперативную память всеми напоминаниями. Вместо этого я решил изучить принцип работы SQL баз данных и создать свою. После прочтения множество статей в интернете я создал postgresql базу данных на платформе heroku, так как в ней можно встраивать бдшки в свои приложения, что очень удобно. Чтобы взаимодействовать с бд я написал небольшой скрипт (db.js), в котором реализовал все необходимые функции, такие как инициализация бд, получение списка напоминаний и т.д. В моей базе данных присутствует две таблицы: первая для хранения напоминаний, вторая для хранения часовых зон пользователей (о ней чуть позже). После этого я реализовал сохранение распарсенного напоминания из текстового сообщения в базу данных. Проверкой времени напоминаний занимается таймер, срабатывающий раз в минуту. Если же пришло время для какого-то напоминания, то оно удаляется из базы данных, а пользователю, сделавшему его, отправляется сообщение с текстом из напоминания. Также я добавил отображение всех напоминаний через команду /list. (рядом с каждым напоминанием есть кликабельная команда /N, которая удаляет его при клике на неё) Настройка часового пояса До того, как я решил написать эту статью и выложить её на Хабр, в переменных среды был захардкожен часовой пояс Москвы. Для пользования внутри нашей семьи этого было достаточно, но для того, чтобы воспользоваться всеми прелестями и удобствами жизни с ботом SmartScheduler мог каждый, я решил добавить индивидуальную настройку часового пояса. Для выполнения настройки требуется написать команду /tz, о чем предупредит бот пользователя, если он еще не указал свой часовой пояс: (из-за того что часовой пояс не указан, в ответе используется не локальное время, а гринвичское) При вводе команды /tz запускается процесс определения часового пояса и появляется клавиатура с тремя кнопками:
Первая кнопка запрашивает у пользователя его местоположение, на основе которого вычисляется часовой пояс. Пример использованияSPLВторая кнопка позволяет вручную ввести свою часовую зону в формате ±HH:MM, где ± – плюс или минус, HH – часы, MM – минуты. Пример использованияSPLТретья кнопка отменяет процесс определения. После того как пользователь указал свой часовой пояс, бот будет верно отображать и сохранять время напоминаний. Финальные доработки Закончив с основным функционалом, я добавил главную клавиатуры с основными функциями, откорректировал ответы для команд /start и /help, ну и по мелочам. Также я решил заменить часовой пояс по умолчанию для всех пользователей на Московский. Результат Главным преимуществом бота SmartScheduler является конечно же парсинг даты, который позволяет даже в самых непредсказуемых ситуациях быстро и удобно записать нужную информацию или задачу в форме напоминания. Больше не нужно листать календарь в поиске нужного дня и крутить часы для выставления нужного времени, достаточно по-человечески сказать боту «что» и «когда», а дальше он сам все сделает. Заключение До разработки ботов на node js я был совершенно не знаком с javascript’ом, посему все знания, которые я использовал в написании кода, брались из интернета, где зачастую можно найти не совсем то, что тебе на самом деле нужно. Из-за этого, скорее всего, где-то в моем коде встречаются очень глупые ошибки, для определения которых я еще недостаточно много знаю. Изначально моей целью не было создание максимально продвинутого и идеального с точки зрения структуры проекта, для меня было важнее всего получить новые знания, изучить новый язык программирования для улучшения понимания информатики в целом, а также создать MVP продукт. Но если данная разработка будет пользоваться спросом, то я с удовольствием продолжу улучшать её, а если у вас есть какие-то идеи или вы обнаружили баг, то добро пожаловать на гитхаб проекта. У меня уже есть идеи где и как что изменить (например переписать ужасный спагетти-код в модуле парсинга с использованием нормального Visitor-паттерна), а также в планах добавление поддержки английского языка. Надеюсь, что этот бот поможет вам также, как помогает мне и моей семье в повседневных делах. Спасибо за внимание! =========== Источник: habr.com =========== Похожие новости:
Социальные сети и сообщества ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:54
Часовой пояс: UTC + 5