Как создать и отладить Telegram-бота локально с помощью TunnelHunt
Telegram-боты — невероятно популярный инструмент для автоматизации, уведомлений и создания интерактивных сервисов. Но при их разработке возникает классическая проблема: чтобы получать сообщения от пользователей, бот должен иметь публичный HTTPS-адрес (вебхук), на который серверы Telegram будут отправлять обновления.
Как же вести разработку на своем уютном localhost
? Постоянно разворачивать код на сервер ради каждой правки — долго и неэффективно. Решение есть, и оно не требует ничего, кроме вашего терминала.
Проблема: Telegram не видит ваш localhost
Когда вы запускаете код бота, он обычно слушает локальный порт, например, 3000
. Этот адрес доступен только вам. Если вы попытаетесь указать http://localhost:3000
в качестве вебхука для Telegram, его серверы просто не смогут отправить туда данные.
Решение: Создаем мост с TunnelHunt
TunnelHunt мгновенно создает безопасный публичный URL, который перенаправляет все запросы на ваш локальный порт. Давайте посмотрим, как это работает.
Шаг 1: Создаем бота и получаем токен
Если у вас еще нет бота, создайте его через официального @BotFather
в Telegram, следуя его инструкциям. В конце вы получите токен — уникальный ключ для доступа к API вашего бота. Сохраните его.
Шаг 2: Пишем простой код для бота
Создадим простой эхо-бот на Node.js и Express. Он будет слушать входящие запросы и отвечать пользователю его же сообщением.
// bot.js
const express = require('express');
const axios = require('axios'); // Для отправки ответов в Telegram API
const app = express();
app.use(express.json()); // Парсим входящие JSON-данные
const BOT_TOKEN = 'ВАШ_СЕКРЕТНЫЙ_ТОКЕН_ЗДЕСЬ';
const API_URL = `https://api.telegram.org/bot${BOT_TOKEN}`;
const PORT = 3000;
// Наш обработчик вебхуков
app.post('/webhook', async (req, res) => {
console.log('Получено обновление:', req.body);
const message = req.body.message;
if (message && message.text) {
const chatId = message.chat.id;
const text = message.text;
// Отправляем ответное сообщение через Telegram API
await axios.post(`${API_URL}/sendMessage`, {
chat_id: chatId,
text: `Вы написали: "${text}"`,
});
}
// Отвечаем Telegram, что все в порядке
res.sendStatus(200);
});
app.listen(PORT, () => {
console.log(`Бот слушает порт ${PORT}`);
});
Запустите его локально: node bot.js
.
Шаг 3: Запускаем TunnelHunt
В новом окне терминала выполните команду, чтобы ваш локальный порт 3000
стал доступен извне:
ssh -R 80:localhost:3000 -p 2222 nokey@tunnelhunt.ru
Сервис выдаст вам ваш публичный HTTPS-адрес, например: https://pretty-horse-789.tunnelhunt.ru
.
Совет: На тарифе Pro вы можете зарезервировать постоянный адрес, например,
my-tg-bot.tunnelhunt.ru
, чтобы не менять его в настройках Telegram при каждом запуске.
Шаг 4: Регистрируем вебхук в Telegram
Теперь нужно сообщить Telegram, куда отправлять обновления. Это делается одним API-запросом. Вы можете просто вставить следующий URL в адресную строку браузера, подставив свои данные:
https://api.telegram.org/bot<ВАШ_ТОКЕН>/setWebhook?url=<ВАШ_URL_ОТ_TUNNELHUNT>/webhook
Пример:
https://api.telegram.org/bot12345:ABC-DEF/setWebhook?url=https://pretty-horse-789.tunnelhunt.ru/webhook
После перехода по ссылке вы должны увидеть ответ: {"ok":true,"result":true,"description":"Webhook was set"}
.
Шаг 5: Тестируем!
Откройте Telegram, найдите своего бота и отправьте ему сообщение. Вы должны мгновенно получить ответ! При этом в консоли, где запущен ваш bot.js
, вы увидите лог входящего запроса.
Теперь вы можете вносить изменения в код бота, перезапускать его локально и сразу же тестировать, не тратя ни секунды на деплой. Отладка и разработка становятся в разы быстрее и удобнее.