Аудит в подарокАудит сайта в подарокдо 31 декабряПодробнее
Тема
Телеграм-боты
Дата
Спрос на вопрос
1 693 показов в месяц

Как создать телеграм-бота: от идеи до запуска

Как создать бота в телеграм: пустой бот за пять минут через BotFather бесплатно, рабочий - за 1-3 недели. Webhook, хостинг, лимиты API и когда хватит конструктора.

Как создать бота в телеграм: пустой бот заводится за пять минут через @BotFather, и это бесплатно. Вы получаете имя, аватарку, описание и токен - формально бот уже существует и находится в поиске. Бот, который принимает заявки, ведёт диалог, берёт оплату и отдаёт вам админку, это 1-3 недели работы и от 60 000 до 250 000 ₽.

Вся разработка живёт между этими двумя состояниями. Дальше разберу, что даёт BotFather бесплатно, что придётся написать руками, где боту жить и в какой момент честнее взять готовый конструктор вместо разработчика.

Разработка Telegram-ботовот 60 000 до 250 000 ₽сроки: 1-3 недели

Как создать бота в телеграм за пять минут

Открываете чат с @BotFather, отправляете команду /newbot и отвечаете на два вопроса: отображаемое имя и username. Username обязан быть уникальным и заканчиваться на bot. В ответ приходит токен вида 7123456789:AAH… Это ключ ко всему боту: кто держит токен, тот управляет ботом. В репозиторий его класть нельзя, только в переменные окружения, и лучше сразу настроить ротацию через /revoke, если токен где-то засветился.

Там же настраивается всё, что человек видит до первого сообщения:

  • /setuserpic - аватарка;
  • /setdescription - текст и картинка на пустом экране до нажатия кнопки «Начать»;
  • /setabouttext - короткая строка в профиле;
  • /setcommands - список команд, который раскрывается по кнопке «Меню»;
  • /setprivacy - режим приватности в группах;
  • кнопка меню рядом с полем ввода, при необходимости с запуском Mini App.

На этом бесплатная часть заканчивается. У вас есть аккаунт бота, который не умеет ничего: любое сообщение уходит в пустоту, потому что на другом конце нет программы, которая его прочитает.

Что бот не может, даже если очень хочется

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

  • Написать первым тому, кто не начинал диалог. Никакой загрузки клиентской базы по номерам телефонов. Человек обязан сам открыть бота и нажать «Начать» хотя бы раз, и только после этого бот получает право ему писать.
  • Читать чужую переписку в группе. По умолчанию включён privacy mode: бот видит только команды, упоминания и ответы на свои сообщения. Полный доступ появляется, если владелец группы сам отключит приватность или выдаст боту права администратора.
  • Работать без сервера. Bot API это не хостинг, а почтальон. Telegram доставляет сообщения, обрабатывает их ваш код на вашей машине.
  • Получить телефон или почту молча. Номер отдаётся только по нажатию специальной кнопки, и это ровно тот номер, на который зарегистрирован Telegram.
  • Гарантировать доставку. Пользователь может заблокировать бота в любую секунду, и API вернёт 403. Это штатный сценарий, а не сбой: такие чаты помечаются в базе и исключаются из рассылок.

Long polling или webhook

Получать сообщения можно двумя способами, и это первая настоящая техническая развилка.

Long polling. Ваш код сам дёргает метод getUpdates и висит в ожидании ответа. Настраивать нечего: работает с ноутбука, из-за NAT, без домена и сертификата. Отличный способ собрать прототип за вечер и показать заказчику.

Webhook. Вы регистрируете адрес, и Telegram сам присылает на него POST-запрос при каждом обновлении.

Для продакшена нужен webhook. Polling это постоянные исходящие запросы, лишняя задержка и один процесс, который не размножишь: два поллера начнут драться за одни и те же обновления и дублировать ответы. Webhook дешевле по ресурсам, быстрее по отклику и нормально живёт за балансировщиком.

Требования у него жёсткие: только HTTPS, порты 443, 80, 88 или 8443, сертификат валидный (Let’s Encrypt подходит) либо самоподписанный, загруженный вместе с вебхуком. Если сертификат протух, Telegram молча перестаёт доставлять обновления, и бот «пропадает» без единой ошибки в ваших логах. Поэтому автопродление сертификата и алерт на непустое поле last_error_message в getWebhookInfo я ставлю всегда, ещё до первого релиза.

Где живёт бот

Боту нужен процесс, который работает круглосуточно. Вариантов несколько, и цена вопроса меньше, чем принято думать.

ВариантСтоимостьКогда подходит
VPS у российского хостераот 200-400 ₽/месПочти всегда: полный контроль, свои cron-задачи, своя база
Serverless-функцияпо числу вызовов, часто в пределах бесплатного лимитаПростой бот без фоновых задач, готовы терпеть холодный старт
Своя железка в офисе0 ₽ и много нервовНикогда для продакшена: домашний интернет и электричество
Бесплатный тариф PaaS0 ₽Только демо

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

Схема связей

Из чего состоит работающий бот

Слева человек в мессенджере, справа ваши данные. Telegram отвечает только за первые две колонки.

