Разработка · 6 мин чтения

Создать бота в Телеграме: от BotFather до первого ответа

Создать бота в Телеграме можно за 10-15 минут, если понимать порядок шагов: регистрация через BotFather, получение токена, выбор между polling и webhook, и написание первого обработчика команд. По моей практике большинство проблем возникает не в коде, а на этапе настройки: токен вставляют с лишним пробелом, вебхук ставят на адрес без HTTPS, а после первого теста забывают запустить бота повторно. Дальше прохожу весь путь от диалога с BotFather до рабочего ответа на /start, с кодом на aiogram и разбором, где бота держать после запуска.

Регистрация бота через BotFather

BotFather - официальный бот Telegram для управления другими ботами, никаких сторонних сервисов для регистрации не нужно. Открываю чат с @BotFather, отправляю команду /newbot, дальше он попросит два значения: отображаемое имя бота (можно на русском, можно поменять потом) и username, который обязан заканчиваться на bot или Bot и должен быть уникальным.

После этого BotFather присылает токен вида 123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw. Это единственный ключ доступа к боту: с ним можно отправлять сообщения от его имени, менять настройки и читать обновления. Токен не публикую в открытом репозитории и не вставляю в код напрямую - храню в переменных окружения или отдельном конфиге, исключённом из git.

Из полезных команд BotFather на старте:

  • /setdescription - описание до 512 символов, которое пользователь видит в начале диалога с ботом, в блоке «What can this bot do?»
  • /setabouttext - короткое описание в разделе «О боте»
  • /setuserpic - аватар бота
  • /setcommands - список команд для меню рядом с полем ввода

Если токен скомпрометирован, в том же чате с BotFather есть команда /token, которая генерирует новый токен.

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

У Telegram Bot API два способа получать входящие сообщения. Long polling - бот сам раз в несколько секунд опрашивает метод getUpdates и забирает новые сообщения. Не нужен домен и HTTPS, подходит для разработки и небольших ботов, но требует, чтобы процесс с ботом работал постоянно.

Webhook - Telegram сам присылает POST-запрос с новым сообщением на указанный HTTPS-адрес, как только оно приходит. Регистрируется одним запросом к методу setWebhook:

curl -X POST "https://api.telegram.org/bot<TOKEN>/setWebhook" -d "url=https://example.ru/telegram/webhook.php"

Webhook требует действующего SSL-сертификата на домене (часто он уже включён в тариф хостинга) и обработчика, который отвечает быстро, иначе Telegram повторит доставку. Для простых сценариев вроде ответа на команду или пересылки заявки в CRM webhook на обычном хостинге зачастую проще, чем держать постоянно работающий процесс.

Первый обработчик команды /start на aiogram

Для ботов со сложной логикой (диалоги с состояниями, очереди задач, фоновая работа с внешними API) под Telegram-бота беру Python и библиотеку aiogram - она рассчитана именно на асинхронную обработку сообщений и на практике реже требует костылей, чем более простые обёртки.

Минимальный бот, который отвечает на /start:

from aiogram import Bot, Dispatcher, types
from aiogram.filters import CommandStart
import asyncio

bot = Bot(token="ВАШ_ТОКЕН")
dp = Dispatcher()

@dp.message(CommandStart())
async def start_handler(message: types.Message):
    await message.answer("Привет! Бот на связи.")

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

Это режим polling: скрипт запускается и сам ждёт сообщений. Для перехода на webhook у aiogram есть встроенные хелперы под aiohttp, но тогда понадобится уже постоянно работающий веб-сервер, а не разовый запуск скрипта.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Где размещать бота после запуска

Вариант зависит от того, как бот получает сообщения.

Webhook-бот на PHP - если логика простая (принять сообщение, ответить текстом, записать заявку в базу, дёрнуть CRM), обработчик можно написать на PHP и разместить на обычном хостинге, где уже лежит сайт: отдельный сервер не нужен, HTTPS для основного домена обычно уже настроен. Файл webhook.php получает POST-запрос от Telegram и отвечает:

<?php
$update = json_decode(file_get_contents("php://input"), true);
$chatId = $update["message"]["chat"]["id"] ?? null;
$text = $update["message"]["text"] ?? "";

