- Добавлена поддержка project_id в parscourt.php для создания уведомлений - Создана система парсеров судов (BaseCourtParser, MoscowCourtParser, RegionalCourtParser) - Интегрирован Browserless для парсинга московских судов (mos-sud.ru, mos-gorsud.ru) - Добавлены уведомления VDNotifierPro при обнаружении новых событий судов - Создан ParseAndCreateEvent.php для интеграции с CRM workflow - Создан CreateCourtEvent_v2.php для прямого создания событий в календаре CRM - Поддержка проверки дубликатов событий (можно отключить для тестирования) - Автоматическое определение типа суда и выбор подходящего парсера Функции: - Парсинг региональных судов (*.sudrf.ru) через HTML - Парсинг московских судов через Browserless API - Создание событий в CRM календаре с привязкой к проектам - Уведомления ответственных пользователей о новых событиях - Сохранение событий в таблицу subject для истории
93 lines
4.6 KiB
PHP
93 lines
4.6 KiB
PHP
<?php
|
||
require_once 'BaseCourtParser.php';
|
||
|
||
/**
|
||
* Парсер для региональных судов (*.sudrf.ru)
|
||
*/
|
||
class RegionalCourtParser extends BaseCourtParser {
|
||
|
||
public function canHandle($url) {
|
||
// Региональные суды имеют домены вида: example--region.sudrf.ru
|
||
return preg_match('/\.sudrf\.ru/', $url) && !preg_match('/mos-gorsud\.ru/', $url);
|
||
}
|
||
|
||
public function parse($url, $status) {
|
||
$this->log("Старт парсинга {$this->case_number} для статуса: $status (РЕГИОНАЛЬНЫЙ СУД)");
|
||
$this->log("Парсим данные из ссылки: $url");
|
||
|
||
// Загружаем HTML-контент страницы дела
|
||
$html = @file_get_contents($url);
|
||
|
||
if ($html === false) {
|
||
$this->log("Ошибка: не удалось загрузить страницу по ссылке: $url");
|
||
return null;
|
||
}
|
||
|
||
$this->log("Страница успешно загружена. Начинаем парсинг...");
|
||
|
||
// Парсим HTML с помощью DOMDocument и XPath
|
||
$dom = new DOMDocument();
|
||
// Важно: указываем кодировку UTF-8 для корректного парсинга
|
||
@$dom->loadHTML('<?xml encoding="UTF-8">' . $html);
|
||
$xpath = new DOMXPath($dom);
|
||
|
||
// Определяем div для парсинга
|
||
$div_id = ($status === 'представительство в суде 1й инстанции' ||
|
||
$status === 'выдача листа' ||
|
||
$status === 'исполнительное производство' ||
|
||
$status === 'заявление на лист') ? 'cont2' : 'cont3';
|
||
|
||
$rows = $xpath->query("//div[@id='$div_id']//tr");
|
||
$this->log("Найдено строк (tr) в div с id '$div_id': " . $rows->length);
|
||
|
||
// Массив для хранения последнего события
|
||
$last_event = null;
|
||
|
||
// Обрабатываем каждую строку таблицы
|
||
foreach ($rows as $row) {
|
||
$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 ?? '');
|
||
|
||
// Логируем каждую строку
|
||
$this->log("Найдено событие: $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') {
|
||
$this->log("Пропущено событие: название или дата не указаны.");
|
||
continue;
|
||
}
|
||
|
||
// Форматируем даты
|
||
$formatted_date = date('Y-m-d', strtotime($event_date));
|
||
$formatted_publication_date = date('Y-m-d', strtotime($publication_date));
|
||
|
||
$eventData = [
|
||
'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,
|
||
];
|
||
|
||
// Сохраняем событие в БД
|
||
$this->saveEvent($eventData);
|
||
|
||
// Запоминаем последнее событие для ответа
|
||
$last_event = $eventData;
|
||
}
|
||
|
||
return $last_event;
|
||
}
|
||
}
|
||
?>
|
||
|