01

Пользователь в Telegram

  • Сообщения и команды /start, текст, файлы
  • Кнопки Инлайн и клавиатура под полем ввода
  • Оплата Счёт открывается прямо в чате
  • Mini App Веб-интерфейс внутри мессенджера
02

Bot API

  • Webhook POST на ваш HTTPS-адрес
  • sendMessage и другие методы Ответы, кнопки, медиа
  • Лимиты Около 30 сообщений в секунду
  • Ретраи Повтор, если вы не ответили 200
03

Ваш сервер

  • Обработчик обновлений Отвечает 200 сразу, работу делает в очереди
  • Машина состояний На каком шаге диалога человек
  • Очередь и воркеры Рассылки, отложенные напоминания
  • Админка Заявки, тексты, статистика
04

Данные и интеграции

  • База Пользователи, заказы, состояния диалога
  • CRM или таблица Куда падает заявка
  • Платёжный провайдер Эквайринг или Telegram Stars
  • Мониторинг Sentry и алерт в отдельный чат

Когда достаточно конструктора

Скажу прямо, потому что это экономит людям деньги. Если задача звучит как «меню из пяти кнопок, текст про услуги, форма из трёх полей и заявка мне в чат» - берите конструктор. Готовые платформы собирают такой сценарий за вечер, стоят порядка тысячи рублей в месяц, и разработчик тут лишний. Я отговариваю от заказной разработки примерно каждого четвёртого, кто пишет про бота.

Конструктор перестаёт справляться, когда появляется хотя бы одно из этого:

  • своя база с историей, поиском и выгрузками, а не список заявок в чате;
  • интеграция с вашей системой: 1С, CRM, складом, внутренним API;
  • приём оплат с логикой возвратов, доступов и сроков подписки;
  • роли и права: менеджеры, контролёры, админы видят разное;
  • нагрузка: тысячи одновременных диалогов и рассылки на десятки тысяч;
  • нестандартные сценарии, которых нет в наборе блоков платформы.

Ещё один момент, который в конструкторах видно не сразу: ваши данные лежат у платформы, а логика существует в её визуальном редакторе. Переехать оттуда почти всегда означает переписать всё с нуля.

Состояние диалога и почему бот дублирует сообщения

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

Вторая типовая беда - дубли. Telegram ждёт от вашего сервера ответ 200 на webhook. Не дождался за таймаут - присылает то же обновление снова. Если код сначала делает всю работу (пишет в базу, дёргает CRM, отвечает пользователю) и только потом отвечает 200, при малейшем замедлении человек получит два одинаковых сообщения, а вы - две одинаковые заявки.

Лечится это одинаково у всех: отвечаем 200 немедленно, работу кладём в очередь, а у каждого обновления берём update_id и запоминаем обработанные. Повторный update_id просто отбрасывается. Та же логика нужна на платежах: подтверждение оплаты может прийти дважды, а доступ выдаём один раз.

Лимиты Bot API

Ограничения не описаны в документации одной строкой, но на практике держатся такие: примерно 30 сообщений в секунду суммарно и около 20 сообщений в минуту в одну группу. Персональные диалоги ограничены мягче, но упереться в потолок легко.

Считаем рассылку на 10 000 подписчиков. При 25 сообщениях в секунду это 400 секунд, почти семь минут, и то при условии, что ни одна отправка не упала. Часть чатов вернёт 403 (бота заблокировали), часть 429 с полем retry_after - его надо уважать, иначе окно блокировки растёт. Поэтому рассылка это отдельный сервис с очередью, ограничителем скорости, повторными попытками и отчётом «доставлено, заблокировано, ошибок». В боте, который «просто отправляет всем в цикле», рассылка на десять тысяч человек ложится с ошибками где-то на второй тысяче.

Чек-лист перед запуском

  • Токен в переменных окружения, не в репозитории.
  • Webhook на HTTPS, сертификат с автопродлением, алерт на ошибки доставки.
  • Ответ 200 сразу, обработка в очереди, защита от повторного update_id.
  • Состояние диалога в базе, а не в памяти процесса.
  • Обработаны 403 и 429, заблокировавшие помечены.
  • Команды, описание, аватарка и текст на пустом экране заполнены.
  • Логи и мониторинг с уведомлением в отдельный чат.
  • Сценарий «бот не понял»: понятный ответ и переход на живого человека.
  • Тексты про обработку персональных данных, если собираете телефон.

Если по этому списку у вас всё зелёное, бота можно показывать людям. Если задача сложнее меню и формы, я собираю такого бота за 1-3 недели, вилка и состав работ описаны на странице про разработку телеграм-ботов. Прототип на long polling обычно показываю на третий-четвёртый день, чтобы сценарий можно было поправить до того, как он оброс интеграциями.

Посчитаем вашу задачу

Расскажите, что нужно. Отвечу в течение рабочего дня: сроки, вилка бюджета и что можно не делать, чтобы сэкономить.

Обсудить задачу
Обсудить задачу

Перезвоню сам

Оставьте имя и номер. Позвоню в рабочее время, обычно в течение пары часов.