Как тестировать бота telegram
Перед развертыванием чат-бота вы должны выполнить определенные тесты, в том числе: общее тестирование, тестирование домена, общее, ручное, постпроизводственное тестирование, A / B-тестирование и т. Д.
Без стандартного метода тестирования чат-бота, как вы можете быть уверены, что ваш бот не содержит ошибок и удобен для пользователя?
Чат-боты — многообещающая технология, когда дело доходит до улучшения качества обслуживания клиентов. Вы можете установить их на свой веб-сайт, и ваши клиенты смогут в любое время связаться с вашей компанией для получения необходимой информации.
Однако сначала необходимо выяснить, будет ли эта технология правильно работать с вашим бизнесом. Это означает, что нужно протестировать его и проверить, дает ли бот правильный ответ на каждое взаимодействие. Вот несколько лучших способов протестировать своего бота.
Общее тестирование
Это тесты на вопросы и ответы, ориентированные на общие вопросы, на которые, как ожидается, ответит самый простой бот. Например, проверяется приветствие пользователя. Бот должен пройти общий тест, чтобы даже рассмотреть возможность запуска других тестов.
Ожидание этого теста состоит в том, что чат-бот поддерживает плавную беседу, и если бот выйдет из строя на первом этапе, весьма вероятно, что пользователь выйдет из разговора. Это ухудшает такие показатели чат-бота, как показатель отказов.
Тестирование домена (использование)
Доменные тесты представляют собой второй этап. На этом этапе анализируются язык и выражения, чтобы убедиться, что чат-бот способен отвечать на запросы, специфичные для домена.
Запросы будут персонализированы в соответствии с типом бизнеса, они не будут одинаковыми, если это электронная коммерция или ресторан.
Чат-бот электронной коммерции должен понимать, что все это приводит к одному и тому же ответу: «брюки», «синие брюки», «синие брюки для мужчин».
Невозможно охватить каждый конкретный тип вопросов, относящихся к этой конкретной области, но тесты для конкретной предметной области должны быть разделены на категории, чтобы гарантировать, что ключевые категории охватываются автоматическим тестом.
Эти вопросы отмечены контекстом, и именно они побудят потребителя купить продукт или услугу. После того, как приветственная часть разговора заканчивается, остальная часть разговора должна быть сосредоточена на продукте или услуге.
Следовательно, после первоначального приветствия и разговора чат-боты должны доминировать в разговоре или правильно отвечать, что является важной метрикой чат-бота.
Чтобы проверить ответы чат-бота на платформе, щелкните значок «написать» на панели навигации.
Появится новый раздел, в котором вы сможете протестировать отдельные сообщения, проверить степень достоверности и заменить ответ, если присутствует другая альтернатива.

Ручное тестирование
Ручное тестирование может включать, что разработчики тратят много часов на тестирование чат-бота для конкретного варианта использования или для определенного канала.
Например, вы можете отправить текстовое сообщение чат-боту с точки зрения пользователя, который намерен совершить покупку, или как пользователь, просто просматривающий варианты.
Также вы можете протестировать свой диалог в приложениях для обмена сообщениями, таких как WhatsApp или Wechat перед развертыванием чат-бота.
Чтобы вручную протестировать чат-бота, перейдите в «Чат-боты»> «Проверить URL». Вы сможете вручную протестировать свои сценарии и ответы.

Пост-продакшн тестирование
Постпроизводственное тестирование или тестирование после запуска проверяет различные аспекты функциональности чат-бота, когда он активен для пользователей.
Конечно, для вас практически невозможно научить своего чат-бота отвечать на каждый запрос, который ваши пользователи вводят в чат-бота, и кто-то может написать разные способы задать один и тот же вопрос, с орфографическими ошибками или другими проблемами.
Как мы уже говорили ранее, ответы должны быть как можно более широкими, чтобы предвидеть эти ситуации. Этот этап в основном состоит из уделения особого внимания тому, как бот реагирует, и является ли информация точной.
Любое тестирование перед запуском чат-бота в конечном итоге является бета-тестом. Обратная связь жизненно важна, и необходимо периодически запускать тесты с вопросами, задаваемыми пользователями, которые проводят реальное тестирование чат-бота.
Другими словами: будьте готовы постоянно настраивать своего чат-бота на отзывы, которые вы получите после запуска. Цель состоит в том, чтобы поддерживать актуальность ответов, текущую производительность можно улучшить в будущем, подвергнув чат-бота процессу непрерывного тестирования.
В панели администратора выберите База данных> Ответы> Предложения, чтобы найти список сообщений, на которые чат-бот не смог ответить. Щелкните сообщение, чтобы добавить ответ.


