namespace app\controllers;
+use GuzzleHttp\Client;
use Yii;
use yii\helpers\Json;
use yii\web\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') {
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);
}
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);
--- /dev/null
+<?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