From: fomichev Date: Wed, 30 Oct 2024 08:37:21 +0000 (+0300) Subject: Добавил чат и кнопку X-Git-Tag: 1.6~21^2~13 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=097a9f7de5dd81148b6f918e9ec2ddd1a93ec30e;p=erp24_rep%2Fyii-erp24%2F.git Добавил чат и кнопку --- diff --git a/erp24/api2/controllers/TelegramController.php b/erp24/api2/controllers/TelegramController.php index 2da374a8..9946b6a5 100644 --- a/erp24/api2/controllers/TelegramController.php +++ b/erp24/api2/controllers/TelegramController.php @@ -2,6 +2,7 @@ namespace app\controllers; +use GuzzleHttp\Client; use Yii; use yii\helpers\Json; use yii\web\Controller; @@ -23,9 +24,10 @@ class TelegramController extends Controller // private static $TOKEN = "6189425433:AAFQ91OYiMiyj2jgIgmx3O2yTBl4enywySM"; private static $API_URL = "https://api.telegram.org/bot6189425433:AAFQ91OYiMiyj2jgIgmx3O2yTBl4enywySM/"; + // private static $WEBHOOK_URL = "https://api2.bazacvetov24.ru/telegram/webhook"; private static $MESSAGES = "/var/www/www-root/data/www/erp.bazacvetov24.ru/yii_app/api2/messages.txt"; - + public string $botToken = "8063257458:AAGnMf4cxwJWlYLF1wS_arn4PrOaLs9ERQQ"; public function beforeAction($action) { if ($action->id == 'webhook') { @@ -83,7 +85,22 @@ class TelegramController extends Controller if (isset($update["message"])) { self::processMessage($update["message"]["text"], $update["message"]["chat"]["id"]); } else if (isset($update["callback_query"])) { - self::processMessage($update["callback_query"]["data"], $update["callback_query"]["from"]["id"], $update); + $callbackData = $update["callback_query"]["data"]; + $chatId = $update["callback_query"]["from"]["id"]; + + // Проверяем, если callback_data содержит идентификатор Stack trace + if (strpos($callbackData, 'trace_') === 0) { + // Получаем Stack trace по идентификатору + $stackTrace = Yii::$app->session->get($callbackData); + + if ($stackTrace) { + // Отправляем stack trace обратно в Telegram + $this->sendMessage($chatId, $stackTrace); + } else { + $this->sendMessage($chatId, 'Stack trace не найден.'); + } + } + // self::processMessage($update["callback_query"]["data"], $update["callback_query"]["from"]["id"], $update); } else { file_put_contents(self::$MESSAGES, "\n" . Json::encode($update), FILE_APPEND); } @@ -91,6 +108,21 @@ class TelegramController extends Controller return "ok"; } + // Метод для отправки сообщения в Telegram + private function sendMessage($chatId, $text) + { + $apiURL = 'https://api.telegram.org/bot' . $this->botToken . '/sendMessage'; + $client = new Client(); + + $client->post($apiURL, [ + 'json' => [ + 'chat_id' => $chatId, + 'text' => $text, + 'parse_mode' => 'MarkdownV2' + ], + ]); + } + private static function exec_curl_request($handle) { $response = curl_exec($handle); diff --git a/erp24/config/params.php b/erp24/config/params.php index 772d5bee..06d3a444 100644 --- a/erp24/config/params.php +++ b/erp24/config/params.php @@ -2,7 +2,8 @@ return [ 'API2_URL' => YII_DEBUG ? 'http://host.docker.internal:5555' : 'https://api2.bazacvetov24.ru', - 'TELEGRAM_API_URL' => "https://api.telegram.org/bot6189425433:AAFQ91OYiMiyj2jgIgmx3O2yTBl4enywySM/", + //'TELEGRAM_API_URL' => "https://api.telegram.org/bot6189425433:AAFQ91OYiMiyj2jgIgmx3O2yTBl4enywySM/", + 'TELEGRAM_API_URL' => "https://api.telegram.org/bot8063257458:AAGnMf4cxwJWlYLF1wS_arn4PrOaLs9ERQQ/", 'TELEGRAM_WEBHOOK_URL' => "https://api2.bazacvetov24.ru/telegram/webhook", 'CAMERAS' => [ ['Login' => 'mochage-8r-136', 'Password' => 'fjtq8z3u'], diff --git a/erp24/config/web.php b/erp24/config/web.php index 5239b2f7..51b09cc9 100644 --- a/erp24/config/web.php +++ b/erp24/config/web.php @@ -61,6 +61,11 @@ $config = [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], + [ + 'class' => 'yii_app\services\TelegramTarget', + 'levels' => ['error', 'warning'], + // 'categories' => ['api.error', 'js.error', 'command.error'], + ], ], ], 'db' => $db, diff --git a/erp24/services/TelegramTarget.php b/erp24/services/TelegramTarget.php new file mode 100644 index 00000000..7a97526a --- /dev/null +++ b/erp24/services/TelegramTarget.php @@ -0,0 +1,127 @@ +botToken . '/sendMessage'; + $client = new Client(); + + foreach ($this->messages as $key => $message) { + if ($key == 1) { + break; + } + + $mainMessage = $this->formatMainMessage($message); + $stackTrace = $this->formatStackTrace($message); + // Генерируем уникальный идентификатор для сообщения + $traceId = uniqid('trace_', true); + + // Сохраняем Stack trace в сессии или базе данных с этим идентификатором + Yii::$app->session->set($traceId, $stackTrace); // Используйте базу данных, если требуется постоянное хранение + + // Отправляем основное сообщение с кнопкой + $response = $client->post($apiURL, [ + 'json' => [ + 'chat_id' => $this->chatId, + 'text' => $mainMessage, + 'parse_mode' => 'MarkdownV2', + 'reply_markup' => json_encode([ + 'inline_keyboard' => [ + [ + [ + 'text' => 'Подробнее', + 'callback_data' => $traceId // Callback для получения stack trace + ] + ] + ] + ]) + ], + ]); + + if ($response->getStatusCode() == 200) { + Yii::info('Основное сообщение отправлено успешно', 'telegram'); + } else { + Yii::error('Ошибка отправки сообщения: ' . $response->getBody()->getContents(), 'telegram'); + } + } + } + + public function formatMessage($message) + { + // Получаем полное сообщение + $fullMessage = $message[0] ?? ''; + + // Убираем все данные о `$_GET`, `$_POST`, `$_SESSION`, `$_COOKIE` и т.д., если они присутствуют + $fullMessage = preg_replace('/(\$_[A-Z]+ = \[.*?\];)/s', '', $fullMessage); + + // Разделим текст на две части: до "Stack trace:" и сам "Stack trace:" + $parts = preg_split('/Stack trace:/', $fullMessage, 2); + + // Получаем сообщение до "Stack trace" + $mainMessage = trim($parts[0] ?? ''); + + // Извлекаем сам Stack trace до {main} + $stackTrace = ''; + if (isset($parts[1])) { + preg_match('/(.*?){main}/s', $parts[1], $matches); + $stackTrace = trim($matches[1] ?? ''); + } + + // Форматируем сообщение для Telegram с использованием Markdown + $formattedMessage = sprintf( + "*Основное сообщение:*\n```log\n%s```\n\n*Stack trace:*\n```in\n%s```", + $mainMessage, + $stackTrace + ); + + // Обрезаем сообщение до 4096 символов, если нужно + return mb_strlen($formattedMessage) > 4096 ? mb_substr($formattedMessage, 0, 300) . '...' : $formattedMessage; + } + + public function formatMainMessage($message) + { + $fullMessage = $message[0] ?? ''; + $fullMessage = preg_replace('/(\$_[A-Z]+ = \[.*?\];)/s', '', $fullMessage); + + $parts = preg_split('/Stack trace:/', $fullMessage, 2); + $mainMessage = trim($parts[0] ?? ''); + + return "*Основное сообщение:*\n```log\n{$mainMessage}```"; + } + + public function formatStackTrace($message) + { + $fullMessage = $message[0] ?? ''; + $parts = preg_split('/Stack trace:/', $fullMessage, 2); + + $stackTrace = ''; + if (isset($parts[1])) { + preg_match('/(.*?){main}/s', $parts[1], $matches); + $stackTrace = trim($matches[1] ?? ''); + } + + return $this->escapeMarkdown("*Stack trace:*\n```{$stackTrace}```"); + } + + // Метод для экранирования символов MarkdownV2 + private function escapeMarkdown($text) + { + $specialChars = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!']; + foreach ($specialChars as $char) { + $text = str_replace($char, '\\' . $char, $text); + } + return $text; + } + +} \ No newline at end of file