v2.0: исправлены критические баги, добавлены 4 новые проверки, 4-фазный cookie-аудит, retry-логика, YAML-словари, LLM-анализ, тесты

Исправлено:
- engine: _calculate_score() при ошибке загрузки (score не 100 для мёртвых сайтов)
- privacy_link: замена page.goto() на aiohttp (гонка данных)
- form_checkbox: 3-уровневый поиск label + dark-pattern detection
- server_location: синхронный urllib → aiohttp
- api/server: перепутанные request/response модели в batch
- main.py: csv --checks флаг
- engine: фазовая модель (cookie_audit отдельно, остальные параллельно)
- engine: retry-логика (3 попытки, exponential backoff)
- PDF: emoji заменены на текст (WeasyPrint)

Добавлено:
- consent_doc: проверка отдельного согласия на обработку ПД
- operator_info: проверка ИНН/ОГРН/DPO (читает главную + политику)
- cookie_audit: 4-фазный аудит (load→detect→reject→compare)
- llm_policy: опциональный LLM-анализ 16 разделов (--deep)
- external_scripts: YAML-словари trackers.yaml (critical/warning/russian)
- logging (output.py), .gitignore, pyproject.toml
- smoke-тесты (16/16)
This commit is contained in:
neo committed 2026-06-10 00:49:07 +05:00
1 parent 7fb417dad5
commit b9db935389
24 files changed
+1725 -286

No files matched your search

+41
View File
@@ -0,0 +1,41 @@
"""Логирование для 152-ФЗ Scanner.
Заменяет print() на структурированный вывод с уровнями и файлом."""
import logging
import sys
from pathlib import Path
from datetime import datetime
LOG_DIR = Path(__file__).parent / "logs"
LOG_DIR.mkdir(exist_ok=True)
def setup_logger(name: str = "scanner", level: int = logging.INFO) -> logging.Logger:
"""Настроить логгер с выводом в консоль + файл."""
logger = logging.getLogger(name)
logger.setLevel(level)
if logger.handlers:
return logger
# Формат: время [уровень] сообщение
fmt = logging.Formatter(
"%(asctime)s [%(levelname)s] %(message)s",
datefmt="%H:%M:%S",
)
# Консоль
console = logging.StreamHandler(sys.stdout)
console.setFormatter(fmt)
logger.addHandler(console)
# Файл
today = datetime.now().strftime("%Y%m%d")
file_handler = logging.FileHandler(LOG_DIR / f"app_{today}.log", encoding="utf-8")
file_handler.setFormatter(fmt)
logger.addHandler(file_handler)
return logger
# Глобальный экземпляр
log = setup_logger()