18 July 2017

Бот для Telegram за 48 часов на Perl или как купить кошачий корм не выходя из чата

PerlAbnormal programmingDevelopment for e-commerce


Давно поглядывая в сторону темы ботов для Telegram и Facebook всё не находил времени взглянуть что же это за звери. А главное — не было внятной идеи зачем может понадобиться такой бот в реальной жизни, учитывая что ни Tg ни Fb Messanger в жизни я активно не пользуюсь.

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

Тихим субботним утром совершенно случайно наткнулся на заметку что проводится международная(!) онлайн-олимпиада(!!) по языку Perl(!!!). Несмотря на сюрреализм события (о котором не было анонсов ни на одном профильном ресурсе включая Хабр) я записался и в 10.15 утра понедельника получил задание — разработать за 48 часов бот для одного из мессенджеров, реализующий взаимодействие с каким-либо интернет-магазином. Решив что это отличный шанс погрузиться в тему я взялся за задачу.

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

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

Ночь первая


Первая ночь была посвящена написанию парсера мобильной выдачи интернет-магазина и реализации всех необходимых операций с корзиной и оформлением заказа (самовывоз, без регистрации). Юлмарт представлен в разных городах и для полноты картины необходимо было реализовать и выбор текущего города и пункта самовывоза. Так как извращенные парсеры это моя специализация, то особых сложностей с этим не возникло. Единственная засада — пришлось потратить пару часов на понимание почему возникает ошибка при итоговом оформлении заказа. Оказалось, что я слишком быстро требую ответа от интернет-магазина и он не успевает провести заказ по своей внутренней учетной системе. Пятисекундная задержка проблему решила и к утру модуль реализующий API с сайтом Юлмарт был готов.

Псевдо-API умеет:

  • Получать список разделов каталога
  • Искать по каталогу
  • Получать список позиций каталога или результатов поиска
  • Получать информацию о товаре со всеми его характеристиками
  • Выбирать текущий город (от этого зависят цены, наличие и выбор пункта самовывоза)
  • Управлять корзиной
  • Оформлять заказ для самовывоза из выбранного пункта

Фильтры в каталоге я не успел реализовать из-за ограничений по времени. Но базовый функционал есть и его можно попытаться перенести на бот-платформу Telegram о которой к этому моменту я знал лишь то что она существует )

Спойлер: теперь можно купить корм коту прямо из Телеграма



Ночь вторая


Теперь пришло время познакомиться с бот-возможностями Telegram API. Так как до того времени Телеграмом я не пользовался это было ускоренное погружение в тему )) Детали расписывать не буду — статей на эту тему достаточно. Отмечу лишь те особенности, на которые я обратил внимание в контексте решения моей задачи. Как оказалось, создать более-менее удобный интерфейс для чат-бота интернет-магазина это та еще задача…

  1. На установку веб-сервера, SSL сертификата и изучения событийной модели времени было жалко, поэтому выбран медленный, но приемлемый для прототипа вариант с long pool'ом запросов к боту и однопоточной (простите) их обработкой

  2. Платформа решает за меня все вопросы, касающиеся пользовательских сессий — отлично. Изначальная идея с реализацией машины состояний для хранения промежуточной информации между запросами была через некоторое время отброшена, так как проще было передавать параметры в элементы интерфейса. Некрасиво, но быстро.

  3. Почему-то я затупил и не сразу понял что в рамках обработки одного запроса можно формировать несколько ответов. Поэтому бот молчит после получения запроса, а не предупреждает что он думает (везде, кроме обработки поиска)



  4. Телеграм не умеет сам располагать управляющие кнопки в сообщениях оптимально. Приходится самому формировать сетку кнопок, а если их много (и непонятно сколько будет) то это дополнительное затруднение. Кроме того их можно сделать ограниченное число (что правильно), но…

  5. … так как кроме этих кнопок и текстового ввода вариантов взаимодействия с ботом нет это сильно усложнило реализацию выбора товаров из списка и пагинацию.



    И когда программировал список я еще не понял что можно выдавать несколько ответов (см. пункт 3), а то может быть сделал бы по-другому — под каждой позицией списка свою кнопку «подробнее». Не факт что так было бы лучше, но вдруг.

  6. Очень не хватает возможностей формирования ответов с колонками. Это бы сильно упростило работу с длинными списками выбора. Так, например, выбор текущего города в боте выглядит как список активных кнопок:


    Или список товаров — было бы оптимально выводить его в три колонки, например: картинка, название, кнопка «Подробнее», но нет.

А так в целом простой и приятный API платформы позволил за ночь сделать чат-бота который умеет все то что было ранее реализовано в псевдо-API.

Включая управление корзиной:



Выбор пункта самовывоза:



И окончательное оформление заказа:



К утру бот был закончен и запущен на тестовом сервере!

Где можно его потрогать
Бот называется @ecom_ulmart_bot и до сих пор работает на тестовом стенде, принимая и обрабатывая запросы в режиме long pool в один(!!!) поток.

Поэтому, если вы будете его мучить — имейте терпение ))

Так как это скорее прототип чат-бота, то его есть куда развивать:

  • Сделать многопоточную обработку запросов через WebHook'и
  • Пошаманить над интерфейсом
  • Сделать возможность встраивания в другие чаты как inline-бота (если вдруг срочно нужно узнать не появились ли в продаже топовые видеокарты для майнинга)
  • В качестве развития функциональности можно добавить сравнение цен на выбранные товары с предложениями других интернет-магазинов

И если у кого-нибудь до этого дойдут руки, то можно сделать это взяв исходники с github'а и зарегистрировав своего бота (другой api-токен) под эту задачу.

А что же с международной олимпиадой?


А ничего )

Ответа на свое решение я так и не получил. Напомнив о себе через неделю я получил ответ что «результаты будут вот-вот подведены», а дальше тишина.

Думаю я единственный кто случайно увидел это объявление и отправил какое-то решение. Так что комментарий Ларри Уолла на свой кривой код я так и не получил ))

Это был забавный опыт и следующая целевая платформа — Facebook Messenger. Идея для нового чат-бота уже есть!
Tags:perltelegram botsulmartкотики
Hubs: Perl Abnormal programming Development for e-commerce
+13
12.3k 48
Comments 21
Popular right now
Профессия Product Manager
December 2, 2020108,500 ₽Нетология
Python для анализа данных
December 2, 202019,000 ₽SkillFactory
Профессия Project Manager
December 2, 202098,000 ₽Нетология
Разработка приложений на Kotlin
December 2, 202020,900 ₽Нетология
Профессия Data Scientist
December 2, 2020135,000 ₽SkillFactory