'message'=> $this->controller->request->post('message', ''),
'context'=> $this->controller->request->post('context', null),
]);
- // Сохраняем лог в базе данных
+
if ($log->save()) {
- // Проверка на наличие аналогичных записей перед отправкой в Telegram
+
if (!self::shouldSendToTelegram($log)) {
- return; // Пропускаем отправку, если уже есть записи за текущую дату
+ return;
}
// Формируем сообщение для отправки в Telegram с использованием MarkdownV2
$errorMessage = "⚠️*Ошибка JavaScript Обнаружена*⚠️\n\n";
-// Добавляем строки в сообщение только если параметры присутствуют
+
if ($url = $this->controller->request->getReferrer()) {
- $errorMessage .= "*URL:*\n```" . self::escapeMarkdown($url) . "```\n\n";
+ $errorMessage .= "*URL:*\n```" . TelegramService::escapeMarkdownLog($url) . "```\n\n";
}
if ($createdAt = date('Y-m-d H:i:s', $log->log_time)) {
- $errorMessage .= "*Created At:*\n```" . self::escapeMarkdown($createdAt) . "```\n\n";
+ $errorMessage .= "*Created At:*\n```" . TelegramService::escapeMarkdownLog($createdAt) . "```\n\n";
}
if ($ip = $log->ip) {
- $errorMessage .= "*IP:*\n```" . self::escapeMarkdown($ip) . "```\n\n";
+ $errorMessage .= "*IP:*\n```" . TelegramService::escapeMarkdownLog($ip) . "```\n\n";
}
if ($userAgent = $log->user_agent) {
- $errorMessage .= "*User Agent:*\n```" . self::escapeMarkdown($userAgent) . "```\n\n";
+ $errorMessage .= "*User Agent:*\n```" . TelegramService::escapeMarkdownLog($userAgent) . "```\n\n";
}
if ($file = $log->file) {
- $errorMessage .= "*File:*\n```" . self::escapeMarkdown($file) . "```\n\n";
+ $errorMessage .= "*File:*\n```" . TelegramService::escapeMarkdownLog($file) . "```\n\n";
}
if ($line = $log->line) {
- $errorMessage .= "*Line:*\n```" . self::escapeMarkdown($line) . "```\n\n";
+ $errorMessage .= "*Line:*\n```" . TelegramService::escapeMarkdownLog($line) . "```\n\n";
}
if ($col = $log->col) {
- $errorMessage .= "*Column:*\n```" . self::escapeMarkdown($col) . "```\n\n";
+ $errorMessage .= "*Column:*\n```" . TelegramService::escapeMarkdownLog($col) . "```\n\n";
}
if ($message = $log->message) {
- $errorMessage .= "*Message:*\n```" . self::escapeMarkdown($message) . "```\n\n";
+ $errorMessage .= "*Message:*\n```" . TelegramService::escapeMarkdownLog($message) . "```\n\n";
}
if ($context = $log->context) {
- $errorMessage .= "*Context:*\n```" . self::escapeMarkdown($context) . "```\n\n";
+ $errorMessage .= "*Context:*\n```" . TelegramService::escapeMarkdownLog($context) . "```\n\n";
}
// Метод для проверки наличия аналогичных записей в ErrorLog за текущую дату
private static function shouldSendToTelegram($log)
{
- $startOfDay = strtotime('today'); // Метка времени для начала текущего дня
+ $startOfDay = strtotime('today');
+
- // Запрос в таблицу ErrorLog для поиска аналогичных записей
$count = ErrorLog::find()
->where([
'ip' => $log->ip,
->andWhere(['>=', 'log_time', $startOfDay]) // Фильтр по началу текущего дня
->count();
- return $count <= 1; // Отправляем только если нет более одной записи
+ return $count <= 1;
}
- private static function escapeMarkdown($text)
- {
- $specialChars = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'];
- foreach ($specialChars as $char) {
- $text = str_replace($char, '\\' . $char, $text);
- }
- return $text;
- }
+
}
//'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",
- 'TELEGRAM_WEBHOOK_URL' => "https://api2.dev.erp-flowers.ru/telegram/webhook",
+ 'TELEGRAM_WEBHOOK_URL' => YII_DEBUG ? "https://api2.dev.erp-flowers.ru/telegram/webhook" : "https://api2.erp.erp-flowers.ru/telegram/webhook",
'CAMERAS' => [
['Login' => 'mochage-8r-136', 'Password' => 'fjtq8z3u'],
['Login' => 'kuznzx-am-136', 'Password' => '8e4ma237'],
// Если ошибка уже была за текущую дату
if ($date === $currentDate && $count >= 1) {
- return false; // Не отправляем
+ return false;
}
- // Увеличиваем счётчик и обновляем дату
+
$count++;
$line = implode('|', [$currentDate, $count, $hash, $errorText]);
break;
}
}
- // Если ошибка новая, добавляем её в список
+
if (!$errorExists) {
$errorLines[] = implode('|', [$currentDate, 1, $currentErrorHash, $currentError]);
}
- // Сохраняем обновлённый список ошибок
+
file_put_contents($filePath, implode(PHP_EOL, $errorLines) . PHP_EOL);
- return true; // Ошибка не найдена или обновлена, можно отправлять
+ return true;
}
-// Метод для нормализации текста ошибки
+
private function normalizeText($text)
{
- // Приводим текст к единому формату: нижний регистр, удаление лишних пробелов
+
$text = strtolower($text);
$text = preg_replace('/\s+/', ' ', $text);
return trim($text);
// Проверка наличия подобных сообщений
if (!$this->shouldSendMessage($errorText)) {
- return; // Пропускаем отправку, если ошибка уже зарегистрирована
+ return;
}
// Формирование уровня и основного сообщения
// Валидация и сохранение лога в базе данных
if ($infoLog->validate() && $infoLog->save()) {
- // Проверяем, нужно ли отправлять сообщение в Telegram
+
if (!self::shouldSendToTelegram($file, $line, $messageText, $context)) {
- return; // Пропускаем отправку, если уже есть записи за текущую дату
+ return;
}
- // Формируем сообщение для отправки в Telegram
+
$telegramMessage = "⚠️*Сообщение из InfoLog*⚠️\n\n";
- // Добавляем строки в сообщение только если параметры присутствуют
+
if ($file) {
- $telegramMessage .= "*File:*\n```" . self::escapeMarkdown($file) . "```\n\n";
+ $telegramMessage .= "*File:*\n```" . TelegramService::escapeMarkdownLog($file) . "```\n\n";
}
if ($line) {
- $telegramMessage .= "*Line:*\n```" . self::escapeMarkdown($line) . "```\n\n";
+ $telegramMessage .= "*Line:*\n```" . TelegramService::escapeMarkdownLog($line) . "```\n\n";
}
if ($messageText) {
- $telegramMessage .= "*Сообщение:*\n```log" . self::escapeMarkdown($messageText) . "```\n\n";
+ $telegramMessage .= "*Сообщение:*\n```log" . TelegramService::escapeMarkdownLog($messageText) . "```\n\n";
}
if ($context) {
- $telegramMessage .= "*Context:*\n```log" . self::escapeMarkdown($context) . "```\n\n";
+ $telegramMessage .= "*Context:*\n```log" . TelegramService::escapeMarkdownLog($context) . "```\n\n";
}
}
- // Метод для экранирования символов MarkdownV2
- private static function escapeMarkdown($text)
- {
- $specialChars = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'];
- foreach ($specialChars as $char) {
- $text = str_replace($char, '\\' . $char, $text);
- }
- return $text;
- }
+
// Метод для проверки, существуют ли подобные записи в InfoLog за текущую дату
{
$currentDate = date('Y-m-d');
- // Выполняем запрос, чтобы найти записи с такими же значениями за текущую дату
+
$count = InfoLog::find()
->where([
'file' => $file,
->andWhere(['>=', 'created_at', new Expression("DATE('$currentDate')")])
->count();
- return $count <= 1; // Возвращаем true, только если нет более одной записи
+ return $count <= 1;
}
}
\ No newline at end of file
$apiErrorLog->ip = Yii::$app->request->remoteIP ?? '<no ip>';
$apiErrorLog->save();
- // Проверка на наличие аналогичной записи перед созданием новой и отправкой в Telegram
+
if (!self::shouldSendToTelegram($hash_input, $jsonString)) {
- return; // Пропускаем отправку, если уже есть аналогичная запись за текущую дату
+ return;
}
// Добавляем строки только если параметры присутствуют
if ($url = $apiErrorLog->url) {
- $errorMessage .= "*URL:*\n```" . self::escapeMarkdown($url) . "```\n\n";
+ $errorMessage .= "*URL:*\n```" . TelegramService::escapeMarkdownLog($url) . "```\n\n";
}
if ($createdAt = $apiErrorLog->created_at) {
}
if ($ip = $apiErrorLog->ip) {
- $errorMessage .= "*IP:*\n```" . self::escapeMarkdown($ip) . "```\n\n";
+ $errorMessage .= "*IP:*\n```" . TelegramService::escapeMarkdownLog($ip) . "```\n\n";
}
if ($jsonString) {
}
-// Метод для экранирования символов MarkdownV2
- private static function escapeMarkdown($text)
- {
- $specialChars = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'];
- foreach ($specialChars as $char) {
- $text = str_replace($char, '\\' . $char, $text);
- }
- return $text;
- }
// Метод для проверки наличия аналогичных записей в ApiErrorLog за текущую дату
private static function shouldSendToTelegram($hash_input, $jsonString)
{
- $startOfDay = strtotime('today'); // Метка времени для начала текущего дня
+ $startOfDay = strtotime('today');
// Запрос в таблицу ApiErrorLog для поиска аналогичных записей за текущую дату
$count = ApiErrorLog::find()
->andWhere(['>=', 'created_at', date('Y-m-d H:i:s', $startOfDay)]) // Фильтр по началу текущего дня
->count();
- return $count <= 1; // Отправляем только если нет более одной записи
+ return $count <= 1;
}
}
- // Метод для экранирования символов MarkdownV2
+ // Метод для экранирования символов MarkdownV2 для файла
public static function escapeMarkdown($text)
{
- // Экранирование символов, зарезервированных в MarkdownV2
+
$specialChars = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'];
foreach ($specialChars as $char) {
return $text;
}
+ // Метод для экранирования символов MarkdownV2 для логов из БД
+ public static function escapeMarkdownLog($text)
+ {
+ $specialChars = ['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'];
+ foreach ($specialChars as $char) {
+ $text = str_replace($char, '\\' . $char, $text);
+ }
+ return $text;
+ }
+
}
\ No newline at end of file