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

На стадии разработки бота на PHP, необязательно иметь хостинг, домен и ssl-сертификат для настройки webHook. Можно настроить съем обновлений с серверов Телеграм через getUpdates. Я для этого функционала использую возможности 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"
  }
}
9 комментариев
Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.

  • Samiels G [3 года назад]

    Здравствуйте. А нельзя ли по подробнее?

    Т.е. ставим 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' ]
    }
  • iMakeBots [3 года назад → Samiels G]

    Не может найти этот модуль request, загрузите его.

  • Samiels G [3 года назад → iMakeBots]

    Вроде загрузился с горем пополам.

    А на счёт обработчика понято верно - указываем файл php, бота, который получает обновления по вебхуку?

  • iMakeBots [1 год назад → Samiels G]

    Да, правильно

  • Samiels G [3 года назад → iMakeBots]

    Спасибо за напутствие! Метод просто обалденный!

  • Sergey Michaylovich [3 года назад]

    Здравствуйте!

    Скажите, пожалуйста телеграф нужно устанавливать на локальной машине по инструкции из timeweb или у них?

    Поясните содержимое приведенных файлов.
    И где они должны находиться?

    Спасибо.

  • iMakeBots [3 года назад → Sergey Michaylovich]

    У меня все настроено на локальной машине

  • Samiels G [3 года назад]

    Здравствуйте.

    Такой вопрос созрел, а можно ли сразу несколько ботов запустить одним файлом:

    let config = {
        "token": "TOKEN_BOT",
        "webhook": "http://localhost/",
        "token1": "TOKEN_BOT1",
        "webhook1": "http://localhost1/"
    }

    вроде этого?

    Спасибо.

  • iMakeBots [3 года назад → Samiels G]

    Думаю что можно.
    Вызывайте сколько необходимо экземпляров бота ... нам расскажите только - получилось или нет ))