Files
portal/app/scripts/render-card.cjs
T
Дмитрий df83fa836c feat(автоподбор): Конкурентное поле — финальный проход склейки, вскрыть всё, группы дублей, телефоны, отсев рекламных номеров 2ГИС
Шаг 1 «Конкурентное поле» — чекпоинт:
- Финальный проход «Найти и объединить дубли» на поле и предложениях; клиент решает по каждой группе, ничего не склеиваем молча.
- Тихая склейка только по сайту и коду справочника; телефон и людный номер у более чем 4 фирм — на решение клиента.
- Колонка phones jsonb; телефон-дубли видны уже на «Предложениях».
- Sonar даёт только имя и тип, сайт всегда через EXA; вскрываем все карточки без гейта «есть сайт».
- Яндекс-карточки через локальный Playwright параллельно; рубрика из заголовка идёт в описание.
- Фикс рекламных номеров: 2ГИС-парсер разбирает телефоны пообъектно и выкидывает рекламные кнопки с platforms/caption чужих фирм.

Тесты: автоподбор 224/224 unit, 105/105 feature; фронт-спеки зелёные. Времянки app/scripts/diag-*/probe-* в гит не входят.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:34:03 +03:00

37 lines
1.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Usage: node render-card.cjs <url>
// Рендер карточки организации (Яндекс.Карты/2ГИС) локальным Playwright → JSON { html }.
// ВАЖНО: Яндекс.Карты НЕ доходят до networkidle (постоянные фоновые запросы) — поэтому ждём
// domcontentloaded + фиксированную паузу (как рабочий render-yandex-list.cjs), а не networkidle.
// Нужен, чтобы вскрывать яндекс-карточки надёжно (xfetch под нагрузкой их режет → терялся сайт).
const { chromium } = require('playwright');
(async () => {
const url = process.argv[2];
let parsed;
try {
parsed = new URL(url);
} catch (e) {
console.error('bad url');
process.exit(2);
}
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
console.error('bad scheme');
process.exit(2);
}
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ locale: 'ru-RU' });
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 45000 });
// Даём подгрузиться блоку контактов (сайт/телефоны рисуются после первого рендера).
await page.waitForTimeout(4500);
const html = await page.content();
process.stdout.write(JSON.stringify({ html }));
} finally {
await browser.close();
}
})().catch((e) => {
console.error(String(e));
process.exit(1);
});