В новом уроке мы с вами создадим базовые контроллеры для работы с ботом. Данную структуру я использую во многих своих проектах связанных с ботами.
Перед созданием контроллеров вам необходимо указать 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 мы с вами разберём в следующих уроках.