- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
137 lines
7.2 KiB
PHP
137 lines
7.2 KiB
PHP
<?php
|
||
set_time_limit(0); // Снимаем ограничение по времени работы скрипта
|
||
|
||
// Функция для записи логов
|
||
function log_message($message) {
|
||
$date = date('Y-m-d H:i:s');
|
||
file_put_contents('logs/parser.log', "[$date] $message" . PHP_EOL, FILE_APPEND);
|
||
}
|
||
|
||
// Подключение к базе данных
|
||
$host = 'localhost'; // хост
|
||
$dbname = 'court'; // имя базы данных
|
||
$user = 'court_usr'; // пользователь
|
||
$password = 'yOrjA9HdgwXO4JGJ'; // пароль
|
||
|
||
try {
|
||
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $password);
|
||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||
log_message("Успешное подключение к базе данных '$dbname'.");
|
||
} catch (PDOException $e) {
|
||
log_message("Ошибка подключения к базе данных: " . $e->getMessage());
|
||
die("Ошибка подключения: " . $e->getMessage());
|
||
}
|
||
|
||
// Переменные для статуса и ссылки
|
||
$status = 'представительство в суде 1й инстанции'; // статус
|
||
$link = 'https://leninsky--pnz.sudrf.ru/modules.php?name=sud_delo&srv_num=1&name_op=case&case_id=170692229&case_uid=576762af-00bc-4346-8f15-f142608f0b4c&delo_id=1540005&case_type=0&new=0&srv_num=1'; // ссылка
|
||
|
||
// Определяем case_number и uid, чтобы избежать ошибок
|
||
$case_number = '170692229'; // Подставьте актуальный номер дела
|
||
$uid = '576762af-00bc-4346-8f15-f142608f0b4c'; // Подставьте актуальный uid
|
||
|
||
log_message("Старт парсинга для статуса: $status");
|
||
log_message("Парсим данные из ссылки: $link");
|
||
|
||
// Загружаем HTML-контент страницы дела
|
||
$html = @file_get_contents($link);
|
||
|
||
if ($html === false) {
|
||
log_message("Ошибка: не удалось загрузить страницу по ссылке: $link");
|
||
die("Ошибка: не удалось загрузить страницу по ссылке: $link");
|
||
}
|
||
|
||
log_message("Страница успешно загружена. Начинаем парсинг...");
|
||
|
||
// Парсим HTML с помощью DOMDocument и XPath
|
||
$dom = new DOMDocument();
|
||
libxml_use_internal_errors(true); // Убираем предупреждения
|
||
@$dom->loadHTML($html);
|
||
$xpath = new DOMXPath($dom);
|
||
libxml_clear_errors(); // Очищаем ошибки
|
||
|
||
// Определяем div для парсинга
|
||
$div_id = ($status === 'представительство в суде 1й инстанции') ? 'cont2' : 'cont3';
|
||
$rows = $xpath->query("//div[@id='$div_id']//tr");
|
||
log_message("Найдено строк (tr) в div с id '$div_id': " . $rows->length);
|
||
|
||
// Проверяем, если строки не найдены
|
||
if ($rows->length === 0) {
|
||
log_message("Ошибка: нет строк для парсинга в div с id '$div_id'. Проверьте структуру страницы.");
|
||
die("Ошибка: нет строк для парсинга.");
|
||
}
|
||
|
||
$events = []; // Массив для хранения событий
|
||
|
||
// Обрабатываем каждую строку таблицы
|
||
foreach ($rows as $row) {
|
||
// Используем try-catch для обработки каждой строки
|
||
try {
|
||
$event_name = trim($xpath->query('./td[1]', $row)->item(0)->nodeValue ?? '');
|
||
$event_date = trim($xpath->query('./td[2]', $row)->item(0)->nodeValue ?? '');
|
||
$event_time = trim($xpath->query('./td[3]', $row)->item(0)->nodeValue ?? '');
|
||
$location = trim($xpath->query('./td[4]', $row)->item(0)->nodeValue ?? '');
|
||
$event_result = trim($xpath->query('./td[5]', $row)->item(0)->nodeValue ?? '');
|
||
$event_basis = trim($xpath->query('./td[6]', $row)->item(0)->nodeValue ?? '');
|
||
$note = trim($xpath->query('./td[7]', $row)->item(0)->nodeValue ?? '');
|
||
$publication_date = trim($xpath->query('./td[8]', $row)->item(0)->nodeValue ?? '');
|
||
|
||
log_message("Найдено событие: $event_name, Дата: $event_date, Время: $event_time, Место: $location, Результат: $event_result, Основание: $event_basis, Примечание: $note, Дата размещения: $publication_date");
|
||
|
||
// Пропускаем записи, если название события не указано или дата неверная
|
||
if (empty($event_name) || empty($event_date) || $event_date === '1970-01-01') {
|
||
log_message("Пропущено событие: название или дата не указаны.");
|
||
continue; // Пропустить итерацию
|
||
}
|
||
|
||
// Форматируем даты
|
||
$formatted_date = date('Y-m-d', strtotime($event_date));
|
||
$current_datetime = date('Y-m-d H:i:s');
|
||
$formatted_publication_date = date('Y-m-d', strtotime($publication_date));
|
||
|
||
// Добавляем событие в массив
|
||
$events[] = [
|
||
'event_name' => $event_name,
|
||
'event_date' => $formatted_date,
|
||
'event_time' => $event_time,
|
||
'location' => $location,
|
||
'event_result' => $event_result,
|
||
'event_basis' => $event_basis,
|
||
'note' => $note,
|
||
'publication_date' => $formatted_publication_date,
|
||
'update_datetime' => $current_datetime
|
||
];
|
||
|
||
} catch (Exception $e) {
|
||
log_message("Ошибка при обработке строки: " . $e->getMessage());
|
||
}
|
||
}
|
||
|
||
// Запись данных в таблицу subject
|
||
foreach ($events as $event) {
|
||
try {
|
||
// Проверяем, существует ли запись в таблице subject
|
||
$checkQuery = "SELECT COUNT(*) FROM subject WHERE event_name = ? AND event_date = ? AND publication_date = ?";
|
||
$checkStmt = $pdo->prepare($checkQuery);
|
||
$checkStmt->execute([$event['event_name'], $event['event_date'], $event['publication_date']]);
|
||
$exists = $checkStmt->fetchColumn() > 0;
|
||
|
||
if (!$exists) {
|
||
// Запись данных в таблицу subject
|
||
$insertQuery = "INSERT INTO subject (case_number, uid, event_name, event_date, event_time, location, event_result, event_basis, note, publication_date, update_datetime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||
$insertStmt = $pdo->prepare($insertQuery);
|
||
$insertStmt->execute([$case_number, $uid, $event['event_name'], $event['event_date'], $event['event_time'], $event['location'], $event['event_result'], $event['event_basis'], $event['note'], $event['publication_date'], $event['update_datetime']]);
|
||
|
||
log_message("Данные успешно записаны в таблицу subject для события: " . $event['event_name']);
|
||
} else {
|
||
log_message("Дубликат найден для события: " . $event['event_name'] . ", пропускаем запись.");
|
||
}
|
||
|
||
} catch (Exception $e) {
|
||
log_message("Ошибка при записи данных в таблицу subject: " . $e->getMessage());
|
||
}
|
||
}
|
||
|
||
log_message("Парсинг завершен.");
|
||
?>
|