Совсем не секрет, что у Телеграм API есть не только webHook
, как вариант взаимодействия с вашим приложением, но и getUpdates
.
В чем между ними разница:
- webHook - это адрес, по которому расположена точка входа вашего приложения, именно на него будет отправлено "обновление" (данные в формате JSON) при любом взаимодействии с вашим ботом.
- getUpdates - это метод Телеграм API, при вызове которого вам будут выданы накопленные на серверах Телеграм "обновления" вашего бота.
При разработке бота я пользуюсь IDE PHPStorm, настраиваю загрузку на сервер всех изменений при нажатии горячих клавиш. На сервере у меня при этом настроен домен, ssl-сертификат и к боту привязан webHook. Совсем недавно при просмотре одного из вебинаров я увидел, как ведущий запустил бота через getUpdates и в него прилетали "обновления" совсем не хуже, чем через вебхук.
Мне это стало интересно, я попробовал настроить такого бота у себя. Это не составило труда с использованием фреймворка Telegraf.js - буквально несколько строк. Пришла мысль - перенаправить "обновления" на локальный сервер, а там обработать данные PHP скриптом. Изменив немного первоначальный код у меня появился хороший инструмент, которым я теперь пользуюсь. Теперь можно работать на локальном компьютере без необходимости иметь домен, ssl-сертификат и хостинг. Если вы используете хостинг как и я Timeweb, то Node.js можно настроить по инструкции.
* * *
index.js
// Подключаем необходимые модули
const Telegraf = require('telegraf');
const request = require('request');
// Заполняем конфиг
let config = {
"token": "TOKEN_BOT",
"webhook": "http://localhost/",
"method": "POST",
"headers": {"content-type": "application/json"}
};
// Создаем объект бота
const bot = new Telegraf(config.token)
.use((ctx) => { // вешаем прослушку
// при событии отправляем обновление на наш обработчик
request({
url: config.webhook,
method: config.method,
headers: config.headers,
json: ctx.update
});
}).launch(); // запускаем прослушку событий
* * *
index.js с настройками proxy
Если есть необходимость в работе через прокси, то можно этот вариант кода, это на случай если у вас заблокирован Телеграм
// Подключаем необходимые модули
const Telegraf = require('telegraf');
const HttpsProxyAgent = require('https-proxy-agent');
const request = require('request');
// Заполняем конфиг
let config = {
"token": "TOKEN_BOT",
"webhook": "http://localhost/",
"method": "POST",
"headers": {"content-type": "application/json"},
"proxy_user": "login",
"proxy_pass": "password",
"proxy_protokol": "http",
"proxy_host": "0.0.0.0",
"proxy_port": "1000",
};
// Создаем объект бота
const bot = new Telegraf(config.token, {
telegram: {
agent: new HttpsProxyAgent(
config.proxy_protokol+'://'+
config.proxy_user+':'+
config.proxy_pass+'@'+
config.proxy_host+':'+
config.proxy_port)
}
}
).use((ctx) => { // вешаем прослушку
// при событии отправляем обновление на наш обработчик
request({
url: config.webhook,
method: config.method,
headers: config.headers,
json: ctx.update
});
}).launch(); // запускаем прослушку событий
* * *
package.json
{
"name": "getUpdates",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "iMakeBots.ru",
"license": "",
"dependencies": {
"https-proxy-agent": "^2.2.1",
"request": "^2.88.0",
"telegraf": "^3.26.0"
}
}
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.
Здравствуйте. А нельзя ли по подробнее?
Т.е. ставим node.js, npm i telegraf и вместо http://localhost указываем адрес файла обработчика, например: http://localhost/bot.php?
Вот ещё вопрос - а что это за модуль такой "request"?
А то вот что выдаёт...
Не может найти этот модуль request, загрузите его.
Вроде загрузился с горем пополам.
А на счёт обработчика понято верно - указываем файл php, бота, который получает обновления по вебхуку?
Да, правильно
Спасибо за напутствие! Метод просто обалденный!
Здравствуйте!
Скажите, пожалуйста телеграф нужно устанавливать на локальной машине по инструкции из timeweb или у них?
Поясните содержимое приведенных файлов.
И где они должны находиться?
Спасибо.
У меня все настроено на локальной машине
Здравствуйте.
Такой вопрос созрел, а можно ли сразу несколько ботов запустить одним файлом:
вроде этого?
Спасибо.
Думаю что можно.
Вызывайте сколько необходимо экземпляров бота ... нам расскажите только - получилось или нет ))
Отличная статья. Надоело постоянно разработку вести на сервере, решил локально. И столкнулся с проблемой вебхуков.
Ваша статья помогла мне решить проблему. Я сделал мульти запуск ботов, имитировал тот же подход, как у телеграм.
Всё работает хорошо. Но никак не получается остановить ботов. Как работает команда Telegraf.stop()?
Как правильно её вызывать то?
И ещё, подскажите, что за редактор тут в комментариях? Хочу себе такой-же на проект vue3?! 🙂️
Ещё вопрос, launch() все апдейты получает или нет? Или нужно прописать нужные... Нигде нормальной нет информации по telegraf.
Update: Уже разобрался 🙂