Давно поглядывая в сторону темы ботов для Telegram и Facebook всё не находил времени взглянуть что же это за звери. А главное — не было внятной идеи зачем может понадобиться такой бот в реальной жизни, учитывая что ни Tg ни Fb Messanger в жизни я активно не пользуюсь.
И совершенно случайно представилась возможность немного погрузиться в эту область и решить вполне себе прикладную задачу. Например, купить корм для кота не выходя из чата ))
Тихим субботним утром совершенно случайно наткнулся на заметку что проводится международная(!) онлайн-олимпиада(!!) по языку Perl(!!!). Несмотря на сюрреализм события (о котором не было анонсов ни на одном профильном ресурсе включая Хабр) я записался и в 10.15 утра понедельника получил задание — разработать за 48 часов бот для одного из мессенджеров, реализующий взаимодействие с каким-либо интернет-магазином. Решив что это отличный шанс погрузиться в тему я взялся за задачу.
Выбор интернет-магазина был прост — в Юлмарт я покупаю даже корм для кота. Да и узнать текущую цену на какую-нибудь железку не ставя приложение на телефон бывает иногда нужно.
Задание было получено в понедельник утром и рабочие дела никто не отменял, так что основная часть разработки шла вечером и ночью.
Ночь первая
Первая ночь была посвящена написанию парсера мобильной выдачи интернет-магазина и реализации всех необходимых операций с корзиной и оформлением заказа (самовывоз, без регистрации). Юлмарт представлен в разных городах и для полноты картины необходимо было реализовать и выбор текущего города и пункта самовывоза. Так как извращенные парсеры это моя специализация, то особых сложностей с этим не возникло. Единственная засада — пришлось потратить пару часов на понимание почему возникает ошибка при итоговом оформлении заказа. Оказалось, что я слишком быстро требую ответа от интернет-магазина и он не успевает провести заказ по своей внутренней учетной системе. Пятисекундная задержка проблему решила и к утру модуль реализующий API с сайтом Юлмарт был готов.
Псевдо-API умеет:
- Получать список разделов каталога
- Искать по каталогу
- Получать список позиций каталога или результатов поиска
- Получать информацию о товаре со всеми его характеристиками
- Выбирать текущий город (от этого зависят цены, наличие и выбор пункта самовывоза)
- Управлять корзиной
- Оформлять заказ для самовывоза из выбранного пункта
Фильтры в каталоге я не успел реализовать из-за ограничений по времени. Но базовый функционал есть и его можно попытаться перенести на бот-платформу Telegram о которой к этому моменту я знал лишь то что она существует ))
Спойлер: теперь можно купить корм коту прямо из Телеграма
Ночь вторая
Теперь пришло время познакомиться с бот-возможностями Telegram API. Так как до того времени Телеграмом я не пользовался это было ускоренное погружение в тему )) Детали расписывать не буду — статей на эту тему достаточно. Отмечу лишь те особенности, на которые я обратил внимание в контексте решения моей задачи. Как оказалось, создать более-менее удобный интерфейс для чат-бота интернет-магазина это та еще задача…
- На установку веб-сервера, SSL сертификата и изучения событийной модели времени было жалко, поэтому выбран медленный, но приемлемый для прототипа вариант с long pool'ом запросов к боту и однопоточной (простите) их обработкой
- Платформа решает за меня все вопросы, касающиеся пользовательских сессий — отлично. Изначальная идея с реализацией машины состояний для хранения промежуточной информации между запросами была через некоторое время отброшена, так как проще было передавать параметры в элементы интерфейса. Некрасиво, но быстро.
- Почему-то я затупил и не сразу понял что в рамках обработки одного запроса можно формировать несколько ответов. Поэтому бот молчит после получения запроса, а не предупреждает что он думает (везде, кроме обработки поиска)
- Телеграм не умеет сам располагать управляющие кнопки в сообщениях оптимально. Приходится самому формировать сетку кнопок, а если их много (и непонятно сколько будет) то это дополнительное затруднение. Кроме того их можно сделать ограниченное число (что правильно), но…
- … так как кроме этих кнопок и текстового ввода вариантов взаимодействия с ботом нет это сильно усложнило реализацию выбора товаров из списка и пагинацию.
И когда программировал список я еще не понял что можно выдавать несколько ответов (см. пункт 3), а то может быть сделал бы по-другому — под каждой позицией списка свою кнопку «подробнее». Не факт что так было бы лучше, но вдруг.
- Очень не хватает возможностей формирования ответов с колонками. Это бы сильно упростило работу с длинными списками выбора. Так, например, выбор текущего города в боте выглядит как список активных кнопок:
Или список товаров — было бы оптимально выводить его в три колонки, например: картинка, название, кнопка «Подробнее», но нет.
А так в целом простой и приятный API платформы позволил за ночь сделать чат-бота который умеет все то что было ранее реализовано в псевдо-API.
Включая управление корзиной:
Выбор пункта самовывоза:
И окончательное оформление заказа:
К утру бот был закончен и запущен на тестовом сервере!
Поэтому, если вы будете его мучить — имейте терпение ))
Так как это скорее прототип чат-бота, то его есть куда развивать:
- Сделать многопоточную обработку запросов через WebHook'и
- Пошаманить над интерфейсом
- Сделать возможность встраивания в другие чаты как inline-бота (если вдруг срочно нужно узнать не появились ли в продаже топовые видеокарты для майнинга)
- В качестве развития функциональности можно добавить сравнение цен на выбранные товары с предложениями других интернет-магазинов
И если у кого-нибудь до этого дойдут руки, то можно сделать это взяв исходники с github'а и зарегистрировав своего бота (другой api-токен) под эту задачу.
А ничего ))
Ответа на свое решение я так и не получил. Напомнив о себе через неделю я получил ответ что «результаты будут вот-вот подведены», а дальше тишина.
Думаю я единственный кто случайно увидел это объявление и отправил какое-то решение. Так что комментарий Ларри Уолла на свой кривой код я так и не получил ))
Это был забавный опыт и следующая целевая платформа — Facebook Messenger. Идея для нового чат-бота уже есть!
Автор: RomanL