Telegram бот, отправляющий сообщения в блок Webasyst

15 декабря 2020

Telegram бот, отправляющий сообщения в блок Webasyst можно сделать так

Предполагаю, что блок, куда публиковать сообщения из бота, у вас уже создан. Делается это в админке Webasyst, Сайт/блоки.

Нужно создать бота телеграм. Делается это у бота @BotFather (найдите его в поиске телеграм)

Отправить в диалог с @BotFather команду /newbot или выбрать ее из представленного списка.

Ввести название и юзернейм будущего бота. Чтобы ботом не смогли воспользоваться посторонние, рекомендую сгенерировать случайное значение для названия и юзернейма. Например название mbqe21jfxe0b, а юзернейм mbqe21jfxe0b_bot

При создании вам пришлют сообщение, в котором будет указан API ключ для вашего бота. Этот ключ пригодится, сохраните его.

На хостинге своего сайта размещаем файл бота (например tgbot.php) с таким содержанием

<?php
    // Соединямся с БД (хост, юзер, пароль, база)
    $link=mysqli_connect("localhost", "имя_пользователя_бд", "пароль_бд", "название_бд");
    $data = file_get_contents('php://input');
    $data = json_decode($data, true);
    if (empty($data['message']['chat']['id'])) {
        exit();
    }
    define('TOKEN', 'сюда_вставить_полученный_API_ключ');
    // Функция вызова методов API.
    function sendTelegram($method, $response)
    {
        $ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);  
        curl_setopt($ch, CURLOPT_POST, 1);  
        curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $res = curl_exec($ch);
        curl_close($ch);
        return $res;
        
    }
    // Ответ на текстовые сообщения.
    if (!empty($data['message']['text'])) {
        $text = $data['message']['text'];
        
        if (mb_stripos($text, '/start') !== false) {
            sendTelegram(
            'sendMessage', 
            array(
            'chat_id' =----> $data['message']['chat']['id'],
            'text' => 'Введите сообщение для отправки в блок сайта'
            )
            );
            exit();
        } 
        
        if (mb_stripos($text, '') == false) {
        
            //Если это запрос на обновление, то обновляем
            $sql = mysqli_query($link, "UPDATE `site_block` SET `content` = '{$text}' WHERE `id` = 'введите_id_блока'");
        
            sendTelegram(
            'sendMessage', 
            array(
            'chat_id' => $data['message']['chat']['id'],
            'text' => 'Успешно!'
            )
            );
            exit();
        } 
        
    }

Разумеется в 

$link=mysqli_connect("localhost", "имя_пользователя_бд", "пароль_бд", "название_бд");

define('TOKEN', 'сюда_вставить_полученный_API_ключ');

$sql = mysqli_query($link, "UPDATE `site_block` SET `content` = '{$text}' WHERE `id` = 'введите_id_блока'");

укажите свои значения

Все, осталось заявить телеграм о вашем боте с помощью webhook. Для этого перейдите по адресу https://api.telegram.org/botзначение_вашего_api_токена/setWebhook?url=https://полный_путь к вашему файлу/tgbot.php

Разумеется значение_вашего_api_токена и полный_путь к вашему файлу пропишите свои

Если все указали правильно, то при переходе по адресу получите сообщение

{"ok":true,"result":true,"description":"Webhook was set"}

Готово.

Стоит отметить некоторые ограничения. Для работы этой штуковины сайт должен иметь ssl сертификат (открываться по https://) и расположен на собственном хостинге (на облаке Webasyst нет доступа к базе данных)

P.S. Если бот будет постоянно отправлять цикличные сообщения - добавьте в самом начале файла tgbot.php код

set_time_limit(0);
    ignore_user_abort(true);
    $out =  json_encode([
      'method'=>'sendMessage',
      'chat_id'=>$my_chat_id,
      'text'=> "Starting process..."
      ]);   
    echo $out;
    header('Connection: close');
    header('Content-Length: '.strlen($out));
    header("Content-type:application/json");
    flush();
    if (function_exists('fastcgi_finish_request')) {
        fastcgi_finish_request();
    }