Создать бота в Телеграме можно за 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 - это самая частая причина, когда бот вроде есть, но не реагирует.