Verbessere CAPTCHA-Handling im Login-Prozess: Füge detaillierte Protokollierung des CAPTCHA-Status hinzu und verbessere die Handhabung des CAPTCHA-Widgets.
This commit is contained in:
@@ -34,7 +34,10 @@ async function loginDirect(email, password) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function loginWithBrowser(email, password) {
|
async function loginWithBrowser(email, password) {
|
||||||
const browser = await chromium.launch({ headless: true, args: ['--disable-dev-shm-usage'] })
|
const browser = await chromium.launch({
|
||||||
|
headless: true,
|
||||||
|
args: ['--no-sandbox', '--disable-dev-shm-usage']
|
||||||
|
})
|
||||||
try {
|
try {
|
||||||
const page = await browser.newPage()
|
const page = await browser.newPage()
|
||||||
// Das myTT-CAPTCHA wird erst nach dem Laden der Seite erzeugt. Der Ablauf
|
// Das myTT-CAPTCHA wird erst nach dem Laden der Seite erzeugt. Der Ablauf
|
||||||
@@ -60,10 +63,19 @@ async function loginWithBrowser(email, password) {
|
|||||||
await page.locator('input[name="email"]').fill(email)
|
await page.locator('input[name="email"]').fill(email)
|
||||||
await page.locator('input[name="password"]').fill(password)
|
await page.locator('input[name="password"]').fill(password)
|
||||||
|
|
||||||
|
// Exakt wie in trainingstagebuch: Das Widget wird nach dem DOM-Load
|
||||||
|
// nachgeladen; ein sofortiges count() würde es häufig übersehen.
|
||||||
|
await page.waitForSelector('private-captcha', { timeout: 8_000 }).catch(() => {})
|
||||||
const captchaHost = page.locator('private-captcha').first()
|
const captchaHost = page.locator('private-captcha').first()
|
||||||
const hasCaptcha = await captchaHost.count() > 0
|
const hasCaptcha = await captchaHost.count() > 0
|
||||||
|
console.info('[mytischtennis] CAPTCHA widget detected:', hasCaptcha)
|
||||||
if (hasCaptcha) {
|
if (hasCaptcha) {
|
||||||
await page.waitForTimeout(1_200)
|
await page.waitForTimeout(1_200)
|
||||||
|
// Ein echter Playwright-Klick erzeugt im Gegensatz zu element.click() ein
|
||||||
|
// vertrauenswürdiges Pointer-Ereignis für das Widget.
|
||||||
|
await captchaHost.click({ timeout: 5_000, force: true }).catch(error => {
|
||||||
|
console.warn('[mytischtennis] CAPTCHA pointer click failed:', error.message)
|
||||||
|
})
|
||||||
await page.evaluate(() => {
|
await page.evaluate(() => {
|
||||||
const host = document.querySelector('private-captcha')
|
const host = document.querySelector('private-captcha')
|
||||||
const checkbox = host?.shadowRoot?.querySelector('#pc-checkbox')
|
const checkbox = host?.shadowRoot?.querySelector('#pc-checkbox')
|
||||||
@@ -77,7 +89,21 @@ async function loginWithBrowser(email, password) {
|
|||||||
const clicked = document.querySelector('input[name="captcha_clicked"]')?.value?.toLowerCase() || ''
|
const clicked = document.querySelector('input[name="captcha_clicked"]')?.value?.toLowerCase() || ''
|
||||||
return token.length > 80 && (clicked === 'true' || clicked === '1')
|
return token.length > 80 && (clicked === 'true' || clicked === '1')
|
||||||
}, { timeout: 32_000 }).catch(() => {})
|
}, { timeout: 32_000 }).catch(() => {})
|
||||||
const captchaReady = await page.evaluate(() => (document.querySelector('input[name="captcha"]')?.value?.trim().length || 0) > 80)
|
const captchaState = await page.evaluate(() => {
|
||||||
|
const host = document.querySelector('private-captcha')
|
||||||
|
const checkbox = host?.shadowRoot?.querySelector('#pc-checkbox')
|
||||||
|
const token = document.querySelector('input[name="captcha"]')?.value?.trim() || ''
|
||||||
|
return {
|
||||||
|
tokenLength: token.length,
|
||||||
|
clicked: document.querySelector('input[name="captcha_clicked"]')?.value || null,
|
||||||
|
shadowRoot: Boolean(host?.shadowRoot),
|
||||||
|
checkboxFound: Boolean(checkbox),
|
||||||
|
checkboxChecked: Boolean(checkbox?.checked),
|
||||||
|
widgetState: host?.getAttribute('data-state') || null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
console.info('[mytischtennis] CAPTCHA state after wait:', captchaState)
|
||||||
|
const captchaReady = captchaState.tokenLength > 80
|
||||||
if (!captchaReady) throw new Error('CAPTCHA konnte nicht automatisch gelöst werden.')
|
if (!captchaReady) throw new Error('CAPTCHA konnte nicht automatisch gelöst werden.')
|
||||||
await page.waitForTimeout(2_500)
|
await page.waitForTimeout(2_500)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user