if ($chatId && $text === "/start") {
    $token = "ВАШ_ТОКЕН";
    file_get_contents("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chatId}&text=" . urlencode("Привет! Бот на связи."));
}

Бот на aiogram с long polling - процесс должен работать постоянно, обычный хостинг для этого не годится, нужен VPS: там ставится systemd-юнит, который перезапускает скрипт после падения и после перезагрузки сервера. Это отдельная строка расходов - аренда сервера ежемесячно, плюс время на обновление зависимостей и продление сертификата, если бот всё же переходит на webhook.

Если бот кроме ответов в чате должен вести диалоги с состояниями, работать с оплатой или синхронизироваться с CRM и складом, обычно закладываю на разработку от 30 000 ₽ - в эту сумму входит логика бота, а не аренда сервера, которая оплачивается отдельно.

Автоматизация без кода: n8n для простых сценариев

Не для каждой задачи нужен код. Если бот должен принять заявку из формы на сайте, отправить уведомление в чат и создать сделку в CRM, такую цепочку можно собрать в n8n - он подключается к Telegram Bot API как к обычному узлу сценария, без написания обработчиков вручную. Держать n8n тоже приходится на своём сервере или у стороннего провайдера - это отдельная статья расходов и обслуживания, но сам сценарий собирается в конструкторе, а не кодом.

Если задача укладывается в приём сообщения, пересылку и простое ветвление по условиям, настройку сценариев в n8n обычно делаю быстрее, чем писать бота с нуля на Python. Как только в сценарии появляются собственные состояния диалога, работа с медиафайлами или очереди сообщений, возвращаюсь к коду - конструктор здесь начинает мешать больше, чем помогать.

Частые ошибки при запуске бота

Токен вставлен с лишним пробелом или кавычками - бот вообще не отвечает, а библиотека иногда даже не показывает внятную ошибку. Проверяю токен прямым запросом: https://api.telegram.org/bot<TOKEN>/getMe должен вернуть JSON с именем бота.

Webhook и polling включены одновременно - Telegram разрешает только один активный способ получения обновлений. Если сначала тестировали через polling, а потом поставили webhook, вызываю метод deleteWebhook перед повторным запуском polling, иначе способы конфликтуют.

Бот не отвечает в группах - по умолчанию у ботов в группах включён privacy mode, и перечень того, что бот видит, закрытый: адресованные ему команды вида /command@this_bot, общие команды вроде /start, но только если бот писал в группу последним, inline-сообщения, отправленные через него, и ответы на сообщения, адресованные боту. Обычного упоминания бота по username в тексте сообщения в этом списке нет. Исключение - бот, добавленный в группу администратором: такой бот получает все сообщения даже с включённым privacy mode. Отключается через BotFather командой /setprivacy, если боту действительно нужно читать все сообщения в чате.

Username бота выбран без учёта поиска - если username слишком общий, пользователи не находят бота через поиск в Telegram. Для рабочих ботов обычно закладываю в username название проекта или компании, а не общее слово.

Условия и возможности Telegram меняются, поэтому перед запуском я уточняю их у самого сервиса.

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

Сколько стоит создать бота в Телеграме?

Регистрация через BotFather бесплатна. Платной может быть только разработка логики, если она сложнее ответа на команду: диалоги с состояниями, интеграция с CRM или оплатой. За такую разработку под ключ обычно беру от 30 000 ₽.

Нужен ли сервер для телеграм-бота?

Зависит от способа получения сообщений. Для polling нужен процесс, работающий постоянно, значит VPS. Для webhook с простой логикой хватит обычного хостинга, на котором уже лежит сайт, если там доступен HTTPS и можно разместить PHP-обработчик.

Можно ли создать бота без программирования?

Простые сценарии вроде приёма заявки и уведомления в чат собираются в n8n без кода. Как только в логике появляются свои состояния диалога или ветвления по данным из внешних систем, конструктора обычно уже не хватает и переходят на код.

Как проверить, что бот работает?

Отправляю боту команду /start в личном чате и смотрю на ответ. Если тишина, проверяю токен запросом к методу getMe, затем смотрю, не включены ли одновременно polling и webhook - это самая частая причина, когда бот вроде есть, но не реагирует.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно