
Подробнее о хостинге для размещения Телеграм бота можно узнать из статьи
Совсем не секрет, что у Телеграм API есть не только webHook, как вариант взаимодействия с вашим приложением, но и getUpdates.
В чем между ними разница:
При разработке бота я пользуюсь IDE PHPStorm, настраиваю загрузку на сервер всех изменений при нажатии горячих клавиш. На сервере у меня при этом настроен домен, ssl-сертификат и к боту привязан webHook. Совсем недавно при просмотре одного из вебинаров я увидел, как ведущий запустил бота через getUpdates и в него прилетали "обновления" совсем не хуже, чем через вебхук.
Мне это стало интересно, я попробовал настроить такого бота у себя. Это не составило труда с использованием фреймворка Telegraf.js - буквально несколько строк. Пришла мысль - перенаправить "обновления" на локальный сервер, а там обработать данные PHP скриптом. Изменив немного первоначальный код у меня появился хороший инструмент, которым я теперь пользуюсь. Теперь можно работать на локальном компьютере без необходимости иметь домен, ssl-сертификат и хостинг. Если вы используете хостинг как и я Timeweb, то Node.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(); // запускаем прослушку событий
Если есть необходимость в работе через прокси, то можно этот вариант кода, это на случай если у вас заблокирован Телеграм
// Подключаем необходимые модули
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(); // запускаем прослушку событий
{
"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"
}
}
Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте бот @SiteAuthBot,
нажмите кнопку Старт/Start. Следуйте инструкциям бота.
Т.е. ставим node.js, npm i telegraf и вместо http://localhost указываем адрес файла обработчика, например: http://localhost/bot.php? Вот ещё вопрос - а что это за модуль такой "request"? А то вот что выдаёт...
c:getUpdates>node index
internal/modules/cjs/loader.js:834
throw err;
^
Error: Cannot find module 'request'
Require stack:
- c:getUpdatesindex.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:831:15)
at Function.Module._load (internal/modules/cjs/loader.js:687:27)
at Module.require (internal/modules/cjs/loader.js:903:19)
at require (internal/modules/cjs/helpers.js:74:18)
at Object.<anonymous> (c:getUpdatesindex.js:3:17)
at Module._compile (internal/modules/cjs/loader.js:1015:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10)
at Module.load (internal/modules/cjs/loader.js:879:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js
:60:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [ 'c:\getUpdates\index.js' ]
}