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

Комментарии (21)


  1. VioletGiraffe
    18.07.2017 13:27

    Напомнило, как я совсем недавно за два вечера написал бота для Telegram на C# для взаимодействия c YouTube. Слава API-библиотекам :)


    1. RomanL
      18.07.2017 13:38

      Одно из условий задания — не использовать сторонние библиотеки для телеграма и целевого магазина. А я люблю изобретать велосипеды ))


  1. VioletGiraffe
    18.07.2017 13:34
    +2

    Позанудствую. «Машина состояний» по-русски — конечный автомат.


    1. RomanL
      18.07.2017 13:37
      -4

      Позанудствую в ответ — конечный автомат это конкретная реализация «машины состояний». Тут имеется в виду сама концепция ))


      1. VioletGiraffe
        18.07.2017 13:40
        +5

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


      1. RussDragon
        18.07.2017 13:45
        +1

        Не согласен. На запрос «State machine» на вики есть лишь одна статья – Finite-state Machine, что соответствует «конечному автомату» в ру-версии вики.

        И если конечный автомат – лишь конкретная реализация, приведите, пожалуйста, пример другой реализации.


        1. RomanL
          18.07.2017 13:48
          -5

          Ладно, ладно )) Я не против, но как по мне так машина состояний в контексте понятнее чем конечный автомат.


  1. KorP
    18.07.2017 14:53
    +3

    Осталось научить кота пользоваться телеграмом.


  1. mokhin-denis
    18.07.2017 15:16
    +1

    Ну так а в международной(!) онлайн-олимпиаде(!!) по языку Perl(!!!) таки победил или нет?


    1. RomanL
      18.07.2017 15:17

      Там же есть закрытый спойлер в конце статьи с итогами ))


      1. mokhin-denis
        18.07.2017 15:18
        +3

        Пардонте )))


        1. neenik
          19.07.2017 02:12
          +2

          В perl-коммьюнити уже давно поднималось обсуждение этого конкурса и общее мнение — фейк, придуманный HR.


          1. RomanL
            19.07.2017 10:18
            +1

            Ой, да, мне же пришло приглашение на вакансию от 220Вольт — видимо это действительно единственный смысл конкурса ))


          1. ivanych
            19.07.2017 17:49

            А можно ссылку на обсуждение?


            1. RomanL
              19.07.2017 19:40

              Оказывается есть секретный чатик для невымерших perl-программистов ))


  1. Bellicus
    18.07.2017 15:44

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


  1. fly_style
    18.07.2017 22:16
    +2

    Автор, вы двое суток держали кота голодным, вместо того, пойти и купить ему корма! Нехорошо! :)


  1. g0rd1as
    20.07.2017 17:23

    А код где посмотреть, пусть и кривой?


    1. RomanL
      20.07.2017 17:24

      Там есть ссылка на github: https://github.com/roman-lugovkin/ecom-ulmart-bot


      1. g0rd1as
        21.07.2017 20:45

        Спасибо. Проглядел что-то. :(


  1. massimus
    25.07.2017 08:45
    -1

    Думаю, тег perl можно смело убирать. Да, на гитхабе перл, а здесь лишь название и фотка Ларри.