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



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

      0
      Напомнило, как я совсем недавно за два вечера написал бота для Telegram на C# для взаимодействия c YouTube. Слава API-библиотекам :)
        0
        Одно из условий задания — не использовать сторонние библиотеки для телеграма и целевого магазина. А я люблю изобретать велосипеды ))
        +2
        Позанудствую. «Машина состояний» по-русски — конечный автомат.
          –4
          Позанудствую в ответ — конечный автомат это конкретная реализация «машины состояний». Тут имеется в виду сама концепция ))
            +5
            Убеждён, что вы неправы. Ни в английском, ни в русском языке ни разу не встречал различных терминов для этой концепции в целом и для конкретного автомата. И то, и другое — конечный автомат (либо FSM). Семантической и синтаксической разницы между русским и английским названиями тоже не вижу, они полностью аналогичны.
              +1
              Не согласен. На запрос «State machine» на вики есть лишь одна статья – Finite-state Machine, что соответствует «конечному автомату» в ру-версии вики.

              И если конечный автомат – лишь конкретная реализация, приведите, пожалуйста, пример другой реализации.
                –5
                Ладно, ладно )) Я не против, но как по мне так машина состояний в контексте понятнее чем конечный автомат.
            +3
            Осталось научить кота пользоваться телеграмом.
              +1
              Ну так а в международной(!) онлайн-олимпиаде(!!) по языку Perl(!!!) таки победил или нет?
                0
                Там же есть закрытый спойлер в конце статьи с итогами ))
                  +3
                  Пардонте )))
                    +2

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

                      +1
                      Ой, да, мне же пришло приглашение на вакансию от 220Вольт — видимо это действительно единственный смысл конкурса ))
                        0
                        А можно ссылку на обсуждение?
                          0
                          Оказывается есть секретный чатик для невымерших perl-программистов ))
                  0
                  Как купить кошачий корм, не выходя из чата? Как вариант, идешь в магазин и покупаешь. Из чата для этого выходить совсем не обязательно.
                    +2

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

                      0
                      А код где посмотреть, пусть и кривой?
                        0
                        Там есть ссылка на github: https://github.com/roman-lugovkin/ecom-ulmart-bot
                          0
                          Спасибо. Проглядел что-то. :(
                      • НЛО прилетело и опубликовало эту надпись здесь

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

                        Самое читаемое