From 943fdbbf0c83bfb7f6ab5af78544582fd0425604 Mon Sep 17 00:00:00 2001 From: nocci Date: Wed, 31 Dec 2025 13:27:59 +0000 Subject: [PATCH 1/2] fix: check remember-me and handle split email/password epic login --- epic-claimer-new.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/epic-claimer-new.js b/epic-claimer-new.js index 2fef517..619782b 100644 --- a/epic-claimer-new.js +++ b/epic-claimer-new.js @@ -127,11 +127,21 @@ const ensureLoggedIn = async (page, context) => { await page.goto('https://www.epicgames.com/id/login?lang=en-US&noHostRedirect=true&redirectUrl=' + URL_CLAIM, { waitUntil: 'domcontentloaded' }); const emailField = page.locator('input[name="email"], input#email'); const passwordField = page.locator('input[name="password"], input#password'); - // Some flows pre-fill email and show only password field - if (await emailField.count()) await emailField.fill(cfg.eg_email); + const continueBtn = page.locator('button:has-text("Continue"), button[type="submit"]'); + + // step 1: email + continue + if (await emailField.count()) { + await emailField.fill(cfg.eg_email); + await continueBtn.first().click(); + } + + // step 2: password + submit await passwordField.waitFor({ timeout: cfg.login_visible_timeout }); await passwordField.fill(cfg.eg_password); + const rememberMe = page.locator('input[name="rememberMe"], #rememberMe'); + if (await rememberMe.count()) await rememberMe.check().catch(() => {}); await page.click('button[type="submit"]'); + // MFA step try { await page.waitForURL('**/id/login/mfa**', { timeout: cfg.login_timeout }); From 2592de22853224489e7a7acfc691bdcbf537ff43 Mon Sep 17 00:00:00 2001 From: nocci Date: Wed, 31 Dec 2025 13:28:30 +0000 Subject: [PATCH 2/2] fix: handle epic MFA code inputs with multiple fields --- epic-claimer-new.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/epic-claimer-new.js b/epic-claimer-new.js index 619782b..aef8bae 100644 --- a/epic-claimer-new.js +++ b/epic-claimer-new.js @@ -146,7 +146,16 @@ const ensureLoggedIn = async (page, context) => { try { await page.waitForURL('**/id/login/mfa**', { timeout: cfg.login_timeout }); const otp = cfg.eg_otpkey && authenticator.generate(cfg.eg_otpkey) || await prompt({ type: 'text', message: 'Enter two-factor sign in code', validate: n => n.toString().length == 6 || 'The code must be 6 digits!' }); - await page.locator('input[name="code-input-0"]').pressSequentially(otp.toString()); + const codeInputs = page.locator('input[name^="code-input"]'); + if (await codeInputs.count()) { + const digits = otp.toString().split(''); + for (let i = 0; i < digits.length; i++) { + const input = codeInputs.nth(i); + await input.fill(digits[i]); + } + } else { + await page.locator('input[name="code-input-0"]').pressSequentially(otp.toString()); + } await page.click('button[type="submit"]'); } catch { // no MFA