Встречайте @ItadakimasuBot. Он по-настоящему приятный парень, созданный для того, чтобы помогать вам соблюдать диету. Он отслеживает все, что вы едите, и дает вам статистику об этом.

Но он особенный - он распознает еду по вашим фотографиям. Не нужно записывать всю информацию о питании рукой - он все сделает сам.

Примечание 1. Этот проект был создан в основном с целью обучения, поэтому он все еще требует много работы

Примечание 2: в первой части статьи я собираюсь объяснить, что заставляет бота работать, поэтому, если вас не интересуют технические детали - пропустите его и начните читать часть 2, где я объясню свой взгляд на текущая ситуация с ботами.

Часть 1. Как работает @ItadakimasuBot

@ItadakimasuBot - бот для Telegram (на данный момент), написанный на чистом JavaScript. Он использует Node.js как для логики ботов, так и для создания страницы статистики.

Для распознавания еды я использовал Clarifai API - хотя он далек от совершенства (он не распознает фирменную еду, например, и snickers, и bounty будут просто помечены как «шоколадный батончик»), он пока работает достаточно хорошо, поэтому я решил не создавать свою собственную систему.

Чтобы получить информацию о питании, я нашел два возможных варианта: FatSecret и Nutrionix. Оба они поддерживают полную информацию USDA, но FatSecret работает с пользовательскими частями.

Я решил остановиться на Nutrionix, поскольку, как мне кажется, информация в нем представлена ​​в более удобной для пользователя форме.

Поскольку у ботов нет встроенного сеанса, я решил использовать Redis для промежуточной информации, такой как текущее состояние бота.

Чтобы хранить долгосрочную информацию, такую ​​как журналы еды, URL-адреса статистики и информацию о пользователях, я использовал Postgres.

Помимо бота, у меня также есть сервер для обработки статистики, созданной пользователем. Он построен на Express.js. Это действительно очень просто и обрабатывает только два разных запроса: один возвращает страницу * .html, а другой возвращает данные.

Я не использовал какие-либо причудливые фреймворки, такие как React или Angular для внешнего интерфейса, потому что, честно говоря, использовать большие фреймворки для одной страницы с тремя графиками было бы нелепо. Поэтому я просто использовал jQuery (я не хотел его использовать, но поскольку выбранный мной DatePicker использует его, я выбрал его), Chart.js для графиков. и Webpack для минимизации.

Бот реагирует на следующие команды:

/ help - просто отображает сообщение со списком команд.

/ norm - отображает дневные нормы и позволяет их изменять.

/ log food_name - регистрирует еду по имени.

/ start - показывает начальное сообщение, устанавливает дневные нормы для пользователя и создает объекты User.

/ stats - генерирует и отправляет URL-адрес пользователя для просмотра статистики.

[фото] - узнавайте еду и регистрируйте ее

Чтобы общаться с пользователем, я решил использовать InlineKeyboard, потому что ReplyKeyboard (модифицированная клавиатура ОС) не позволяет устанавливать пользовательские значения ключей, что потребует дополнительного использования сеанс или дополнительное использование API.

Часть 2. Почему боты бесполезны. Теперь.

С ботами весело играть. Вам не нужно устанавливать отдельные приложения, они работают и выглядят одинаково на любой платформе.

Ботов разрабатывать легко и весело. Вам вообще не нужно беспокоиться о графическом интерфейсе или платформах.

Но есть несколько серьезных недостатков.

Первая проблема заключается в том, что каждое простое действие, такое как ввод значений питательной ценности, становится действительно неуклюжим и требует дополнительных проверок - хотите ли вы попросить пользователя проверять свою информацию на каждом шагу или только в конце? Но что, если пользователь случайно вводит информацию в одно из полей, должен ли он вводить все заново?

Эту проблему можно решить, разрешив настраивать методы ввода, отключив обычную клавиатуру и создав собственные методы ввода.

На данный момент существует два разных метода ввода: InlineKeyboard и ReplyKeyboard. У обоих есть свои плюсы, но есть и своя проблема.

InlineKeyboard не скрывает обычное поле ввода, что требует дополнительных проверок, если пользователь вводит что-то, чего нет в списке. Это немного решается тем фактом, что ответ InlineKeyboard отправляет InlineQuery вместо обычного события Message, но, поскольку старые InlineKeyboard не отключаются, это не решает проблему полностью.

ReplyKeyboard используется вместо обычной клавиатуры и скрывает оригинал от пользователя. Тем не менее, оригинальная QWERTY все еще доступна. Другая проблема заключается в том, что в настоящее время невозможно отправить с ним пользовательскую информацию - данные, отправленные по ключу, будут точно такими же, как и текст на нем, что потребует дополнительного использования сеанса или API.

Вторая проблема - отсутствие какого-либо визуального контроля. В настоящее время внутри бота невозможно отображать графики и таблицы, есть только два варианта:

  1. Создавайте графики в виде изображений на сервере. Действительно плохой выбор, потому что большинство пользователей ботов используют мобильные телефоны с маленькими экранами. Кроме того, он устраняет большую часть информативности графика - невозможно увидеть точные значения.
  2. Отправьте URL-адрес веб-страницы, на которой есть все. Это работает, но опять же, зачем нам боты?

Боты 2017 года не сильно отличаются от ботов, которые были у нас в IRC или Jabber 20 лет назад. У них действительно блестящее будущее, но на данный момент очень сложно сделать их удобными для чего-то более сложного, чем управление освещением в вашем доме.

Часть 3. Будущее

На данный момент @ItadakimasuBot не предназначен для использования в повседневной жизни. Я сделал это за несколько недель и, будучи студентом (, пожалуйста, наймите меня), я больше не могу себе позволить работать над этим.

Но если бы я хотел, я бы:

  1. Перенесите его в Facebook Messenger.
  2. Сделать свою собственную систему распознавания еды и базу данных по питанию
  3. Добавить поддержку разных языков
  4. Добавить поддержку устройств Великобритании / США (возможно, я сделаю это в ближайшем будущем)

Я сделал его с открытым исходным кодом, поэтому, если кто-то захочет проверить его код (как начинающий программист, я хотел бы, чтобы кто-то более опытный проверил мой код!) Или что-то с ним сделать - милости просим.

GitHub: https://github.com/nausik/ItadakimasuBot

Бот: https://t.me/Itadakimasubot

Спасибо за ваше время!

Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсудить рекламные и спонсорские возможности.

Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!