Как написать бота на Python для Telegram: пошаговый разбор

Бот на Python для Telegram за вечер: токен, polling или webhook, каркас заявки на aiogram 3, лимиты Telegram и проверка перед запуском рекламы.

Бот на Python: схема Telegram-бота, который принимает заявку и пересылает её менеджеру
Бот на Python: схема Telegram-бота, который принимает заявку и пересылает её менеджеру

Бот на Python для Telegram пишут так: получают токен у BotFather, ставят библиотеку aiogram 3 или python-telegram-bot, принимают сообщения через polling и пересылают заявки менеджеру в отдельный чат. Простой каркас запускается за вечер, рабочая версия с сохранением состояния, алертами и сервером обычно занимает несколько дней. Ниже порядок шагов по официальной документации Telegram Bot API, короткий пример кода и места, где теряются заявки.

Когда нужен бот на Python, а когда хватит конструктора

Конструктор закрывает MVP за дни. Код оправдан, когда сценарий перерос меню из кнопок, нужны интеграции с CRM и учётной системой, полный контроль над данными или тариф платформы растёт быстрее выручки.

Кофейне с меню и адресом обычно хватает конструктора, разбор есть в статье конструктор чат-бота без кода. Интернет-магазину, которому нужно сверять остатки и статусы заказов, удобнее бот на Python со своей логикой.

Как написать бота на Python для Telegram: пять шагов

  1. Получите токен. Напишите @BotFather команду /newbot, задайте имя и адрес. Токен даёт полный контроль над ботом: храните его в переменных окружения, не коммитьте в git и не пересылайте в общий чат. Утёк, перевыпустите через BotFather и замените на сервере.
  2. Выберите библиотеку. Сравнение ниже.
  3. Опишите сценарий на одной странице. Меню из 3-5 пунктов (вопросы, заявка, контакты), ветка заявки «услуга, город, срок, телефон», сообщение менеджеру и ответ клиенту «приняли, ответим в рабочее время».
  4. Соберите каркас на polling и проверьте, что заявка доходит до менеджера.
  5. Перенесите на сервер, включите webhook и алерты. Рекламу подключайте после этого.

Какую библиотеку выбрать: aiogram или python-telegram-bot

Критерийpython-telegram-botaiogram 3.x
Стильзрелая экосистема, много примеровасинхронный код
ДиалогиConversationHandlerFSM из коробки
Фоновые задачиjob queueчерез asyncio и свои планировщики
Когда братьпервый проект, много готовых рецептоввысокая нагрузка, много интеграций

Обе библиотеки закрывают типовые задачи бота на Python для бизнеса: меню, заявки, уведомления. Архитектура важнее выбора: один процесс, один способ приёма обновлений, одно место хранения состояния диалога. Шаг диалога держат в Redis или SQLite. В глобальных переменных при двух воркерах состояние поплывёт, а после деплоя клиент застрянет посреди заявки.

Где держать тексты сценария

Больше всего времени при работе над ботом на Python обычно уходит на тексты сценария и тест на реальных вопросах клиентов, сам код занимает меньшую долю. Поэтому формулировки держат в отдельной папке, чтобы владелец услуги правил их без программиста:

app/
  main.py      # точка входа, выбор polling/webhook
  config.py    # настройки из env
  handlers/    # команды и callback
  services/    # CRM, оплаты, LLM
  storage/     # SQLite/Redis для FSM
  texts/       # утверждённые формулировки

Воронку, которую потом переносят в код, разбирает статья чат-бот Telegram для бизнеса.

Polling или webhook: как бот получает обновления

СпособКогда братьЧто помнить
getUpdates (long polling)локальная разработка, первый MVPпроцесс должен быть онлайн постоянно
setWebhook (webhook)продакшен на VPS или в облакенужен HTTPS и корректный сертификат

Способы взаимоисключающие: пока активен webhook, getUpdates не работает. Статус смотрят через getWebhookInfo, снимают webhook через deleteWebhook. Непрочитанные обновления Telegram хранит не дольше 24 часов, так что сервер, упавший на выходные, может стоить вам заявок.

Для webhook документация разрешает порты 443, 80, 88 и 8443. Самоподписанный сертификат подойдёт, только если загрузить публичный ключ через setWebhook. На практике проще принимать TLS на nginx и проксировать запросы на локальный порт приложения.

Два процесса с polling на одном токене устроят гонку обновлений. Поэтому бот на Python в продакшене работает в одном экземпляре: systemd-unit или Docker с restart=always.

В коде разница небольшая. В aiogram 3 polling для бота на Python запускают одним вызовом start_polling, а для webhook нужен веб-сервер, который принимает запросы от Telegram.

Минимальный бот на Python: приём заявки на aiogram 3