A / B тесты
A / B-тест — это сравнение двух версий одного и того же продукта, чтобы увидеть, какая из них работает лучше. Посетителям одновременно показываются две версии, и именно они решают, какая версия более эффективна или лучше с точки зрения разговора.
A / B-тестирование широко применяется в различных областях маркетинга, однако для чат-ботов существует не так много альтернатив A / B-тестированию.
Когда дело доходит до чат-ботов, это способ познакомиться с различными функциями диалоговой программы.
Посредством рандомизированных испытаний компании могут собирать данные и решать, какая альтернатива наиболее эффективна как для клиентов, так и для их целей. Тестирование чат-бота осуществляется в процессе автоматизированного тестирования. А благодаря этой автоматизации можно ускорить процессы разработки чат-бота и гарантировать лучшее качество.
Мы можем смоделировать этот процесс в виде двух отдельных этапов тестирования дизайна чат-бота.
Первый определяет визуальные факторы чат-бота, такие как дизайн, цвет или расположение чат-бота на веб-странице.
А второй определяет разговорные факторы с точки зрения качества и производительности. Эти два фактора проверяются, чтобы обеспечить лучший пользовательский опыт.
Визуальные факторы
Дизайн также очень важен для чат-бота, поскольку это решающий фактор для успеха взаимодействия с пользователем. A / B-тестирование может заключаться в изменении цвета рамки или цвета кнопки.
Чтобы изменить стиль своего чат-бота, вы можете выбрать «Установить»> «Дизайн». Здесь вы сможете переключаться между цветами и рамками.

Факторы разговора
A / B-тестирование отслеживает показатели оттока и удержания, поскольку они продолжают определять успех бота. Показатели вовлеченности пользователей для различных альтернативных ботов также остаются значительными.
Один из этих тестов — решить, как начать разговор, если чат-бот начинает со стандартного приветствия или использует другие сообщения. Это важный фактор, потому что воронка продаж начинается с взаимодействия.
Если чат-бот успешно спровоцирует желаемое действие, которое заставляет пользователя взаимодействовать с ним, мы с большей вероятностью достигнем более широкой аудитории и большего потока разговора.
Также важно определиться с формальностью языка и тем, как это может повлиять на уровень приверженности. Необходимо проверить несколько ответов, поскольку формальность зависит от профиля клиента или пользователя.
Регулярно посещайте раздел аналитики платформы. Здесь вы найдете базовую статистику чат-бота.
Вы можете проверить количество взаимодействий, сеансов, результаты формы и время сеанса среди прочего. Эти показатели дадут вам представление об эффективности вашего чат-бота для заданных настроек.

