2.19.8. Приклад розміщення на хостингу Telegram-бота на PHP

Увага!

Бот може надсилати повідомлення тільки тим користувачам, які надіслали йому будь-яке повідомлення, не зупиняли його і не блокували.

Для роботи з Telegram-ботом рекомендується використовувати Webhook. Такий метод кращий, ніж Long Polling, з кількох причин:

  • Скрипт, який запускається за допомогою Webhook, працює дещо швидше за скрипт, який оновлює інформацію з певним інтервалом.
  • На віртуальному та бізнес-хостингу є обмеження на час виконання процесу, через що скрипт не може бути запущеним постійно й автоматично завершується системою. Це обмеження не можна обійти, тому використання скрипта, що постійно працює, може призвести до втрати даних, якщо під час обробки будь-якої події відбудеться завершення роботи цього скрипта.
  1. Ініціалізуйте створення нового бота — надішліть Telegram-боту @BotFather повідомлення /newbot.
  2. Бот запросить назву нового бота — надішліть повідомлення, яке буде прийняте як назва бота.
  3. Надішліть повідомлення з ім'ям бота. Ім'я відрізняється від назви тим, що є унікальним ідентифікатором, за допомогою якого можна використовувати запрошення, створювати посилання на нього тощо. У кінці імені обов'язково має бути слово bot (наприклад, examplebot або example_bot).
  4. У новому повідомленні буде вказаний токен, який потрібно буде використовувати для роботи бота. Збережіть цей токен.

Увага!

Для роботи Webhook на сайті обов'язково має використовуватися валідний SSL-сертифікат (наприклад, сертифікат від Let's Ecnrypt).

Встановити Webhook можна кількома способами:

Перейдіть за посиланням виду:
https://api.telegram.org/bottoken/setWebhook?url=https://domain.com/path/to/file.php

У посиланні використовуйте свої дані:

  • token — токен, який ви отримали під час створення бота. ⚠️ Слово bot змінювати перед token не потрібно.
  • domain.com — ваш домен, який Telegram використовуватиме для надсилання запитів вашому боту. Не рекомендується вказувати адресу з www або без www у разі, якщо встановлено редирект на зворотну адресу.
  • path/to/file.php — шлях до файлу бота, який оброблятиме запити.

Після переходу за посиланням у браузері має з'явитися повідомлення виду «Webhook was set». Якщо таке повідомлення з'явилося, то Webhook встановлений коректно, в іншому разі перевірте URL-адресу, що використовується, і роботу SSL-сертифіката.

Увага!

У скрипті обов'язково має бути умова, яка обмежує кількість запусків для встановлення та перевірки Webhook, оскільки часте звернення до Telegram видаватиме помилку і припинятиме роботу скрипта.

Додайте на початку вашого скрипта (після оголошення змінних із даними токена та імені бота) такий код:

if(!json_decode(file_get_contents("https://api.telegram.org/name:token/setWebhook?url=https://domain.com/path/to/file.php"))->ok){die('webhook is not set');}
Приклад простого бота, який відповідатиме на повідомлення /start:
<?php
define('token','XXXXXXXXXXXXXXXXXXXXXXXXX'); // замість ''XXXXXXXXXXXXXXXXXXXXXXXXX'' вкажіть ваш токен
$result = json_decode(file_get_contents('php://input'), true); // передаємо у змінну $result повну інформацію про повідомлення користувача
if ($result['message']['text'] == '/start') {
    file_get_contents("https://api.telegram.org/bot" . token . "/sendMessage?chat_id=" . $result['message']['chat']['id'] . "&text=" . urlencode('Hi')); // надсилаємо відповідь користувачу, використовуючи його унікальний ідентифікатор $result['message']['chat']['id'] в якості одержувача
}

Увага!

Для роботи бібліотеки Telegram Bot SDK необхідно змінити версію PHP на 8.0 або вище.
  1. Підключіться до хостингу по SSH.
  2. Перейдіть у каталог вашого сайту:
    cd ~/example.com/www
  3. Встановіть бібліотеку Telegram Bot SDK:
    composer require irazasyed/telegram-bot-sdk
  4. Створіть файл і помістіть у нього приклад найпростішого бота з використанням бібліотеки Telegram Bot SDK:
    <?php
    include('vendor/autoload.php'); // підключаємо бібліотеку
    use Telegram\Bot\Api; 
    
    $telegram = new Api('XXXXXXXXXXXXXXXXXXXXXXXXX'); // замість ''XXXXXXXXXXXXXXXXXXXXXXXXX'' вкажіть ваш токен
    $result = $telegram -> getWebhookUpdates(); // передаємо у змінну $result повну інформацію про повідомлення користувача
    
    $text = $result["message"]["text"]; // текст повідомлення
    $chat_id = $result["message"]["chat"]["id"]; // унікальний ідентифікатор користувача
    $name = $result["message"]["from"]["username"]; // ім'я користувача
    
    if ($text) {
        if ($text == "/start") {
            $reply = "Hi!";
            $telegram->sendMessage(['chat_id' => $chat_id, 'text' => $reply]);
        }
    }
Зміст

    (5)