Telegram бот на Laravel #5: контроллеры для работы с запросами — PROG-TIME

Telegram бот на Laravel #5: контроллеры для работы с запросами

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

В новом уроке мы с вами создадим базовые контроллеры для работы с ботом. Данную структуру я использую во многих своих проектах связанных с ботами.

Перед созданием контроллеров вам необходимо указать 2 переменные в env.

TELEGRAM_MY_CHAT=1424432511
TELEGRAM_TOKEN=7154233690:AAGnuTBWqmGlsRKkjT13_6JTKwerwUlVFuU

Базовая структура состоит из 4 контроллеров:

  • ParserMethods — для отправки GET и POST запросов
  • TelegramMethods — для настройки и отправки запросов в Telegram
  • ExceptionController — для обработки ошибок и отправки оповещений в Telegram
  • TelegramBot — контроллер для обработки запросов от Telegram

Все эти контроллеры связаны между собой.

Контроллер для отправки GET и POST запросов

Для отправки запроса нам необходимо создать контроллер с помощью которого мы будет отправлять GET и POST запросы.

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ParserMethods extends Controller
{
    /**
     * Отправка POST запросов
     *
     * @param string $urlQuery
     * @param array $queryParams
     *
     * @return void
     */
    public static function postQuery(string $urlQuery, array|string $queryParams = [], array $queryHeading = [])
    {
        try {
            $ch = curl_init($urlQuery);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $queryParams);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $queryHeading);
            $resultQuery = curl_exec($ch);
            curl_close($ch);

            if (empty($resultQuery)) {
                throw new Exception('Запрос вызвал ошибку');
            }

            return json_decode($resultQuery, true) ?? $resultQuery;
        } catch (\Exception $e) {
            ExceptionController::sendLogException($e);
        }
    }

    /**
     * Отправка GET запросов
     *
     * @param string $urlQuery
     * @param array $queryParams
     *
     * @return void
     */
    public static function getQuery(string $urlQuery, array|string $queryParams = [], array $queryHeading = [])
    {
        try {
            if (!empty($queryParams)) {
                $urlQuery = $urlQuery ."?" . http_build_query($queryParams);
            }

            $ch = curl_init($urlQuery);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $queryHeading);
            $resultQuery = curl_exec($ch);
            curl_close($ch);

            return json_decode($resultQuery, true) ?? $resultQuery;
        } catch (\Exception $e) {
            ExceptionController::sendLogException($e);
        }
    }
}

Контроллер для отправки запросов в Telegram

Контроллер для отправки запросов в Telegram будет иметь 2 метода:

  • sendQueryTelegram() — для отправки запросов в Telegram
  • sendLogMessage() — отправка оповещений в Telegram

Метод для отправки логов

В данном методе вы можете указать Telegram токен и ID чата.

/**
 * Отправка логов
 *
 * @param array $dataQuery - параметры запроса
 * @return void
 */
public static function sendLogMessage(array $dataQuery)
{
    $token = env('TELEGRAM_TOKEN');
    $dataQuery["chat_id"] = env('TELEGRAM_MY_CHAT');
    $urlQuery = "https://api.telegram.org/bot". $token ."/sendMessage";
    return ParserMethods::postQuery($urlQuery, $dataQuery);
}

Метод для отправки запросов в Telegram

Метод sendQueryTelegram() используется для отправки запросов в Telegram и принимает 2 аргумента:

  • methodQuery — метод запроса
  • arrayQuery — массив с параметрами
/**
     * Отправка запросов в Telegram
     *
     * @param string $methodQuery - метод запроса
     * @param array $arrayQuery - массив с параметрами
     * @return void|null
     */
    public static function sendQueryTelegram(string $methodQuery, array $arrayQuery = [])
    {
        try {
            $token = env('TELEGRAM_TOKEN');

            $urlQuery = "https://api.telegram.org/bot". $token ."/" . $methodQuery;
            $resultQuery = ParserMethods::postQuery($urlQuery, $arrayQuery);

            if ($methodQuery == 'editMessageText') {
                if (empty($resultQuery['ok'])) {
                    $urlQuery = "https://api.telegram.org/bot". $token ."/sendMessage";
                    $resultQuery = ParserMethods::postQuery($urlQuery, $arrayQuery);
                }
            }

            return $resultQuery;

        } catch (\Exception $e) {
            ExceptionController::sendLogException($e);
        }
    }

Полный код контроллера

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TelegramMethods extends Controller
{

    /**
     * Отправка логов
     *
     * @param array $dataQuery - параметры запроса
     * @return void
     */
    public static function sendLogMessage(array $dataQuery)
    {
        $token = env('TELEGRAM_TOKEN');
        $dataQuery["chat_id"] = env('TELEGRAM_MY_CHAT');
        $urlQuery = "https://api.telegram.org/bot". $token ."/sendMessage";
        return ParserMethods::postQuery($urlQuery, $dataQuery);
    }

    /**
     * Отправка запросов в Telegram
     *
     * @param string $methodQuery - метод запроса
     * @param array $arrayQuery - массив с параметрами
     * @return void|null
     */
    public static function sendQueryTelegram(string $methodQuery, array $arrayQuery = [])
    {
        try {
            $token = env('TELEGRAM_TOKEN');

            $urlQuery = "https://api.telegram.org/bot". $token ."/" . $methodQuery;
            $resultQuery = ParserMethods::postQuery($urlQuery, $arrayQuery);

            if ($methodQuery == 'editMessageText') {
                if (empty($resultQuery['ok'])) {
                    $urlQuery = "https://api.telegram.org/bot". $token ."/sendMessage";
                    $resultQuery = ParserMethods::postQuery($urlQuery, $arrayQuery);
                }
            }

            return $resultQuery;

        } catch (\Exception $e) {
            ExceptionController::sendLogException($e);
        }
    }
}

Контроллер для обработки ошибок

Базовая система логирования Laravel записывает информацию об ошибках в log файлы. Для улучшения данной системы, я решил создать систему оповещений, которая будет отправлять сообщения с ошибками в Telegram.

Данный контроллер я использую для обработки ошибок и отправки оповещений с помощью метода sendLogMessage().

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ExceptionController extends Controller
{

    /**
     * Обработка ошибок и исключений
     * 
     * @param \Exception $exception
     * @param string $typeLog - тип лога
     * @param bool $dieStatus - статус отключения программы
     * @return void
     */
    public static function sendLogException(\Exception $exception, string $typeLog = 'error', bool $dieStatus = false): void
    {
        if ($typeLog === 'error') {
            $textLog = "Ошибка \n";
            $textLog .= $exception->getFile() . "\n";
            $textLog .= $exception->getMessage() . "\n";
            $textLog .= "Линия:  ". $exception->getLine();

        } else {
            $textLog = $exception->getMessage() . "\n";
        }

        $dataMessage = [
            'text' => $textLog,
        ];
        TelegramMethods::sendLogMessage($dataMessage);

        if (!empty($dieStatus)) {
            die();
        }
    }
}

В следующих уроках я буду использовать контроллер ExceptionController в конструкции try catch для настройки оповещений о любых типах ошибок.

Работу контроллера TelegramBot мы с вами разберём в следующих уроках.

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