Самый короткий рабочий вариант здоровается, принимает любое текстовое сообщение как заявку и пересылает его в чат менеджера. FSM, проверки телефона и webhook здесь нет намеренно: такой каркас запускают локально и смотрят, доходит ли заявка.

import asyncio
import os
from aiogram import Bot, Dispatcher, Ffrom aiogram.filters import CommandStartfrom aiogram.types import Message
bot = Bot(os.environ["BOT_TOKEN"])dp = Dispatcher()MANAGER_CHAT_ID = int(os.environ["MANAGER_CHAT_ID"])
@dp.message(CommandStart())async def start(message: Message):await message.answer("Здравствуйте! Напишите, какая услуга нужна, и оставьте телефон.")

@dp.message(F.text) async def lead(message: Message): await bot.send_message( MANAGER_CHAT_ID, f"Заявка от {message.from_user.full_name} (id {message.from_user.id}):\n{message.text}", ) await message.answer("Приняли. Менеджер ответит в рабочее время.")

async def main():await dp.start_polling(bot)
asyncio.run(main())```

Токен и ID чата берутся из переменных окружения, поэтому файл можно хранить в git. Следующим шагом в бота на Python добавляют FSM с шагами заявки, хранилище состояний в Redis и отдельный хендлер для кнопок.

Мелочи, которые замечает клиент

  • На каждую inline-кнопку отвечайте answerCallbackQuery, иначе клиент видит «часики» и решает, что всё сломалось.
  • Телефон можно запросить кнопкой request_contact, но многие её не нажимают. Дублируйте текстовым вводом с проверкой формата.
  • Ссылка вида t.me/YourBot?start=utm_campaign_march передаёт метку в /start. Сохраните её в заявке, и у вас будет базовая атрибуция без отдельной аналитики.
from aiogram.filters import CommandObject

@dp.message(CommandStart(deep_link=True)) async def start_with_source(message: Message, command: CommandObject): source = command.args # например, utm_campaign_march ```

Ограничения Telegram и запуск на сервере

ОграничениеЗначениеПрактика
Текст сообщениядо 4096 символовдлинный FAQ режьте на части или давайте ссылку
Подпись к медиадо 1024 символовкороткий текст и URL
Частота запросов429 Too Many Requests и retry_afterпауза с нарастанием, очередь отправок
Файлылимиты Bot API на загрузкутяжёлые PDF отдавайте ссылкой с сайта

Ни один бот на Python, как и на любом другом языке, не может написать пользователю первым: таково правило платформы. Аудиторию набирают входящим трафиком: кнопкой на сайте, ссылкой в рекламе, QR-кодом на кассе.

Минимальные алерты для бота на Python в продакшене:

  • процесс не отвечает 2-3 минуты;
  • ошибка отправки сообщения менеджеру;
  • несколько ответов 429 подряд;
  • webhook вернул не 200: Telegram повторит доставку, но очередь копится.

Не подключайте LLM к прайсу и срокам. Цены и юридические формулировки остаются в сценарии или в базе, которую правит владелец услуги. Как устроены ИИ-ответы по утверждённой базе, описано в статье ИИ чат-боты GPT и Gemini.

Бот на Python, который принимает имена и телефоны клиентов из России, обычно размещают на VPS у российского провайдера и там же хранят базу заявок: так проще выполнить требования 152-ФЗ. Логи пишите без полных телефонов, а точный порядок сверьте с юристом и политикой обработки ПДн.

Перед рекламой прогоните бота на Python по 20 реальным вопросам из переписки менеджера. Придуманные «тестовые» вопросы пропускают как раз те ветки, где клиент застревает.

Частые вопросы

Сколько времени нужно, чтобы написать бота на Python?

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

Polling или webhook для малого бизнеса?

Для первой версии бота на Python допустим polling на недорогом VPS. Когда бот связан с рекламой и сроками ответа на заявки, нужны webhook, мониторинг и один ответственный за сбои.

Нужна ли боту на Python база данных?

Для простого FAQ часто нет. Для заявок, FSM, статусов заказа и интеграций нужна, хотя бы SQLite или Redis.

Как связать бота с сайтом?

Кнопка «Написать в Telegram», deep-link с UTM-меткой, QR-код. Форму на сайте оставьте дублем: бот на Python не должен быть единственной точкой входа.

Что делать дальше

Порядок запуска бота на Python такой: сценарий на одной странице, каркас на polling, 20 реальных вопросов, перенос на webhook с алертами, затем один источник трафика с меткой start=. Версию библиотеки зафиксируйте в зависимостях. Telegram периодически добавляет поля в Update и новые типы кнопок, и после обновления без проверки сценария callback-кнопки часто перестают отвечать.

Если писать и сопровождать код самим некогда, готового бота под ваш сценарий соберём сами: состав работ описан на странице чат-бот для Telegram. Ориентиры бюджета есть на странице цены.

Оставить заявку · Все статьи