6e5f47962c
- Скриншоты живого прогона: страница глазами клиента (мой рендер) и НАСТОЯЩИЙ экран портала FieldCompetitorScreen с живыми данными (findings/*.png). - Сводка STEP2-SVODKA: §4 чистый прогон (29 номеров + 2ГИС), §6.7 привязка офис↔номер, §6.8 ретрай флаки 2ГИС. - R&D, план-промпт, прототипы sbor1/sbor2 + живая собранная страница. - Резервный Playwright-путь справочников (CurlPlaywrightFetcher.directory + render-firm.cjs) — заменён xfetch; хвост SSRF §6.4 не на боевом пути. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
1.2 KiB
JavaScript
34 lines
1.2 KiB
JavaScript
// Usage: node render-firm.cjs <url>
|
|
// Открывает карточку справочника, жмёт «Показать телефон(ы)», печатает JSON { html }.
|
|
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();
|
|
await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 });
|
|
// нажать кнопку раскрытия телефона, если есть
|
|
try {
|
|
const btn = page.getByText(/Показать телефон/i).first();
|
|
await btn.click({ timeout: 4000 });
|
|
await page.waitForTimeout(700);
|
|
} catch (e) { /* кнопки нет — номер уже виден */ }
|
|
const html = await page.content();
|
|
process.stdout.write(JSON.stringify({ html }));
|
|
} finally {
|
|
await browser.close();
|
|
}
|
|
})().catch(e => { console.error(String(e)); process.exit(1); });
|