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

МЕНЮ


Новости ИИ
Поиск

ТЕМЫ


Внедрение ИИНовости ИИРобототехника, БПЛАТрансгуманизмЛингвистика, обработка текстаБиология, теория эволюцииВиртулаьная и дополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информации

АРХИВ


Сентябрь 2017
Август 2017
Июль 2017
Июнь 2017
Май 2017
Апрель 2017
Март 2017
Февраль 2017
Январь 2017
Декабрь 2016
Ноябрь 2016
Октябрь 2016
Сентябрь 2016
Август 2016
Июль 2016
Июнь 2016
Май 2016
Апрель 2016
Март 2016
Февраль 2016
Январь 2016
0000

RSS


RSS новости
Ураган харви в США

Новостная лента форума ailab.ru

2017-07-18 14:39

Чат-бот

Давно поглядывая в сторону темы ботов для 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. Идея для нового чат-бота уже есть!

Источник: habrahabr.ru