Чат-боты – это некий помощник, который общается с пользователями посредством сообщений и обладает множеством специфичных функций. Чат - бота можно использовать как для рассылки информации, так и для ее сбора. На сегодняшний день мессенджеры пользуются большим спросом, это связано c изменением в области мобильного интернета: высокие скорости, низкая цена и широкое распространение смартфонов. Прогрессивность мессенджеров можно сравнить с явлением десятилетней давности – взрывом социальных медиа. Уже сейчас приложениями для обмена сообщениями пользуются 2 миллиарда человек, и если верить прогнозам, к 2021 году число пользователей увеличится до 2,48 миллиардов.Чат-боты – это некий помощник, который общается с пользователями посредством сообщений и обладает множеством специфичных функций. Чат - бота можно использовать как для рассылки информации, так и для ее сбора.
На сегодняшний день мессенджеры пользуются большим спросом, это связано c изменением в области мобильного интернета: высокие скорости, низкая цена и широкое распространение смартфонов. Прогрессивность мессенджеров можно сравнить с явлением десятилетней давности – взрывом социальных медиа. Уже сейчас приложениями для обмена сообщениями пользуются 2 миллиарда человек, и если верить прогнозам, к 2021 году число пользователей увеличится до 2,48 миллиардов.
TradingStoreBot — это бот, цель которого заключается в принятии заказа торговым представителем от клиентов фирмы, с последующим формированием заказа, где будет рассчитана стоимость заказа с учетом логистики товара относительно дислокации клиента от склада. В последствии сформированный заказ будет направлен кладовщику для организации дальнейшей загрузки товара и доставки клиенту. В боте реализована возможность авторизации, с целью распределения обязанностей для бота и иные особенности о котором будет сказано ниже.
В документации Telegram Bot API выделяется два диаметрально противоположных способа получения обновлений: c помощью периодических запросов или установка вебхуков. Входящие обновления хранятся до тех пор, пока сервер не обработает его, но не дольше 24 часов. Независимо от способа получения обновлений, в ответ получаем объект Update, сериализованный в JSON.
Первый и наиболее простой вариант заключается в периодическом опросе серверов Telegram на предмет наличия новой информации. Всѐ это осуществляется через т.н. Long Polling, т.е. открывается соединение на непродолжительное время и все обновления тут же отправляются боту. Просто, но не очень надежно. Во-первых, серверы Telegram периодически начинают возвращать ошибку 504 (Gateway Timeout), из-за чего некоторые боты впадают в ступор. Во-вторых, если одновременно запущено несколько ботов, вероятность столкнуться с ошибками возрастает.
Webhooks работают несколько иначе. Под установкой вебхука подразумевается, что теперь если в чат приходит сообщение, то Telegram сам говорит об этом. Отпадает необходимость периодически опрашивать серверы, тем самым, исчезает причина падений ботов. Однако за это приходится платить необходимостью установки полноценного веб-сервера на ту машину, на которой планируется запускать ботов. Так же для работы надо иметь собственный SSL-сертификат (Secure Sockets Layer), т.к. webhooks в Telegram работают только по HTTPS
В @TradingStoreBot реализованно два вышеперечисленных подхода по запуску бота.
Авторизация пользователя в боте реализована следующим образом: при первичном добавлении бота, пользователь должен отправить ему команду /start (это стандартно и предусмотрено Telegram). Следующим шагом, пользователь обязательно должен ввести выданный ему пароль администратором - это и есть авторизация на сервере. В данный момент в БД происходит сохранение chat_id и usre_name.
Если у пользователя нет пароля, ему будет предложено связаться с директор/администратор по номеру телефона или отправить администратору бота сообщение с просьбой связаться с пользователем.
В приложении концептуально предусмотрено три вида пользователей с разным функционалом: Торговый представитель (Trading), Кладовщик (Storekeeper) и Администратор (Administrator). На данный момент реализовано позиция Торгового представителя и Кладовщика, Администратор является опциональной составляющей.
Торговый представитель наделен функцией по формированию заказа, на основании потребности клиента, а именно:
- выбор категории товара;
- выбор товара в категории;
- выбор количества товара по позициям;
- сбор данных о локации клиента/адрес доставки;
- формирование заказа с учетом стоимости логистики товара от склада поставщика до дислокации клиента;
- редактирование заказа до подтверждения от ТП;
- фиксация даты доставки товара клиенту и его адрес;
- сформированный заказ направляется в БД (таблицу заказа) → на сервер TelBot → кладовщику
Кладовщик принимает сформированный заказ, на основании которого осуществляет загрузку ТС для развозки товара.
- получает сообщение с данными о сформированном заказе:
- номенклатура товара;
- количество товара (единицы/штуки/полеты);
- адрес доставки товара;
- дата и время доставки товара.
- особые отметки.
- подтверждает загрузку товара указанного в заказе.
После подтверждения сформированного заказа, на сервере форматируется счет в PDF формате → отправляет на почту клиенту. (сли почты нет, сохраняет в базе).
Администратор имеет доступ к данным по сформированному заказу, подтверждению факта формирования загрузки и анализа статистики по каждому клиенту (может сформировать выборку за необходимый период).
- данные по сформированным заказам;
- данные по загрузки ТС для развозки;
- аналитические данные по клиентам;
- аналитические данные по сотрудникам ТП;
Можно формировать аналитику не только по клиенту, но и по каждому из сотрудников ТП/кладовщику и т. п.
Ключевое значение в приложении играет формирование заказа, поскольку в нем сосредоточены основные данные по заказанному товару и клиенту, а именно:
- номенклатура товара;
- количество товара (единицы/штуки/полеты);
- адрес доставки товара;
- дата и время доставки товара;
- стоимость;
- особые отметки.
В приложении реализован расчет стоимости заказа с учетом расстояния между адресом доставки и расположением склада. За основу был взят модуль geopy.
- в настройках проекта указано условное местоположение склада, отправительная точка для расчета расстояния между объектами;
- в настройках проекта указан условный коэффициент стоимости, из расчета за каждый 1 км - 10 рублей.
На основании указанных параметров и будет производиться окончательная стоимость стоимость заказа.
После того, как заказ будет сформирован и подтвержден кладовщиком, в приложении формируется накладная в формате PDF и направляется на e-mail клиенту, при помощи модулей email и smtplib.
-
python3 — высокоуровневый язык программирования, ориентированный на повышение производительности разработчика и читаемости кода.
-
pyTelegramBotAPI — простая, но расширяемая реализация Python для Telegram Bot AP.
-
SQLite3 – это автономный, работающий без сервера транзакционный механизм базы данных SQL.
-
SQLAlchemy — это программное обеспечение с открытым исходным кодом для работы с базами данных при помощи языка SQL. Оно реализует технологию программирования ORM (Object-Relational Mapping), которая связывает базы данных с концепциями объектно-ориентированных языков программирования. SQLAlchemy позволяет описывать структуры баз данных и способы взаимодействия с ними прямо на языке Python.
-
geopy — позволяет разработчикам Python легко находить координаты адресов, городов, стран и ориентиров по всему миру, используя сторонние геокодеры и другие источники данных.
-
emoji — Emoji для Python.
-
reportlab - это open source (BSD license) библиотека, позволяющая создавать PDF-документы любой сложности напрямую из Python’a.
-
email - это встроенный модуль python для отправки e-mail.
-
smtplib - smtplib питона обеспечивает очень удобный способ для отправки по e-mail. Это протокол SMTP простого пакета.
Для управления ботами в Telegram используется специальный бот @BotFather. Для создания нового бота отправьте команду /newbot
.
BotFather предложит ввести название нового бота и имя пользователя для аккаунта бота. Название отображается в окне диалога с ботом, а имя пользователя используется для ссылок на него.
В ответном сообщении приходит токен который нужен для управления ботом через API. Записывать токен не обязательно, всегда можно получить его снова командой /token
.
В случае если токен стал известен кому-то ещё кроме вас нужно сгенерировать новый токен командой /revoke
.
Старый токен перестанет работать.
Найдем нового бота в поиске
Пока не добавляйте бота в контакты. Как видите в окне описания пусто. Установим текст который будет выводится в окне добавления бота. Для этого отправьте BotFather команду /setdescription
.
Описание отображается в окне с заголовком "What can this bot do?". Текст описания ограничен 512 символами, допустимы переводы строк.
Для изменения описания бота в окне информации о пользователе отправьте BotFather команду /setabouttext
.
Текст описания в этом окне ограничен 120 символами. Бот также выдает что текст не должен содержать переводы строк, но текст с ними нормально принимается.
Если бот уже добавлен в контакты то после команд /setabouttext, /setdescription и /setuserpic описание в клиенте обновляется не сразу. Помогает перезапустить клиент, или удалить разговор с ботом и снова его добавить.
Самая заметная часть описания - аватар. Для его изменений введите команду BotFather /setuserpic
.
После её ввода отправьте BotFather изображение которое станет аватаром бота. Аватар используется в двух местах - в описании пользователя и в изображении в списке контактов. Причем в контактах изображение обрезается в форме круга.
Все возможности можно посмотреть с помощью команды /help
.
Внимание: token – единственный идентификационный ключ к боту. Нигде не выкладывайте его, иначе другие люди смогут управлять Вашим ботом. Бот с данным token на момент выкладывания статьи удалён.
В зависимости от выбранной Вами модели (webhooks/polling) установка бота буде отличаться.
- Установить все зависимости с
requirements/requirements_polling.txt
. - Включить прокси (поскольку api и сам телеграмм бот под санкциями в РФ), при работе над проектом использовался RiseupVPN.
- Запустить файл telbot_poling.py.
- Открыть теергламм(месенджер) и в поиске найти@MyShopBot или @TradingStoreBot и нажать старт.
- Приобрести доменное имя для сервера и получить на него сертификат (например, от Let’s Encrypt). Документация также говорит, что в случае самоподписанного сертификата можно обойтись и просто IP адресом;
- Реализовать серверную часть на стороне бота (куда будет приходить Telegram); Зарегистрировать адрес серверной части в Telegram (зацепить webhook на endpoint), чтобы Telegram знал, куда приходить с сообщениями.
- Серверная часть в проекте была реализована на framework flask.
- Запустить бота на сервере telbot_webhooks.py.
- Установить все зависимости с
requirements/requirements_webhooks.txt
. - Открыть теергламм(месенджер) и в поиске найти @MyShopBot или @TradingStoreBot и нажать старт.
Внимание: при развертывании проекта может возникнуть ошибка raise TTFError('Can\'t open file "%s"' % fn)
. Решается добавление шрифтов arial.ttf
в корень библиотеки: venv/lib/python3.6/site-packages/reports/font