
Бот на Python для Telegram пишут так: получают токен у BotFather, ставят библиотеку aiogram 3 или python-telegram-bot, принимают сообщения через polling и пересылают заявки менеджеру в отдельный чат. Простой каркас запускается за вечер, рабочая версия с сохранением состояния, алертами и сервером обычно занимает несколько дней. Ниже порядок шагов по официальной документации Telegram Bot API, короткий пример кода и места, где теряются заявки.
Когда нужен бот на Python, а когда хватит конструктора
Конструктор закрывает MVP за дни. Код оправдан, когда сценарий перерос меню из кнопок, нужны интеграции с CRM и учётной системой, полный контроль над данными или тариф платформы растёт быстрее выручки.
Кофейне с меню и адресом обычно хватает конструктора, разбор есть в статье конструктор чат-бота без кода. Интернет-магазину, которому нужно сверять остатки и статусы заказов, удобнее бот на Python со своей логикой.
Как написать бота на Python для Telegram: пять шагов
- Получите токен. Напишите @BotFather команду
/newbot, задайте имя и адрес. Токен даёт полный контроль над ботом: храните его в переменных окружения, не коммитьте в git и не пересылайте в общий чат. Утёк, перевыпустите через BotFather и замените на сервере. - Выберите библиотеку. Сравнение ниже.
- Опишите сценарий на одной странице. Меню из 3-5 пунктов (вопросы, заявка, контакты), ветка заявки «услуга, город, срок, телефон», сообщение менеджеру и ответ клиенту «приняли, ответим в рабочее время».
- Соберите каркас на polling и проверьте, что заявка доходит до менеджера.
- Перенесите на сервер, включите webhook и алерты. Рекламу подключайте после этого.
Какую библиотеку выбрать: aiogram или python-telegram-bot
| Критерий | python-telegram-bot | aiogram 3.x |
|---|---|---|
| Стиль | зрелая экосистема, много примеров | асинхронный код |
| Диалоги | ConversationHandler | FSM из коробки |
| Фоновые задачи | 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, F | from aiogram.filters import CommandStart | from 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. Ориентиры бюджета есть на странице цены.