PHP-bot на localhost: node.js в помощь

Совсем не секрет, что у Телеграм API есть не только webHook, как вариант взаимодействия с вашим приложением, но и getUpdates.

В чем между ними разница: 

  1. webHook - это адрес, по которому расположена точка входа вашего приложения, именно на него будет отправлено "обновление" (данные в формате JSON) при любом взаимодействии с вашим ботом.
  2. 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"
  }
}

 


Комментарии

Авторизуйтесь через 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' ]
    }
    Samiels G 08.10.2020 в 13:42
    • Не может найти этот модуль, загрузите его.
      iMakeBots 08.10.2020 в 13:56
  • c:getUpdates>npm i request
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://git
    hub.com/request/request/issues/3142
    npm WARN deprecated har-validator@5.1.5: this library is no longer supported
    Завершить выполнение пакетного файла [Y(да)/N(нет)]? y

    c:getUpdates>npm i request
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://git
    hub.com/request/request/issues/3142
    npm WARN deprecated har-validator@5.1.5: this library is no longer supported
    npm WARN getupdates@1.0.0 No description
    npm WARN getupdates@1.0.0 No repository field.

    request@2.88.2
    added 47 packages from 58 contributors and audited 55 packages in 139.933s

    2 packages are looking for funding
    run 'npm fund' for details

    found 0 vulnerabilities
    Samiels G 08.10.2020 в 13:56
  • Вроде загрузился с горем пополам. А на счёт обработчика понято верно - указываем файл php, бота, который получает обновления по вебхуку?
    Samiels G 08.10.2020 в 14:06
  • Спасибо за напутствие! Метод просто обалденный!
    Samiels G 08.10.2020 в 22:31