mirror of
https://github.com/FlareSolverr/FlareSolverr.git
synced 2025-06-08 12:35:30 +00:00
Improvements in Cloudflare redirect detection. Resolves #140
This commit is contained in:
parent
f3b30268c3
commit
24f1b4ec6f
@ -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.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user