Если вы используете корпоративный план, вы также сможете получить доступ к разделу производительности. Здесь вы сможете проверить показатель отказов, настрой и выполнить A / B-тестирование скриптов.
Как реализовать end-to-end-тестирование telegram-бота
Каждый, кто когда-либо писал telegram-ботов, задавался вопросом: «А как их тестировать?» Сложно найти однозначный ответ. Например, при написании тестов для веб-приложений и API можно воспользоваться тестовым клиентом DRF или FastAPI: просто пишешь запрос и делаешь assert на полученный ответ. Мне захотелось получить подобный функционал и для тестирования telegram-бота.
Привет, Хабр. Я Михаил Выборный, python-разработчик, backend-developer в облачном провайдере beeline cloud. В этой статье я хочу поделиться опытом написания автоматизированных end-to-end-тестов без эмуляции Telegram Bot API, но с использованием тестовых аккаунтов. Мы зайдем в изолированное тестовое пространство Telegram, создадим тестового бота, подготовим фикстуру для запуска нашего приложения и напишем авторизацию для тестовых клиентов.
По ходу статьи я буду использовать инструменты следующих библиотек:
- Python Telegram Bot — для написания бота (сокращенно PTB);
- Pytest — для организации тестов;
- Anyio — для асинхронных тестов и фикстур;
- Pyrogram — для отправки тестовых сообщений;
- asyncio.Event — для оповещения о получении ожидаемых сообщений и предотвращения излишних ожиданий;
- contexlib — для удобного синтаксиса написания контекстных менеджеров.
Статья написана на примере реализации несложного бота для хранения фотографий и отправки их в ответ при запросе. Вы можете посмотреть исходный код приложения и тестов на GitHub. Ниже я использую короткие выдержки из официальной документации Telegram на английском – к ним даю пояснения на русском своими словами.
Альтернативы
Перед тем как что-то писать самому, я пытался найти готовое решение и был уверен, что Google мне поможет. Но оказалось, что готового оптимального решения просто не существует. Здесь я кратко перечислю то, что мне удалось найти и почему это не подошло.
- больше не поддерживается
- интеграция с unittest (не pytest)
- подходит для тестирования ботов, написанных только на aiogram
- реализует unit-тестирование через Mock-объекты (без интеграции Telegram Bot API)
Все тест-кейсы описываются как вызов конкретных handler-ов, из-за чего нет возможности протестировать их поведения целиком — от отправки пользователем сообщения до получения ответа. К примеру, непонятно, как тестировать фильтрацию входящих сообщений и их распределение по различным handler-ам и т. п.
- также не поддерживается
- тянет устаревшие зависимости (pyrogram < 2.0.0 typing-extensions < 4.0.0)
- практически отсутствует документация
Перед тем как начать. Регистрация APP
Предположим, наш бот уже готов и мы переходим к тестированию. Для этого мы подготовим необходимые инструменты, чтобы написание самих тестов было кратким и понятным. Отправить сообщение, получить ответ, проверить его. Да, придется потратить время, чтобы реализовать вспомогательные фикстуры по регистрации клиентов и обработки входящих сообщений. Но, заморочившись однажды, мы сможем писать сами тесты всего в несколько строк. Их будет легко обновлять и поддерживать.
Отправлять тестовые сообщения мы будем с помощью Pyrogram. Для этого нужно зарегистрировать будущее клиентское приложение.
Тут важно понимать, что для взаимодействия с Telegram API необходимо зарегистрировать свое приложение в системе Telegram — для этого потребуется действующий номер телефона. Но для запуска самих тестов будут использоваться тестовые телефонные номера. Поэтому переживать за сохранность личных данных или получение флуд-бана не стоит.
После регистрации мы получаем api_key и api_id, которые можем использовать для создания множества клиентских приложений.
The API key defines a token for a Telegram application you are going to build. This means that you are able to authorize multiple users or bots with a single API key. (© Telegram Documentation)
Тестовый бот
Регистрация бота
Для тестирования пользовательских приложений Telegram дает доступ к Dedicated test environment (выделенная тестовая среда). Это изолированная песочница, где можно регистрировать пользователей и создавать ботов. Если аккаунты мы будем создавать динамически, используя тестовые номера, то зарегистрировать тестового бота у @BotFather проще вручную, используя свой настоящий номер.
The test environment is completely separate from the main environment, so you will need to create a new user account and a new bot with @BotFather. (© Telegram Documentation)
Как это сделать, можно прочитать тут. Я использовал приложение Telegram для iOS, кликнув 10 раз на иконку Settings (Настройки).

