Improvements in Cloudflare redirect detection. Resolves #140

This commit is contained in:
ngosang 2021-06-01 01:21:06 +02:00
parent f3b30268c3
commit 24f1b4ec6f

View File

@ -35,37 +35,49 @@ export default async function resolveChallenge(url: string, page: Page, response
log.debug('Waiting for Cloudflare challenge...') log.debug('Waiting for Cloudflare challenge...')
while (true) { while (true) {
await page.waitFor(1000)
try {
// catch exception timeout in waitForNavigation
response = await page.waitForNavigation({ waitUntil: 'domcontentloaded', timeout: 9000 })
} catch (error) { }
try { try {
// catch Execution context was destroyed // catch Execution context was destroyed
const cfChallengeElem = await page.$(selector) const cfChallengeElem = await page.$(selector)
if (!cfChallengeElem) { if (!cfChallengeElem) {
// solved! // solved!
log.debug('Challenge element not found.')
break break
} else { } else {
// new Cloudflare Challenge #cf-please-wait
const displayStyle = await page.evaluate((selector) => { const displayStyle = await page.evaluate((selector) => {
return getComputedStyle(document.querySelector(selector)).getPropertyValue("display"); return getComputedStyle(document.querySelector(selector)).getPropertyValue("display");
}, selector); }, selector);
if (displayStyle == "none") { if (displayStyle == "none") {
// spinner is hidden, could be a captcha or not // spinner is hidden, could be a captcha or not
await page.waitFor(1000) log.debug('Challenge element is hidden.')
// wait until redirecting disappears
while (true) {
try {
await page.waitFor(1000)
const displayStyle2 = await page.evaluate(() => {
return getComputedStyle(document.querySelector('#cf-spinner-redirecting')).getPropertyValue("display");
});
if (displayStyle2 == "none") {
break // hCaptcha detected
}
} catch (error) {
break // redirection completed
}
}
break break
} else {
log.debug('Challenge element is visible.')
} }
} }
log.debug('Found challenge element again...') log.debug('Found challenge element again.')
} catch (error) } catch (error)
{ {
log.debug("Unexpected error: " + error); log.debug("Unexpected error: " + error);
break
} }
response = await page.reload({ waitUntil: 'domcontentloaded' }) log.debug('Waiting for Cloudflare challenge...')
log.debug('Page reloaded.') await page.waitFor(1000)
log.html(await page.content())
} }
log.debug('Validating HTML code...') log.debug('Validating HTML code...')
@ -171,6 +183,10 @@ export default async function resolveChallenge(url: string, page: Page, response
if (selectorFoundCount == 0) if (selectorFoundCount == 0)
{ {
throw new Error('No challenge selectors found, unable to proceed') throw new Error('No challenge selectors found, unable to proceed')
} else {
// reload the page to make sure we get the real response
response = await page.reload()
log.info('Challenge solved.');
} }
} }