mirror of
https://github.com/FlareSolverr/FlareSolverr.git
synced 2025-12-06 01:28:37 +01:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c951ba2523 | ||
|
|
6c598d5360 | ||
|
|
2893f72237 | ||
|
|
cd221bbbf1 | ||
|
|
68fb96f0d8 |
23
package-lock.json
generated
23
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "flaresolverr",
|
"name": "flaresolverr",
|
||||||
"version": "2.2.0",
|
"version": "2.2.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "flaresolverr",
|
"name": "flaresolverr",
|
||||||
"version": "2.1.0",
|
"version": "2.2.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"await-timeout": "^1.1.1",
|
"await-timeout": "^1.1.1",
|
||||||
@@ -25,7 +25,6 @@
|
|||||||
"@types/express": "^4.17.13",
|
"@types/express": "^4.17.13",
|
||||||
"@types/jest": "^27.0.2",
|
"@types/jest": "^27.0.2",
|
||||||
"@types/node": "^16.11.7",
|
"@types/node": "^16.11.7",
|
||||||
"@types/puppeteer": "^5.4.4",
|
|
||||||
"@types/supertest": "^2.0.11",
|
"@types/supertest": "^2.0.11",
|
||||||
"@types/uuid": "^8.3.1",
|
"@types/uuid": "^8.3.1",
|
||||||
"archiver": "^5.3.0",
|
"archiver": "^5.3.0",
|
||||||
@@ -1261,15 +1260,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/puppeteer": {
|
|
||||||
"version": "5.4.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.4.tgz",
|
|
||||||
"integrity": "sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/qs": {
|
"node_modules/@types/qs": {
|
||||||
"version": "6.9.7",
|
"version": "6.9.7",
|
||||||
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
|
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
|
||||||
@@ -8677,15 +8667,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true
|
"peer": true
|
||||||
},
|
},
|
||||||
"@types/puppeteer": {
|
|
||||||
"version": "5.4.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.4.tgz",
|
|
||||||
"integrity": "sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@types/qs": {
|
"@types/qs": {
|
||||||
"version": "6.9.7",
|
"version": "6.9.7",
|
||||||
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
|
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "flaresolverr",
|
"name": "flaresolverr",
|
||||||
"version": "2.2.0",
|
"version": "2.2.1",
|
||||||
"description": "Proxy server to bypass Cloudflare protection.",
|
"description": "Proxy server to bypass Cloudflare protection.",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "tsc && node ./dist/server.js",
|
"start": "tsc && node ./dist/server.js",
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
"@types/express": "^4.17.13",
|
"@types/express": "^4.17.13",
|
||||||
"@types/jest": "^27.0.2",
|
"@types/jest": "^27.0.2",
|
||||||
"@types/node": "^16.11.7",
|
"@types/node": "^16.11.7",
|
||||||
"@types/puppeteer": "^5.4.4",
|
|
||||||
"@types/supertest": "^2.0.11",
|
"@types/supertest": "^2.0.11",
|
||||||
"@types/uuid": "^8.3.1",
|
"@types/uuid": "^8.3.1",
|
||||||
"archiver": "^5.3.0",
|
"archiver": "^5.3.0",
|
||||||
|
|||||||
@@ -39,6 +39,11 @@ process.on('SIGTERM', () => {
|
|||||||
process.exit(0)
|
process.exit(0)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
process.on('uncaughtException', function(err) {
|
||||||
|
// Avoid crashing in NodeJS 17 due to UnhandledPromiseRejectionWarning: Unhandled promise rejection.
|
||||||
|
log.error(err)
|
||||||
|
})
|
||||||
|
|
||||||
validateEnvironmentVariables();
|
validateEnvironmentVariables();
|
||||||
|
|
||||||
testWebBrowserInstallation().then(() => {
|
testWebBrowserInstallation().then(() => {
|
||||||
|
|||||||
@@ -57,8 +57,12 @@ function buildExtraPrefsFirefox(proxy: Proxy): object {
|
|||||||
|
|
||||||
// proxy.url format => http://<host>:<port>
|
// proxy.url format => http://<host>:<port>
|
||||||
if (proxy && proxy.url) {
|
if (proxy && proxy.url) {
|
||||||
|
log.debug(`Using proxy: ${proxy.url}`)
|
||||||
const [host, portStr] = proxy.url.replace(/.+:\/\//g, '').split(':');
|
const [host, portStr] = proxy.url.replace(/.+:\/\//g, '').split(':');
|
||||||
const port = parseInt(portStr);
|
const port = parseInt(portStr);
|
||||||
|
if (!host || !portStr || !port) {
|
||||||
|
throw new Error("Proxy configuration is invalid! Use the format: protocol://ip:port")
|
||||||
|
}
|
||||||
|
|
||||||
const proxyPrefs = {
|
const proxyPrefs = {
|
||||||
"network.proxy.type": 1,
|
"network.proxy.type": 1,
|
||||||
@@ -118,7 +122,8 @@ export async function testWebBrowserInstallation(): Promise<void> {
|
|||||||
oneTimeSession: true
|
oneTimeSession: true
|
||||||
})
|
})
|
||||||
const page = await session.browser.newPage()
|
const page = await session.browser.newPage()
|
||||||
await page.goto(testUrl)
|
const pageTimeout = Number(process.env.BROWSER_TIMEOUT) || 40000
|
||||||
|
await page.goto(testUrl, {waitUntil: 'domcontentloaded', timeout: pageTimeout})
|
||||||
webBrowserUserAgent = await page.evaluate(() => navigator.userAgent)
|
webBrowserUserAgent = await page.evaluate(() => navigator.userAgent)
|
||||||
|
|
||||||
// replace Linux ARM user-agent because it's detected
|
// replace Linux ARM user-agent because it's detected
|
||||||
@@ -134,6 +139,8 @@ export async function testWebBrowserInstallation(): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function create(session: string, options: SessionCreateOptions): Promise<SessionsCacheItem> {
|
export async function create(session: string, options: SessionCreateOptions): Promise<SessionsCacheItem> {
|
||||||
|
log.debug('Creating new session...')
|
||||||
|
|
||||||
const sessionId = session || UUIDv1()
|
const sessionId = session || UUIDv1()
|
||||||
|
|
||||||
// NOTE: cookies can't be set in the session, you need to open the page first
|
// NOTE: cookies can't be set in the session, you need to open the page first
|
||||||
@@ -141,7 +148,7 @@ export async function create(session: string, options: SessionCreateOptions): Pr
|
|||||||
const puppeteerOptions: any = {
|
const puppeteerOptions: any = {
|
||||||
product: 'firefox',
|
product: 'firefox',
|
||||||
headless: process.env.HEADLESS !== 'false',
|
headless: process.env.HEADLESS !== 'false',
|
||||||
timeout: process.env.BROWSER_TIMEOUT || 40000
|
timeout: Number(process.env.BROWSER_TIMEOUT) || 40000
|
||||||
}
|
}
|
||||||
|
|
||||||
puppeteerOptions.extraPrefsFirefox = buildExtraPrefsFirefox(options.proxy)
|
puppeteerOptions.extraPrefsFirefox = buildExtraPrefsFirefox(options.proxy)
|
||||||
|
|||||||
@@ -89,7 +89,11 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
|
|||||||
// is response is ok
|
// is response is ok
|
||||||
// reload the page to be sure we get the real page
|
// reload the page to be sure we get the real page
|
||||||
log.debug("Reloading the page")
|
log.debug("Reloading the page")
|
||||||
response = await gotoPage(params, page);
|
try {
|
||||||
|
response = await gotoPage(params, page);
|
||||||
|
} catch (e) {
|
||||||
|
log.warn("Page not reloaded (do not report!): Cause: " + e.toString())
|
||||||
|
}
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
status = "error";
|
status = "error";
|
||||||
@@ -129,14 +133,17 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> {
|
async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> {
|
||||||
let response: HTTPResponse;
|
let pageTimeout = params.maxTimeout / 3;
|
||||||
if (params.method != 'POST') {
|
let response: HTTPResponse
|
||||||
response = await page.goto(params.url, {waitUntil: 'domcontentloaded'});
|
try {
|
||||||
|
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
|
||||||
|
} catch (e) {
|
||||||
|
// retry
|
||||||
|
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: 2000});
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
if (params.method == 'POST') {
|
||||||
// post hack
|
// post hack
|
||||||
// first request a page without cloudflare
|
|
||||||
response = await page.goto(params.url, {waitUntil: 'domcontentloaded'});
|
|
||||||
await page.setContent(
|
await page.setContent(
|
||||||
`
|
`
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|||||||
Reference in New Issue
Block a user