После этого в приложении становится доступен второй аккаунт. Это очень удобное свойство Telegram, о котором знают немногие (лично я раньше не знал). Можно использовать для различного тестирования или даже завести секретный чат с другим человеком (который тоже зарегистрировался в тестовом пространстве). Далее, как обычно, регистрируем бота у @BotFather и получаем токен. Для обращения к любому из методов нужно добавить /test/ в путь запроса.
https://api.telegram.org/bot/test/METHOD_NAME
Запуск бота во время тестов
Теперь при запуске тестов мы можем запустить наше приложение в тестовом пространстве. Для этого подготовим фикстуру.
@pytest.fixture(scope='session') # fixture runs Bot app only once for entire tess session async def application(): app = Application.builder().token('' + '/test').build() await app.initialize() await app.post_init(app) # initialize does *not* call `post_init` - that is only done by run_polling/webhook await app.start() await app.updater.start_polling() yield app await app.updater.stop() await app.stop() await app.shutdown()
Обычно для запуска приложения мы используем app.run_polling(), но это заблокирует дальнейшее исполнение программы. Мы же будем запускать тесты в параллель с тем, как работает наш бот. Подробнее о том, как запускать PTB с другим асинхронным кодом, — Running PTB alongside other asyncio frameworks
pytest сам по себе не асинхронный, но может работать с асинхронными тестами и фикстурами, если добавить pytestmark = pytest.mark.anyio. Подробнее: Testing with AnyIO
PTB на данный момент не поддерживает работу бота в тестовом пространстве, но можно передать токен вместе с приставкой /test. Класс telegram.Bot формирует базовый путь сложением base_url и token.
# content of /telegram/_bot.py self._base_url: str = base_url + self._token self._base_file_url: str = base_file_url + self._token
Перехватывание исключений
По умолчанию все необработанные исключение в PTB пишутся в лог. Но при запуске тестов мы хотим убедиться, что в приложении не возникало ошибок. Для этого добавим обработчик ошибок, где будем сохранять возникшие исключения в отдельное место (в моем случае это переменная класса). Позже мы сможем проверить на наличие непредвиденных исключений.
async def collect_app_exceptions_callback(self, update: Update, context: ContextTypes.DEFAULT_TYPE): self.collected_exception = context.error self.collection_event.set() # special asyncio event we are wating for while collecting replyes raise ApplicationHandlerStop # prevent any other error handlers app.add_error_handler(self.collect_app_exceptions_callback)
collection_event объект класса asyncio.Event — событие, исполнение которого мы ожидаем, пока ждем ответа от бота. В случае перехватывания исключений ждать ответа дальше смысла нет, так как произошла ошибка. Но pytest об этой ошибке ничего не знает, поэтому сохраним ее здесь и сделаем re-rise позже. Вы увидите инициализацию и полное применение collection_event в следующем блоке.
Отлично, наш бот работает. Теперь можем отправлять ему тестовые сообщения. Для этого понадобится аккаунт.
Тестовый клиент-аккаунт
Тестовые номера
Для тестирования приложения мы будем использовать тестовые номера, которые предоставляет Telegram. Мы можем сформировать тестовые номера заранее и хранить их, к примеру, в .env файле или генерировать на лету для каждой тест-сессии отдельно. Тестовый номер — это:
99966XYYYY X - номер номер DC от 1 до 3 Y - любая цифра от 0 до 9
Тестовый номер позволяет в автоматическом режиме проходить авторизацию, и мы можем создать сколь угодно много аккаунтов. К примеру, мой бот позволяет давать другим людям доступ к общей базе фотографий. Так я смогу протестировать, что один клиент загрузил фотографию, другой получил к ней доступ, а третий нет.
Telegram периодически сбрасывает тестовые номера, поэтому все дальнейшие действия по авторизации и настройке telegram-клиента лучше производить непосредственно перед каждым запуском тестов.
Do not store any important or private information in the messages of such test accounts; anyone can make use of the simplified authorization mechanism – and we periodically wipe all information stored there. (© Telegram Documentation)
Создание клиента
Для упрощенной регистрации клиентов и перехватывания всех сообщений от бота отдельно для каждого клиента я инкапсулировал всю логику в отдельный класс ClientIntegration. Но в примерах здесь я удалил все опциональные настройки, чтобы не отвлекаться от сути. Код вспомогательного класса целиком можно посмотреть тут.
- Создадим клиента. В отличие от PTB, у Pyrogram есть нативная поддержка тестового пространства Telegram.
self.client = Client( 'test-client', api_id='', api_hash='', test_mode=True, in_memory=True, phone_number='99966' + '1' + '2023', phone_code='1' * 5, )
- in_memory — после авторизации сессия не будет записываться в файл test-client.session, а останется в памяти. Это позволит изолировать тесты друг от друга и не подчищать *.session файлы вручную после тестов.
- phone_code — код подтверждения авторизации. Для тестовых номеров всегда равен номеру DC х 5 раз.
- Мы уже указали телефонный номер и код подтверждения. Но может быть такое, что тестовый номер не зарегистрирован. В этом случае Pyrogram попросит ввести имя и фамилию. Чтобы пройти процесс регистрации автоматически, заменим stdout и stdin:
def mock_input_callback(prompt: str = ''): if 'Enter first name: ' == prompt: return '' if 'Enter last name (empty to skip): ' == prompt: return '' raise ValueError(prompt) def mock_print_callback(self, *args, **kwargs): . with pytest.MonkeyPatch.context() as monkeypatch: monkeypatch.setattr(builtins, 'input', mock_input_callback) monkeypatch.setattr(builtins, 'print', mock_print_callback) .
- Теперь мы можем запустить приложение клиента Pyrogram. Для удобства я описал все действия в отдельном методе ClientIntegration и обернул его в asynccontextmanager. Я использую здесь контекст-менеджер, чтобы явно описать setup и teardown. Позже это будет удобно интегрировать в Pytest в качестве yield фикстуры.
@asynccontextmanager async def session_context(self) . try: # Some phonenumbers are registered already, some other not. # To be sure, handle sign up action by patching stdin/stdout. with pytest.MonkeyPatch.context() as monkeypatch: monkeypatch.setattr(builtins, 'input', mock_input_callback) await self.client.start() # Update Telegram User properties, if they are needed for tests cases. await self.client.update_profile('', '', '') if self.client.me.username != self.credits.username: await self.client.set_username('') # Clear messages to make each test isolated from others. await client.invoke( DeleteHistory(peer=await client.resolve_peer(''), max_id=0, just_clear=False) ) yield self finally: await self.client.set_username(None) # cleaning up await self.client.stop()
Если для авторизации клиента использовать случайно сгенерированный тестовый номер, то стоит учесть, что другой разработчик мог установить двухфакторную авторизацию для этого номера, защитив его паролем. В таком случае остается только попробовать любой другой номер.
4. В итоге можем использовать ClientIntegration.session_context для описания фикстур.
@pytest.fixture(scope='session') async def integration_1(): async with ClientIntegration().session_context() as integration_1: yield integration_1 @pytest.fixture(scope='session') async def integration_2(): async with ClientIntegration().session_context() as integration_2: yield integration_2 .
Я использую параметр scope=’session’, чтобы инициализировать клиента один раз для всей сессии. Это сократит время на подготовку фикстур, а поскольку сам клиент не хранит данные, это не нарушит изолированности тестов.
Тестирование
Сборщик ответов
Для тестов необходимо отправлять сообщения боту и получать от него ответы. Если с первым все понятно, то для второго нужно повесить обработчик сообщений, где мы будем складывать все полученные сообщения в список, чтобы потом сделать assert на содержание полученных сообщений.
Но как долго нам ждать ответа от бота? Можно задать максимальное значение timeout, а можно указать конкретное количество. К примеру, сейчас ожидаем получить только одно сообщение, и как только оно будет получено, можно двигаться дальше.
# messages collector: async def collect_replyes_callback(self, client: Client, message: Message) self.collected_replyes.append(message) # If True, set event flag to True. No more waiting for messages: if len(self.collected_replyes) == self.collection_required_amount: self.collection_event.set() # timeout checker: async def collection_max_timeout_waiting(self, timeout: float): await sleep(timeout) self.collection_event.set() # apply handler and create Event: self.client.on_message(filters.chat(''))(self.collect_replyes_callback) self.collection_event = asyncio.Event() # Wait until all messages are received or reaching timeout. timout_task = asyncio.create_task(self.collection_max_timeout_waiting(timeout)) await self.collection_event.wait() timout_task.cansel()
Теперь мы можем проверить полученные сообщения и то, что в приложении не было ошибок (мы использовали error_handler при инициализации приложения PTB в предыдущем блоке).
if self.collected_exceptions: raise self.collected_exception assert len(self.collected_replyes) == amount, 'Received unexpected messages amount. '
Для удобства я описал все эти действия в отдельном методе ClientIntegration и также обернул его в @asynccontextmanager. При выходе из контекстного менеджера collect сработает блок finally, где мы будем ожидать ответы от бота.
@asynccontextmanager async def collect(self, *, amount: int, timeout: float = 2.0): self.collection_amount = amount self.collected_replyes.clear() self.collection_event = asyncio.Event() try: yield self.collected_replyes finally: timout_event = asyncio.create_task(self.collection_max_timeout_waiting(timeout)) await self.collection_event.wait() timout_event.cancel() if self.collected_exceptions: raise self.collected_exception assert len(self.collected_replyes) == amount, 'Received unexpected messages amount. '
Описание тестов
К примеру, мы хотим протестировать отправку сообщения /start и получение ответа Hello, !. Благодаря фикстурам, описанным выше, этот тест-кейс может быть описан буквально тремя строчками.
pytestmark = [ pytest.mark.anyio, pytest.mark.usefixtures('application') # PTB Application ] async def test_start_handler(integration: ClientIntegration): # test action: async with integration.collect(amount=1) as replyes: await integration.client.send_message('', '/start') # at __aexit__ wait until all messages are received # test assertion: assert replyes[0].text == f'Hellow, !'
В качестве альтернативы Pyrogram может быть Telethon. Это схожая библиотека для работы с клиентом Telegram. Из плюсов — Telethon реализует метод conversation, что упрощает сборку ответов клиенту от бота. Подробнее можно посмотреть тут.
with client.conversation('') as conv: await conv.send_message("/start") reply: Message = await conv.get_response() assert reply.raw_text == f'Hellow, !'
Заключение
Потратив дополнительное время на подготовку фикстур, мы получаем все необходимые инструменты для написания тестов от начала и до конца. Мы можем создать несколько пользователей, отправлять им разные тестовые сообщения и проверять ответы. Это удобно не только для написания тестов в целом, но и во время разработки — как точка входа для запуска и отладки. Вместо того чтобы каждый раз доставать телефон и вручную отправлять сообщения боту, можно описать простой тест на отправку сообщения клиентом.
Но стоит понимать, что такой способ тестирования не самый дешевый с точки зрения реализации, поддержки и времени исполнения самих тестов. Каждый запрос на регистрацию клиента, отправку сообщения клиентом, на отправку ответа ботом происходит посредством реальных запрос к серверу Telegram. А это занимает время. Когда подобных тестов станет много, это может стать проблемой. Вот почему для написания тестов стоит придерживаться парадигмы Testing Pyramid и реализовывать подобным методом только базовые и важные функции вашего приложения.
beeline cloud — secure cloud provider.
Разрабатываем облачные решения, чтобы вы предоставляли клиентам лучшие сервисы
Урок 1. Быстрый старт. Эхо-бот
Перед началом убедитесь, что у вас установлен интерпретатор языка Python версии не ниже 3.6 (актуальные версии посмотреть и скачать можно здесь). Первый и второй уроки будут проведены на версии 3.6.4, версия библиотеки aiogram 1.0.4 , проверено на версии 1.1.
Этот пункт можно пропустить, если вы не новичок, и уже всё проверили.
Проверить версию интерпретатора можно следующим образом (справедливо для большинства систем): python —version . Будет возвращено Python 3.6.4 . Если у вас установлено несколько версий интерпретатора, будет необходимо указать версию: python3 —version .
Далее устанавливаем библиотеку командой pip install -U aiogram . Если у вас установлено несколько интерпретаторов (например 2 и 3), то необходимо явно указать версию pip: pip3 install -U aiogram . Если у вас установлено несколько версий 3 (например 3.4, 3.5, 3.6), то обращаемся к необходимому интерпретатору командой -m pip . , то есть в данном случае python3.6 -m pip install -U aiogram . Проверить версию библиотеки можно командой pip freeze | grep aiogram (тут так же не забудьте правильно указать версию pip), вернется aiogram==1.0.4 . Возможно, у вас в Windows не будет работать команда grep , тогда используйте просто команду pip freeze и убедитесь в присутствии aiogram в результате выполнения команды.
Начинаем писать код
Давайте для знакомства с библиотекой создадим бота, который будет приветствовать пользователя и высылать в ответ присланный ему текст. Для этого создадим каталог для нашего бота и сохраним там два файла: bot.py и config.py .
Открываем последний любимым текстовым редактором и записываем туда токен, полученный от @BotFather:
TOKEN = '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11'
Теперь возьмемся за основной файл — приступаем к редактированию файла bot.py . Для этого импортируем необходимые модули библиотеки aiogram и токен бота, а так же инициализируем объекты бота и диспетчера:
from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor from config import TOKEN bot = Bot(token=TOKEN) dp = Dispatcher(bot)
Команда, с которой начинается общение пользователя с ботом — /start . Поэтому давайте научим нашего бота реагировать на эту команду. Создаем message_handler и объявляем там функцию ответа:
@dp.message_handler(commands=['start']) async def process_start_command(message: types.Message): await message.reply("Привет!\nНапиши мне что-нибудь!")
Ещё в ботах принято создавать обработчик команды /help — вдруг пользователь заинтересуется возможностями бота.
Вообще, мы могли бы добавить просто help в массив, передаваемый параметру commands , чтобы получилось:
@dp.message_handler(commands=['start', 'help'])
Но зачем приветствовать пользователя снова? Поэтому создадим отдельный message_handler для этой команды:
@dp.message_handler(commands=['help']) async def process_help_command(message: types.Message): await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!")
Обращу внимание новичка на то, что называть функции можно как угодно — хоть abc , хоть qwerty , однако называя функции понятным языком — process_start_command , process_help_command сразу понятно, какая за что отвечает. Главное, чтобы имена не повторялись. Называть как угодно можно также и имя параметра, покажу дальше.
Итак! Осталось сделать обработку текстового сообщения. Для этого пишем следующее:
@dp.message_handler() async def echo_message(msg: types.Message): await bot.send_message(msg.from_user.id, msg.text)
Объясняю, что мы только что написали:
Если не указывать тип обрабатываемого сообщения, то библиотека по умолчанию делает обработку только текстовых сообщений — то, что нам и нужно. Поэтому скобки на первой строчке остаются пустыми.
Параметр msg это всё то же сообщение, как и в предыдущих пунктах.
В данном случае на последней строчке мы отправляем пользователю сообщение не ответом, а простым сообщением. Для этого мы воспользовались методом send_message и передали в него два обязательных параметра — айди чата, куда отправляем, и сам текст сообщения. Их мы взяли из объекта msg, который является представителем класса Message. Параметр from_user ссылается на ещё один объект — данный параметр имеет класс User. У него есть параметр id — уникальный идентификатор для чатов и каналов в телеграме. Ну и текст полученного сообщения мы получили из поля text.
Финальный штрих
Чтобы получать сообщения от серверов Telegram воспользуемся поллингом (polling. to poll — опрашивать) — постоянным опросом сервера на наличие новых обновлений. Для этого дописываем в bot.py следующее:
if __name__ == '__main__': executor.start_polling(dp)
from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor from config import TOKEN bot = Bot(token=TOKEN) dp = Dispatcher(bot) @dp.message_handler(commands=['start']) async def process_start_command(message: types.Message): await message.reply("Привет!\nНапиши мне что-нибудь!") @dp.message_handler(commands=['help']) async def process_help_command(message: types.Message): await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!") @dp.message_handler() async def echo_message(msg: types.Message): await bot.send_message(msg.from_user.id, msg.text) if __name__ == '__main__': executor.start_polling(dp)
Осталось запустить программу. Для этого в командной строке переходим в директорию проекта и пишем
python bot.py

Теперь можно написать нашему боту:
Гайд: как создать чат-бота
в Телеграме
Сегодня выигрывает тот бизнес, где клиент получает ответ на запрос быстро, четко и по существу. Рост популярности голосовых и текстовых ботов происходит по всем каналам. Особенно в этом преуспел Telegram: у площадки user-friendly интерфейс и развитое API для запуска ботов.
Оставаясь в рамках Telegram, не перекидывая клиента на сайт, ты можешь в одном канале рассказать про товар, продать его, получить деньги, договориться о доставке и проинформировать клиента о приезде курьера
Артем Мельников, менеджер продукта
Продвинутые боты успешно заменяют собой мобильные приложения и даже сайты.
В этом материале мы даем простые лайфхаки по созданию чат-бота в Telegram, а наш чек-лист поможет проверить, что все сделано правильно.
Эксперты Just AI
Артем Мельников
менеджер продукта

Наталья Лаптиева
руководитель технической поддержки
Содержание
Этап № 1. Анализируем
Отдельный этап разработки – понять, для кого и ради чего нужен чат-бот. Ведь у вас появится полноценный онлайн-сотрудник с высочайшей производительностью. Боты могут развлекать, обучать, консультировать в чате, по телефону или в рассылке и все это в режиме 24/7.
Чаще всего ботам поручают скучные и рутинные процессы. Например, банк напоминает клиентам о текущем платеже, а поликлиника оформляет визит врача на дом пациентам с острой болью. Определив бизнес-модель и функционал бота, вы сможете прописать его tone of voice и найти подходящую технологическую платформу.

Этап № 2. Выбираем решение
Как известно, запустить бота можно несколькими способами – купить готовый, заказать разработчику или сделать самому. По какому пути идти, зависит от требований к функционалу, времени на реализацию и вашей подготовки.
Если вам нужен бот с несложной логикой и узкой специализацией, подойдет и готовое решение. Когда требуется реализация сложных сценариев, стоит задуматься об использовании профессиональных инструментов разработки – диалоговых платформ и фреймворков
Наталья Лаптиева
Этап № 3. Пишем сценарий
Хороший сервис должен быть незаметен. С ботами эта логика действует как нигде еще. Разрабатывая сценарий, вы должны «думать как клиент». Чтобы этого добиться, нужно сформировать базу знаний клиентского опыта. Именно вы понимаете контекст и истинные потребности своих заказчиков.
Сценарий – это диалог между ботом и клиентом.

Пример сценария в редакторе Aimylogic
Готовые решения для создания ботов помогают разработать сценарий быстрее и проще. Например, в Aimylogic уже встроены готовые интенты. Вам только остается подключить нужный блок в диалог. Созданный бот может не только отправлять сообщения, но и делиться картинками, стикерами, музыкой. Это нужно учитывать при написании сценария.
Готовые интенты — это заранее подготовленный список возможных реакций клиента, например, на приветствие или прощание.

Готовые интенты в Aimylogic
Когда карта диалогов прописана, нужно определиться с дополнительным функционалом. Будет ли бот дублировать информацию в сторонний сервис или проверять наличие товара перед оплатой. Всегда оставляйте возможность перевода разговора на человека. И добавьте вашему боту персонализации. Называя клиента по имени, вы повышаете лояльность к сервису.
Не забывайте, боты не всегда могут заменить человека на 100%. В некоторых случаях боту потребуется поддержка оператора. Тут важно передать сотруднику колл-центра всю историю взаимодействия, чтобы клиенту не пришлось отвечать на одни и те же вопросы по второму кругу
Артем Мельников
После того, как сценарий создан, можно переходить в Telegram.
Этап № 4. Публикуем бота
Чтобы бот заработал, его нужно зарегистрировать и получить уникальный id, который является одновременно и токеном. Для этого в приложении Telegram через функцию поиска ищется аккаунт @BotFather. Это официальный бот для регистрации других ботов. В диалоговой форме вы получите список команд. Нужно выбрать /newbot. Вводим название и ник со словом bot.

Если название не занято, BotFather сгенерирует боту ссылку и токен. С помощью токена вы сможете сменить имя /setname, добавить описание /setdescription и аватар /setuserpic. На этом же этапе подумайте, каких кнопок с командами не хватает вашему боту. Для их создания нужно зайти в раздел «Настроить гл. меню».
Токен – уникальный ключ, который используется для доступа к Bot API.
Когда токен получен, нужно перейти в настройки каналов в том продукте, который вы используйте. Например, в Aimylogic – это раздел «Каналы». Там нужно выбрать Telegram, в поле токен вставляется код, полученный в мессенджере. Если все сделано правильно, индикатор загорится зеленым — наш бот опубликован.
Теперь можно перейти в приложение Telegram и протестировать его работу.

Раздел «Каналы» в Aimylogic
Очень полезно проводить демо-тестирование или запускать бета-версию на небольшой круг клиентов. Вы сможете оценить, какой путь проходит пользователь, и насколько бот помогает ему в решении проблем. Используя эти знания, уже можно отправляться в «большое плавание»
Наталия Лаптева
Этап № 5. Оцениваем эффективность
Мы создали бота, но наша работа на этом не закончилась. Как бы тщательно вы ни продумывали сценарий, всегда найдется такой пользователь, который поставит нашего виртуального помощника в тупик. Чтобы это исправить, нужно постоянно анализировать его работу. Для этого в Aimylogic предусмотрены удобные разделы «Статистика» и «Диалоги».
Используя данные из этих блоков, можно постоянно дополнять сценарий, дообучать бота и помогать становиться ему более осознанным. Чем больше вариантов фраз от клиента он будет понимать, тем выше будет процент закрытых им вопросов без помощи человека.

Раздел «Статистика» в Aimylogic
Нужно помнить, что недостаточно только запустить бота. Важно анализировать состоявшиеся диалоги и на их основе дополнять сценарий. И с каждым разом ваш бот будет все больше походить на настоящего человека, который готов прийти на помощь в любую минуту
Артем Мельников
Чем выше качество обработки обращений у виртуального помощника, тем больше функций ему можно поручить. А чтобы процесс запуска бота прошел у вас быстро и легко, используйте наш чек-лист.
