From 3fb60227dff71506ab99091f8fa747d9bcecf4be Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 4 Sep 2026 16:25:08 +0200 Subject: [PATCH] =?UTF-8?q?Verbessere=20Login-Handling:=20F=C3=BCge=20Unte?= =?UTF-8?q?rst=C3=BCtzung=20f=C3=BCr=20das=20automatische=20Hinzuf=C3=BCge?= =?UTF-8?q?n=20des=20Intent-Feldes=20im=20Login-Formular=20hinzu=20und=20v?= =?UTF-8?q?erbessere=20die=20Cookie-Verwaltung=20bei=20der=20Anmeldung.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/utils/mytischtennis-client.js | 32 +++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/server/utils/mytischtennis-client.js b/server/utils/mytischtennis-client.js index 7371621..0074b2d 100644 --- a/server/utils/mytischtennis-client.js +++ b/server/utils/mytischtennis-client.js @@ -108,16 +108,42 @@ async function loginWithBrowser(email, password) { await page.waitForTimeout(2_500) } - const submit = page.locator('button[type="submit"][name="intent"][value="login"], button[type="submit"], input[type="submit"]').first() + await page.evaluate(() => { + const form = document.querySelector('form[action*="/login"]') + if (!form) return + let intent = form.querySelector('input[name="intent"]') + if (!intent) { + intent = document.createElement('input') + intent.setAttribute('type', 'hidden') + intent.setAttribute('name', 'intent') + form.appendChild(intent) + } + intent.setAttribute('value', 'login') + }) + const submit = page.locator('button[type="submit"][name="intent"][value="login"]').first() + const genericSubmit = page.locator('button[type="submit"], input[type="submit"]').first() if (await submit.count()) await submit.click({ noWaitAfter: true }) + else if (await genericSubmit.count()) await genericSubmit.click({ noWaitAfter: true }) else await page.locator('form').evaluate(form => form.requestSubmit()) let cookie = null + let cookieNames = [] + let loginPageText = '' for (let attempt = 0; attempt < 40; attempt += 1) { - cookie = (await page.context().cookies(BASE_URL)).find(item => /^sb-\d+-auth-token$/.test(item.name)) + const cookies = await page.context().cookies() + cookieNames = cookies.map(item => item.name) + cookie = cookies.find(item => item.name === 'sb-10-auth-token' || /^sb-\d+-auth-token$/.test(item.name) || item.name.includes('auth-token')) if (cookie) break + if (attempt % 4 === 0) { + loginPageText = await page.locator('body').innerText().catch(() => '') + } await page.waitForTimeout(500) } - if (!cookie) throw new Error('CAPTCHA konnte nicht automatisch gelöst werden.') + if (!cookie) { + console.warn('[mytischtennis] Login after solved CAPTCHA did not create a session', { + url: page.url(), cookieNames, pageText: loginPageText.slice(0, 1_000) + }) + throw new Error('myTischtennis-Login nach gelöstem CAPTCHA fehlgeschlagen.') + } return `${cookie.name}=${cookie.value}` } finally { await browser.close() } }