Вы когда-нибудь пытались запустить Telegram-бота, а он просто не реагировал на сообщения? Часто причина - неправильно настроенный вебхук. Многие руководства говорят: "просто укажи URL", но не объясняют, как сделать это надежно, особенно если вы не используете дорогой VPS. В этом руководстве вы узнаете, как настроить вебхук для Telegram-бота через Cloudflare Workers и Vercel - бесплатно, быстро и без постоянного обслуживания.
Почему вебхуки важны для Telegram-ботов
Telegram-боты работают двумя способами: через long polling и через вебхуки. Long polling - это когда бот постоянно спрашивает сервер Telegram: "Есть новые сообщения?". Это просто, но неэффективно: вы тратите ресурсы, даже когда ничего не происходит. Вебхук - это обратное: Telegram сам отправляет вам сообщение, как только кто-то пишет боту. Это экономит время, снижает нагрузку и делает бота мгновенно отзывчивым.
Но чтобы вебхук заработал, вам нужен публичный HTTPS-адрес. Домен? Сервер? SSL-сертификат? Традиционно это требует аренды VPS, настройки Nginx, Let’s Encrypt и т. д. Для простого бота - перебор. Cloudflare Workers и Vercel решают это проще: вы пишете код, загружаете его - и всё работает. Без серверов. Без настройки. Без оплаты.
Что такое Cloudflare Workers и Vercel
Cloudflare Workers - это серверless-среда от Cloudflare. Вы пишете JavaScript или TypeScript, и он запускается на 275+ точках по всему миру. Всё это защищено HTTPS, и вы получаете бесплатный поддомен вроде your-bot.yourname.workers.dev. Vercel - то же самое, но больше ориентирован на фронтенд-разработчиков. Он тоже предлагает бесплатные серверless-функции с HTTPS и глобальным CDN.
Оба сервиса позволяют развернуть вебхук за минуту. Оба поддерживают Node.js. Оба бесплатны для небольших проектов. Оба не требуют ни одной строки конфигурации сервера.
Как настроить вебхук через Cloudflare Workers
Начнём с Cloudflare Workers - самый простой способ для новичков.
- Зарегистрируйтесь на dash.cloudflare.com (если ещё не зарегистрированы).
- Перейдите в раздел Workers & Pages → Создать приложение → Выберите "Запуск из шаблона" → Выберите "Hello World".
- Замените содержимое файла
index.jsна этот код:
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname === '/webhook') {
if (request.method === 'POST') {
const body = await request.json();
// Логируем полученные данные (можно удалить позже)
console.log('Получено сообщение:', body);
// Отвечаем Telegram, что всё ок
return new Response('OK', { status: 200 });
}
}
return new Response('Hello World', { status: 200 });
}
};
- Нажмите "Сохранить и развернуть". Система создаст вам URL вроде
https://your-bot.yourname.workers.dev. - Скопируйте адрес:
https://your-bot.yourname.workers.dev/webhook.
Теперь настройте вебхук в Telegram. Зайдите в браузер и откройте:
https://api.telegram.org/bot<ВАШ_ТОКЕН>/setWebhook?url=https://your-bot.yourname.workers.dev/webhook
Замените <ВАШ_ТОКЕН> на токен вашего бота (получите его от @BotFather). Если всё сделано правильно, вы увидите:
{"ok":true,"result":true,"description":"Webhook was set"}
Готово. Ваш бот теперь получает сообщения через вебхук. Попробуйте написать ему - он должен ответить в логах Cloudflare (вкладка "Logs" в интерфейсе Workers).
Как настроить вебхук через Vercel
Vercel подходит, если вы уже используете Next.js или хотите более гибкую структуру. Процесс почти такой же.
- Создайте папку проекта:
mkdir telegram-bot-vercel - Создайте файл
api/webhook/route.js(если используете Next.js 13+):
import { NextResponse } from 'next/server';
export async function POST(request) {
const body = await request.json();
// Логируем входящее сообщение
console.log('Сообщение от Telegram:', body);
// Отвечаем Telegram
return NextResponse.json({ ok: true });
}
- Зарегистрируйтесь на vercel.com и подключите этот проект через GitHub или GitLab.
- После деплоя Vercel выдаст вам URL вроде
https://your-bot.vercel.app/api/webhook. - Настройте вебхук через тот же URL в Telegram:
https://api.telegram.org/bot<ВАШ_ТОКЕН>/setWebhook?url=https://your-bot.vercel.app/api/webhook
Проверьте логи в Vercel (вкладка "Deployments" → "Logs") - вы увидите, когда бот получает сообщения.
Чем Cloudflare Workers лучше Vercel для Telegram-ботов
Оба сервиса работают. Но есть нюансы:
| Критерий | Cloudflare Workers | Vercel |
|---|---|---|
| Скорость запуска | Мгновенно - без репозитория | Требуется Git-репозиторий |
| Простота | Простой интерфейс, только код | Требует структуры проекта |
| Логи | Встроенные, доступны сразу | Требуют входа в интерфейс |
| Цена | Бесплатно до 100 000 запросов/день | Бесплатно до 100 000 запросов/день |
| Поддержка TypeScript | Да, без дополнительной настройки | Да, но требует конфигурации |
| Глобальное развертывание | Автоматически на 275+ точках | На 10+ точках |
Для Telegram-ботов, особенно если вы просто начинаете, Cloudflare Workers - лучший выбор. Нет необходимости тянуть Git, настраивать Next.js или понимать, где лежит файл route.js. Просто вставьте код - и всё работает.
Как добавить обработку сообщений
Теперь, когда вебхук работает, пора научить бота отвечать. Добавим простую логику: бот отвечает "Привет!" на команду /start.
Обновим код в Cloudflare Workers:
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname === '/webhook') {
if (request.method === 'POST') {
const body = await request.json();
// Проверяем, есть ли сообщение
if (body.message && body.message.text) {
const chatId = body.message.chat.id;
const text = body.message.text;
if (text === '/start') {
// Отправляем ответ
await fetch(`https://api.telegram.org/bot${env.TELEGRAM_TOKEN}/sendMessage`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
chat_id: chatId,
text: 'Привет! Я живой бот. Используй /help'
})
});
}
}
return new Response('OK', { status: 200 });
}
}
return new Response('Hello World', { status: 200 });
}
};
Теперь добавим токен в переменные окружения:
- В Cloudflare Workers перейдите в "Settings" → "Variables".
- Добавьте переменную
TELEGRAM_TOKENсо значением вашего токена бота. - Сохраните и повторно разверните.
Теперь, когда вы пишете /start - бот отвечает. Это работает без базы данных, без внешних сервисов. Просто код + токен.
Что делать, если вебхук не работает
Если Telegram не отправляет сообщения, проверьте по шагам:
- HTTPS? - URL должен начинаться с
https://. HTTP не работает. - Правильный путь? - Убедитесь, что в
setWebhookвы указали полный путь:/webhook, а не просто домен. - Токен верный? - Проверьте токен через
https://api.telegram.org/bot<ТОКЕН>/getMe. Должен вернуть имя бота. - Логи? - Зайдите в логи Cloudflare или Vercel. Если там нет запросов - Telegram не доносит сообщения. Значит, проблема в URL или SSL.
- Сервер упал? - Если вы получаете ошибку 500 - проверьте код на синтаксические ошибки. Один лишний символ - и всё ломается.
Также Telegram может отключить вебхук, если сервер отвечает с ошибкой 5xx больше 10 раз подряд. Поэтому всегда возвращайте 200 OK, даже если ваш код внутри упал. Логи - ваш друг.
Что дальше: расширяем бота
Теперь, когда у вас есть надёжный вебхук, вы можете:
- Добавить базу данных через D1 (от Cloudflare) - хранить настройки пользователей.
- Интегрировать с Google Sheets - бот будет записывать заявки.
- Сделать бота для уведомлений - например, отслеживать цены на криптовалюту и присылать уведомления.
- Подключить голосовые команды через Whisper API.
Всё это можно делать без аренды сервера. Всё - в облаке. Всё - бесплатно. И всё - работает 24/7.
Чем не стоит пользоваться
Не используйте бесплатные хостинги вроде Glitch, Replit или Heroku для продакшн-ботов. Они спят, перезагружаются, и вебхуки теряются. Telegram не ждёт - он отправляет сообщение один раз. Если сервер не ответил - сообщение пропадает.
Cloudflare Workers и Vercel не спят. Они не перезагружаются. Они всегда онлайн. Это единственное бесплатное решение, которое реально работает для Telegram-ботов в реальном мире.
Можно ли использовать Cloudflare Workers без аккаунта?
Нет. Для развертывания вебхука через Cloudflare Workers нужен аккаунт. Но он бесплатный - достаточно указать email и подтвердить его. Никаких платежных данных не требуется.
Какой трафик поддерживает бесплатный тариф?
Cloudflare Workers и Vercel предлагают до 100 000 запросов в день бесплатно. Для Telegram-бота с 500 активными пользователями, которые пишут по 5 сообщений в день - это 2500 запросов. То есть вы можете запустить до 40 таких ботов на одном аккаунте без риска превысить лимит.
Что делать, если Telegram не принимает вебхук?
Проверьте URL: он должен быть полным, с /webhook на конце. Убедитесь, что сайт доступен через HTTPS. Проверьте логи Cloudflare или Vercel - если там нет запросов от Telegram, значит, проблема в адресе или SSL. Попробуйте открыть URL в браузере - он должен отвечать 200 OK. Если вы видите ошибку 404 - путь неверный. Если 500 - ошибка в коде.
Можно ли использовать Python вместо JavaScript?
Нет. Cloudflare Workers и Vercel Serverless Functions поддерживают только JavaScript/TypeScript. Если вам нужен Python - используйте VPS с Flask или Django. Но тогда вы теряете преимущества бесплатного, бесперебойного хостинга.
Как проверить, что вебхук активен?
Отправьте запрос: https://api.telegram.org/bot<ТОКЕН>/getWebhookInfo. В ответе вы увидите URL, последнюю ошибку и количество отправленных сообщений. Если "last_error_date" - это несколько часов назад, и "last_error_message" пусто - всё работает.