Compare commits

...

5 Commits

Author SHA1 Message Date
ngosang
c4e4d28c8d Bump version 1.2.8 2021-06-01 02:00:39 +02:00
ngosang
543ce89eb6 Improve old JS challenge waiting. Resolves #129 2021-06-01 01:59:57 +02:00
ngosang
0f30e17ef1 Bump version 1.2.7 2021-06-01 01:22:36 +02:00
ngosang
24f1b4ec6f Improvements in Cloudflare redirect detection. Resolves #140 2021-06-01 01:21:06 +02:00
ngosang
f3b30268c3 Fix installation instructions 2021-05-31 22:59:51 +02:00
4 changed files with 37 additions and 21 deletions

View File

@@ -8,9 +8,7 @@
[![Donate Buy Me A Coffee](https://img.shields.io/badge/Donate-Buy%20me%20a%20coffee-yellow.svg)](https://www.buymeacoffee.com/ngosang)
[![Donate Bitcoin](https://img.shields.io/badge/Donate-Bitcoin-orange.svg)](https://en.cryptobadges.io/donate/13Hcv77AdnFWEUZ9qUpoPBttQsUT7q9TTh)
FlareSolverr is a proxy server to bypass Cloudflare protection
:warning: This project is in beta state. Some things may not work and the API can change at any time.
FlareSolverr is a proxy server to bypass Cloudflare protection.
## How it works
@@ -68,11 +66,12 @@ This is the recommended way for Windows users.
### From source code
This is the recommended way for macOS users and for developers.
* Install [NodeJS](https://nodejs.org/)
* Clone this repository and open a shell in that path
* Run `npm install` command to install FlareSolverr dependencies
* Run `npm run build` command to compile TypeScript code
* Run `npm start` command to start FlareSolverr
* Install [NodeJS](https://nodejs.org/).
* Clone this repository and open a shell in that path.
* Run `npm install` command to install FlareSolverr dependencies.
* Run `node node_modules/puppeteer/install.js` to install Chromium.
* Run `npm run build` command to compile TypeScript code.
* Run `npm start` command to start FlareSolverr.
### Systemd service

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "flaresolverr",
"version": "1.2.6",
"version": "1.2.8",
"lockfileVersion": 2,
"requires": true,
"packages": {

View File

@@ -1,6 +1,6 @@
{
"name": "flaresolverr",
"version": "1.2.6",
"version": "1.2.8",
"description": "Proxy server to bypass Cloudflare protection.",
"scripts": {
"start": "node ./dist/index.js",

View File

@@ -35,37 +35,49 @@ export default async function resolveChallenge(url: string, page: Page, response
log.debug('Waiting for Cloudflare challenge...')
while (true) {
await page.waitFor(1000)
try {
// catch exception timeout in waitForNavigation
response = await page.waitForNavigation({ waitUntil: 'domcontentloaded', timeout: 9000 })
} catch (error) { }
try {
// catch Execution context was destroyed
const cfChallengeElem = await page.$(selector)
if (!cfChallengeElem) {
// solved!
log.debug('Challenge element not found.')
break
} else {
// new Cloudflare Challenge #cf-please-wait
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)
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
} else {
log.debug('Challenge element is visible.')
}
}
log.debug('Found challenge element again...')
log.debug('Found challenge element again.')
} catch (error)
{
log.debug("Unexpected error: " + error);
break
}
response = await page.reload({ waitUntil: 'domcontentloaded' })
log.debug('Page reloaded.')
log.html(await page.content())
log.debug('Waiting for Cloudflare challenge...')
await page.waitFor(1000)
}
log.debug('Validating HTML code...')
@@ -171,6 +183,11 @@ export default async function resolveChallenge(url: string, page: Page, response
if (selectorFoundCount == 0)
{
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()
await page.content()
log.info('Challenge solved.');
}
}