]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Добавил чат и кнопку
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 30 Oct 2024 08:37:21 +0000 (11:37 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 30 Oct 2024 08:37:21 +0000 (11:37 +0300)
erp24/api2/controllers/TelegramController.php
erp24/config/params.php
erp24/config/web.php
erp24/services/TelegramTarget.php [new file with mode: 0644]

index 2da374a848e3633534140300f1497a6083bc41dd..9946b6a520d6dbcd77ae7492e9222e645939268f 100644 (file)
@@ -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);
 
index 772d5beece52231f51fd6a59e6b2faf10c090afe..06d3a4444a36d9de04d27b98fba553ed33819f33 100644 (file)
@@ -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'],
index 5239b2f70f10cea9c6f9f96d531cfb98f4464037..51b09cc92d74083b133435b1d615819117a44e48 100644 (file)
@@ -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 (file)
index 0000000..7a97526
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+
+namespace yii_app\services;
+
+use yii\log\Target;
+use Yii;
+use GuzzleHttp\Client;
+use yii_app\actions\timetable\StartAction;
+
+class TelegramTarget extends Target
+{
+    public $botToken = "8063257458:AAGnMf4cxwJWlYLF1wS_arn4PrOaLs9ERQQ";
+    public $chatId ="-1001861631125";
+
+    public function export()
+    {
+        $apiURL = 'https://api.telegram.org/bot' . $this->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