Complete stage 0 source research

This commit is contained in:
ik
2026-09-02 19:52:32 +07:00
commit a6f91a1329
9 changed files with 1096 additions and 0 deletions
+95
View File
@@ -0,0 +1,95 @@
# Источники данных RF4: исследование этапа 0
Дата проверки: **2 сентября 2026 года**. Исследовалась только публичная веб-страница; игровой клиент, его трафик и закрытые протоколы не исследовались.
## Краткий вывод
Для первого адаптера следует получать серверный HTML страницы `https://rf4game.de/records/region/RU/`. На момент проверки таблица уже находится в исходном HTML и не требует JavaScript, авторизации или обхода защиты. Доступного JSON/XHR endpoint именно для рекордов не обнаружено.
Страница содержит общий WordPress AJAX-клиент с адресом `/wp-admin/admin-ajax.php`, но опубликованные на странице действия `gajax_Ratings` относятся к рейтингу игроков (`rating`, `rating_list`, `best`). Действия для таблицы рекордов не объявлены. Поэтому использовать или подбирать недокументированные AJAX-параметры не рекомендуется.
## Подтверждённые URL и параметры
- Абсолютные рекорды региона RU: `https://rf4game.de/records/region/RU/`.
- Недельная форма URL: `https://rf4game.de/records/weekly/region/RU/`.
- В навигации страницы перечислены регионы: `GL`, `RU`, `DE`, `US`, `FR`, `CN`, `PL`, `KR`, `JP`, `EN`.
- В навигации категорий видны: `records`, `ultralight`, `recordslight`, `bottomlight`, `sea`, `telestick`.
Категория и регион кодируются сегментами URL, а не query-параметрами. Фактический успешный ответ абсолютной страницы был `200`, `text/html; charset=UTF-8`, с `Cache-Control: no-cache`. Запрос `GET /robots.txt` вернул `404`, то есть явных инструкций для роботов на этом пути при проверке не было. Это не является разрешением на интенсивный сбор.
Серия быстрых проверок категорий позже получила одинаковые небольшие HTML-ответы вместо полных таблиц. Это может быть временной защитой или ограничением частоты; вывод требует повторной осторожной проверки. Именно поэтому исследовательский скрипт проверяет наличие таблицы и завершает работу с ошибкой, а не принимает произвольный HTML за пустой результат.
## Подтверждённый DOM-контракт
Корень таблицы: `div.records.flex_table`. Верхняя строка имеет шесть семантических классов в таком порядке:
1. `fish` — рыба;
2. `weight` — вес;
3. `location` — водоём;
4. `bait` — приманка/наживка (отображаемое значение находится в атрибуте `title` у `.bait_icon`);
5. `gamername` — игрок;
6. `data` — дата (именно `data`, не `date`).
Каждый `div.records_subtable` объединяет до нескольких результатов одной рыбы. Название рыбы находится только в заголовочной строке группы (`.fish .text`); вложенные строки имеют пустую ячейку рыбы и наследуют название группы.
Подтверждённые внутренние поля `OfficialRecord`:
| Поле | Источник/нормализация |
|---|---|
| `region` | сегмент URL, верхний регистр |
| `category` | сегмент URL/аргумент запуска |
| `fish` | `.fish .text` заголовка группы |
| `weight_g` | `.weight`; `kg`/`g` приводятся к целым граммам |
| `waterbody` | `.location` |
| `bait` | `.bait_icon[title]`, nullable |
| `player` | `.gamername`, nullable |
| `record_date` | `.data`, формат `D.MM.YY`/`DD.MM.YY` |
| `source_url` | URL полученной страницы |
Координат, проводки, времени поимки и устойчивого внешнего идентификатора записи в этой таблице нет. Локализация зависит от домена/языка страницы: проверенная `.de`-страница возвращает немецкие названия рыб, водоёмов и приманок даже для региона RU.
## Рекомендуемый режим получения
- Один понятный `User-Agent`, таймаут 20 секунд.
- Начать не чаще одного раза в 60 минут на выбранную комбинацию категории и региона.
- Не запускать параллельный обход всех регионов/категорий.
- Добавить кэш, ограниченные повторы с экспоненциальной задержкой и общий лимит запросов перед продуктивным импортом.
- При исчезновении таблицы, изменении порядка классов или ошибке HTTP считать запуск неуспешным и сохранять прежние данные.
- Повторно проверить условия использования и связаться с владельцем сайта до регулярного производственного сбора; отсутствие `robots.txt` не заменяет разрешения.
## Сравнение с `hurfy/rf4-api`
Репозиторий `hurfy/rf4-api` создан в августе 2024 года; последний push, видимый через GitHub API на дату исследования, был 14 января 2025 года. README прямо называет проект находящимся в разработке. Он использует Django, Celery и браузерный WebDriver, перебирает регионы и категории, затем разбирает те же классы `records_wrapper`, `records_subtable`, `gamername`, `weight`, `location`, `bait_icon`, `data`.
Полезные архитектурные идеи:
- отделить построение URL, получение HTML, разбор и сохранение;
- передавать регион и категорию вместе с сырой страницей;
- нормализовать вес и текст до записи в БД.
Что нельзя переносить без проверки:
- список категорий проекта ограничен `records`, `ultralight`, `telestick` и уже не отражает всю текущую навигацию;
- WebDriver избыточен для подтверждённой серверной HTML-страницы;
- парсер опирается на позиционный поиск `.rows` и не проверяет контракт колонок;
- заявленные в README охват и расписание сами по себе не доказывают текущую работоспособность.
## Фикстура и исследовательский код
`tests/fixtures/records_ru_sample.html` — сокращённая обезличенная фикстура, сохраняющая подтверждённую вложенность и классы. Реальные ники и реальные сочетания уловов в неё не переносились. `rf4_research/records.py` получает ровно одну переданную страницу, проверяет контракт колонок и выдаёт список типизированных `OfficialRecord`.
Unit-тест покрывает заголовочную и вложенную записи, килограммы/граммы, большой вес с разделителем тысяч и отказ при изменении колонок.
## Что остаётся предположением
- Все перечисленные категории и регионы стабильно отдают таблицу при умеренной частоте запросов.
- Формат двухзначного года сохранится; сейчас он интерпретируется стандартным правилом Python как 2000-е для наблюдаемых значений.
- Сайт разрешит регулярный производственный опрос раз в час.
- DOM-классы останутся стабильнее локализованных заголовков.
- Отсутствие найденного JSON endpoint не доказывает, что внутреннего endpoint вообще нет; подтверждено лишь, что для публичного сценария он не нужен и на странице не объявлен.
## Источники
- Официальная страница: <https://rf4game.de/records/region/RU/>
- Исследованный сторонний проект: <https://github.com/hurfy/rf4-api>
- Метаданные репозитория GitHub API: <https://api.github.com/repos/hurfy/rf4-api>