de544c25b0
Рисовалка топологии Б (§5.6): портал зовёт по HTTP как xf4, она рисует и
отдаёт данные. Ни базы, ни Redis, ни денег. Смоук на живом 2ГИС: листинг 12
фирм, карточка 1 — чистый initialState.
- browser.mjs — постоянный браузер + маскировка + контекст-на-страницу +
museum double-tap для поиска 2ГИС + отсечка картинок/шрифтов/медиа.
- proxy-pool.mjs — round-robin пул прокси из env PROXIES (резидентные/мобильные RU).
- server.mjs — POST /render {url,type}→{data}, auth X-Render-Key, семафор
MAX_CONCURRENCY, /health.
- package.json, README.md, smoke.mjs, .gitignore (node_modules не в гит).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
26 lines
1.1 KiB
JavaScript
26 lines
1.1 KiB
JavaScript
// Смоук-проверка рисовалки на живом 2ГИС (без прокси): листинг + карточка. Печатает, достался ли
|
|
// чистый initialState с фирмами. НЕ юнит-тест (ходит в сеть). Запуск: node smoke.mjs
|
|
import { render, closeBrowser } from './browser.mjs';
|
|
|
|
const cases = [
|
|
['https://2gis.ru/krasnoyarsk/search/займы под залог авто', 'initialState', 'listing'],
|
|
['https://2gis.ru/krasnoyarsk/firm/70000001052966157', 'initialState', 'card'],
|
|
];
|
|
|
|
try {
|
|
for (const [url, type, label] of cases) {
|
|
const data = await render(url, type, null);
|
|
let firms = 0;
|
|
try {
|
|
const s = JSON.parse(data);
|
|
const pag = s?.data?.search?.pagination;
|
|
const pk = pag && Object.keys(pag)[0];
|
|
if (pk && pag[pk]['1']) firms = pag[pk]['1'].data.length;
|
|
else firms = Object.keys(s?.data?.entity?.profile || {}).length;
|
|
} catch { /* not json */ }
|
|
console.log(`[smoke] ${label}: ${data.length}B initialState, entities≈${firms}`);
|
|
}
|
|
} finally {
|
|
await closeBrowser();
|
|
}
|