From 072713ca3d4e0535281ad229865e5fb880ddb7be Mon Sep 17 00:00:00 2001 From: Matthias Hochmeister Date: Fri, 13 Mar 2026 13:16:14 +0100 Subject: [PATCH] update --- sync/src/scraper.ts | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/sync/src/scraper.ts b/sync/src/scraper.ts index 13da4fa..3c6515a 100644 --- a/sync/src/scraper.ts +++ b/sync/src/scraper.ts @@ -5,14 +5,10 @@ const BASE_URL = process.env.FDISK_BASE_URL ?? 'https://app.fdi const ID_FEUERWEHREN = process.env.FDISK_ID_FEUERWEHREN ?? '164'; const ID_INSTANZEN = process.env.FDISK_ID_INSTANZEN ?? '2853'; -const LOGIN_URL = `${BASE_URL}/fdisk/module/vws/logins/logins.aspx`; -const MEMBERS_URL = `${BASE_URL}/fdisk/module/vws/vws/MitgliedschaftenList.aspx` - + `?search=1` - + `&searchid_feuerwehren=${ID_FEUERWEHREN}` - + `&searchid_instanzen=${ID_INSTANZEN}` - + `&id_instanzen=${ID_INSTANZEN}` - + `&searchid_instanzen_besitzer=${ID_INSTANZEN}` - + `&searchid_fahrzeugstatus=1`; +const LOGIN_URL = `${BASE_URL}/fdisk/module/vws/logins/logins.aspx`; +const MEMBERS_URL = `${BASE_URL}/fdisk/module/vws/vws/MitgliedschaftenList.aspx` + + `?id_instanzen=${ID_INSTANZEN}` + + `&id_feuerwehren=${ID_FEUERWEHREN}`; function log(msg: string) { console.log(`[scraper] ${new Date().toISOString()} ${msg}`); @@ -131,10 +127,25 @@ async function scrapeMembers(frame: Frame): Promise { const frameTitle = await frame.title(); log(`Members frame loaded: ${frameUrl} — title: "${frameTitle}"`); - const tableClasses = await frame.$$eval('table', (ts) => - ts.map((t) => `${t.className || '(no-class)'}[${t.querySelectorAll('tr').length}rows]`), - ); - log(`Tables in frame: ${tableClasses.join(', ') || 'none'}`); + // The member list requires a POST (form submit) to show results. + // Navigate to the base page first (which loads VIEWSTATE etc.), then submit the search form. + const formExists = await frame.$('form[name="frmsearch"]') !== null; + log(`Search form found: ${formExists}`); + + if (!formExists) { + const tableClasses = await frame.$$eval('table', (ts) => + ts.map((t) => `${t.className || '(no-class)'}[${t.querySelectorAll('tr').length}rows]`), + ); + log(`Tables in frame: ${tableClasses.join(', ') || 'none'}`); + throw new Error(`frmsearch form not found on ${frameUrl} — cannot load member list`); + } + + // Submit the form as-is (no filters) to get all members + await frame.evaluate(() => { + (document as any).forms['frmsearch'].submit(); + }); + await frame.waitForLoadState('networkidle'); + log(`After form submit: ${frame.url()}`); // The member table uses class FdcLayList await frame.waitForSelector('table.FdcLayList', { timeout: 20000 });