From c6677f4d8445383390019159357bec5d5e55dd09 Mon Sep 17 00:00:00 2001 From: ngosang Date: Sun, 30 May 2021 13:40:17 +0200 Subject: [PATCH] Handle new Cloudflare challenge. Resolves #135 Resolves #134 --- src/index.ts | 2 +- src/providers/cloudflare.ts | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 231965633d..25bf7030e5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -77,7 +77,7 @@ function errorResponse(errorMsg: string, res: ServerResponse, startTimestamp: nu function successResponse(successMsg: string, extendedProperties: object, res: ServerResponse, startTimestamp: number) { const endTimestamp = Date.now() - log.info(`Successful response in ${(endTimestamp - startTimestamp) / 1000} s`) + log.info(`Response in ${(endTimestamp - startTimestamp) / 1000} s`) if (successMsg) { log.info(successMsg) } const response = Object.assign({ diff --git a/src/providers/cloudflare.ts b/src/providers/cloudflare.ts index 6550cb3a4e..e215af0af5 100644 --- a/src/providers/cloudflare.ts +++ b/src/providers/cloudflare.ts @@ -8,7 +8,7 @@ import getCaptchaSolver, {CaptchaType} from "../captcha"; * This class contains the logic to solve protections provided by CloudFlare **/ -const CHALLENGE_SELECTORS = ['#trk_jschal_js', '.ray_id', '.attack-box']; +const CHALLENGE_SELECTORS = ['#trk_jschal_js', '.ray_id', '.attack-box', '#cf-please-wait']; const TOKEN_INPUT_NAMES = ['g-recaptcha-response', 'h-captcha-response']; export default async function resolveChallenge(url: string, page: Page, response: Response): Promise { @@ -38,16 +38,30 @@ export default async function resolveChallenge(url: string, page: Page, response await page.waitFor(1000) try { // catch exception timeout in waitForNavigation - response = await page.waitForNavigation({ waitUntil: 'domcontentloaded', timeout: 5000 }) + response = await page.waitForNavigation({ waitUntil: 'domcontentloaded', timeout: 9000 }) } catch (error) { } try { // catch Execution context was destroyed const cfChallengeElem = await page.$(selector) - if (!cfChallengeElem) { break } + if (!cfChallengeElem) { + // solved! + break + } else { + const displayStyle = await page.evaluate((selector) => { + return getComputedStyle(document.querySelector(selector)).getPropertyValue("display"); + }, selector); + if (displayStyle == "none") { + // spinner is hidden, could be a captcha or not + await page.waitFor(1000) + break + } + } log.debug('Found challenge element again...') } catch (error) - { } + { + log.debug("Unexpected error: " + error); + } response = await page.reload({ waitUntil: 'domcontentloaded' }) log.debug('Page reloaded.')