Telegram бот на PHP #7: создание PHP класса для отправки запросов в Телеграм — PROG-TIME

Telegram бот на PHP #7: создание PHP класса для отправки запросов в Телеграм

01.08.2022
Содержание:

В новом уроке, я покажу вам пример класса для отправки запросов в Telegram. Мы разработаем с вами удобный класс, который легко расширять, и который ускорит создание ваших ботов в несколько раз.

Для начала давайте создадим класс и назовём его BotsTimeTelegram. Данный класс будет иметь свойство для записи токена, метод для создания запросов в Телеграмм, метод для логирования ошибок и 2 свойства для записи id чата для логирования и путь до файла с лог данными.

Класс получился небольшой, в дальнейшем мы будем его дописывать. Сейчас из функционала здесь есть метод для отправки запросов в Telegram пользователя (sendQueryTelegram) и метод для отправки запросов в чат с логами (sendLogTelegram).

При возникновение ошибки запроса будет выпадать исключение, которое в дальнейшем мы будет отправлять в чат администратора, в виде в лог файла.

class BotsTimeTelegram {
    private $token = "";

    private $chatLogQuery = 1424646511;
    private $logFilePath = __DIR__ . "/file_log.txt";

    public function __construct($token) {
	$this->token = $token;
    }

    /* ЛОГИРОВАНИЕ ДАННЫХ И ОТПРАВКА В TELEGRAM */
    public function sendLogTelegram($logData, $reasonLog = false) {
        file_put_contents($this->logFilePath, $logData);
        $textMessage = date("d.m.Y H:i") . " Логирование данных";

        if($reasonLog) {
            $textMessage .= "\n" . "Причина: " . $reasonLog;
        }

        $arrQuery = [
            "chat_id" 	=> $this->chatLogQuery,
            "caption" 	=> $textMessage,
            "document" 	=> new CURLFile($this->logFilePath)
        ];

        $this->sendQueryTelegram("sendDocument", $arrQuery);

        unlink($this->logFilePath);
    }
    /* ================================== */


    /* ПАРСЕР ДЛЯ ОТПРАВКИ ЗАПРОСОВ */
    public function sendQueryTelegram($method, $arrayQuery = "", $resultJSON = false) {
        $ch = curl_init("https://api.telegram.org/bot{$this->token}/{$method}");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $result = curl_exec($ch);
        curl_close($ch);

        if(!isset($result)){
            throw new Exception(curl_error($curl));
        }

        if(isset($arrResult["ok"]) && $arrResult["ok"] == false) {

            $arrResult = json_decode($result, true);
            $arrDataLog = [
                "method" => $method,
                "arrayQuery" => $arrayQuery,
                "arrResult" => $arrResult
            ];

            $arrDataLogJSON = json_encode($arrDataLog);
            throw new Exception($arrDataLogJSON);
        }

        if($resultJSON == true) {
            return $result;
        } else {
            return json_decode($result, true);
	    }

    }
    /* ================================== */

}

Для работы нашего скрипта пропишем ниже код для запуска. В конструкции try мы прописываем код для работы бота, в catch, прописываем отправку данных на в лог чат в случае возникновения ошибок отправки или ошибок в передаче параметров запроса.

try {
    $bot = new BotsTimeTelegram("5340791844:AAGfL08SNlf5QQsr1kbDoWJ9U65Brr8Kyko");

    $arrayQuery = array(
	'chat_id' => 1424646511,
	'text'	=> "Тестовое сообщение",
	'parse_mode' => "html",
    );
    $resultQuery = $bot->sendQueryTelegram("sendMessage", $arrayQuery);

} catch (Exception $e) {
    $errorMessage = $e->getMessage();
    $bot->sendLogTelegram($errorMessage);
}

Таким образом за 7 уроков мы с вами научись разрабатывать бота для Telegram с базовым функционалом. Спасибо большое за то что просмотрели все материалы до конца. В дальнейших уроках я постараюсь продолжить развивать данную тему. Если вам понравилась данная рубрика, прошу поддержать меня лайком и подпиской, а так же добавить небольшой комментарий с просьбами или замечаниями к материалу. Я стараюсь отвечать на каждый комментарий, когда есть свободное время, и каждое ваше сообщение помогает улучшить будущие уроки.

Материалы курса