mirror of
https://github.com/FlareSolverr/FlareSolverr.git
synced 2025-12-05 17:18:19 +01:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c4e4d28c8d | ||
|
|
543ce89eb6 | ||
|
|
0f30e17ef1 | ||
|
|
24f1b4ec6f | ||
|
|
f3b30268c3 |
15
README.md
15
README.md
@@ -8,9 +8,7 @@
|
|||||||
[](https://www.buymeacoffee.com/ngosang)
|
[](https://www.buymeacoffee.com/ngosang)
|
||||||
[](https://en.cryptobadges.io/donate/13Hcv77AdnFWEUZ9qUpoPBttQsUT7q9TTh)
|
[](https://en.cryptobadges.io/donate/13Hcv77AdnFWEUZ9qUpoPBttQsUT7q9TTh)
|
||||||
|
|
||||||
FlareSolverr is a proxy server to bypass Cloudflare protection
|
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.
|
|
||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
@@ -68,11 +66,12 @@ This is the recommended way for Windows users.
|
|||||||
### From source code
|
### From source code
|
||||||
|
|
||||||
This is the recommended way for macOS users and for developers.
|
This is the recommended way for macOS users and for developers.
|
||||||
* Install [NodeJS](https://nodejs.org/)
|
* Install [NodeJS](https://nodejs.org/).
|
||||||
* Clone this repository and open a shell in that path
|
* Clone this repository and open a shell in that path.
|
||||||
* Run `npm install` command to install FlareSolverr dependencies
|
* Run `npm install` command to install FlareSolverr dependencies.
|
||||||
* Run `npm run build` command to compile TypeScript code
|
* Run `node node_modules/puppeteer/install.js` to install Chromium.
|
||||||
* Run `npm start` command to start FlareSolverr
|
* Run `npm run build` command to compile TypeScript code.
|
||||||
|
* Run `npm start` command to start FlareSolverr.
|
||||||
|
|
||||||
### Systemd service
|
### Systemd service
|
||||||
|
|
||||||
|
|||||||
2
package-lock.json
generated
2
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "flaresolverr",
|
"name": "flaresolverr",
|
||||||
"version": "1.2.6",
|
"version": "1.2.8",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "flaresolverr",
|
"name": "flaresolverr",
|
||||||
"version": "1.2.6",
|
"version": "1.2.8",
|
||||||
"description": "Proxy server to bypass Cloudflare protection.",
|
"description": "Proxy server to bypass Cloudflare protection.",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./dist/index.js",
|
"start": "node ./dist/index.js",
|
||||||
|
|||||||
@@ -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,11 @@ 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()
|
||||||
|
await page.content()
|
||||||
|
log.info('Challenge solved.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user