From 0459f2642dc3598d20db292795b38a420e1bc020 Mon Sep 17 00:00:00 2001 From: ngosang Date: Sat, 16 Oct 2021 20:26:10 +0200 Subject: [PATCH] Fix Cloudflare resolver for Linux ARM builds --- src/index.ts | 8 +++++++- src/routes.ts | 24 ++++++++++++++---------- src/session.ts | 2 +- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/index.ts b/src/index.ts index bcbe3b0..5a7e102 100644 --- a/src/index.ts +++ b/src/index.ts @@ -46,6 +46,12 @@ async function testWebBrowserInstallation() { const page = await session.browser.newPage() await page.goto("https://www.google.com") webBrowserUserAgent = await page.evaluate(() => navigator.userAgent) + + // replace Linux ARM user-agent because it's detected + if (webBrowserUserAgent.toLocaleLowerCase().includes('linux arm')) { + webBrowserUserAgent = webBrowserUserAgent.replace(/linux arm[^;]+;/i, 'Linux x86_64;') + } + log.info("FlareSolverr User-Agent: " + webBrowserUserAgent) await page.close() await sessions.destroy(sessionId) @@ -177,7 +183,7 @@ testWebBrowserInstallation() if (!validateIncomingRequest(ctx, params)) { return } // process request - Router(ctx, params).catch(e => { + Router(ctx, params, webBrowserUserAgent).catch(e => { console.error(e) ctx.errorResponse(e.message) }) diff --git a/src/routes.ts b/src/routes.ts index a385bd4..5fa68fc 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -38,7 +38,7 @@ interface BaseRequestAPICall extends BaseAPICall { } interface Routes { - [key: string]: (ctx: RequestContext, params: BaseAPICall) => void | Promise + [key: string]: (ctx: RequestContext, params: BaseAPICall, webBrowserUserAgent: string) => void | Promise } interface ChallengeResolutionResultT { @@ -158,12 +158,16 @@ function mergeSessionWithParams({ defaults }: SessionsCacheItem, params: BaseReq return copy } -async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browser: Browser): Promise { +async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browser: Browser, + webBrowserUserAgent: string): Promise { const page = await browser.newPage() // merge session defaults with params const { method, postData, headers, cookies } = params + // the user-agent is changed just for linux arm build + await page.setUserAgent(webBrowserUserAgent) + // todo: redo all functionality // let overrideResolvers: OverrideResolvers = {} @@ -223,7 +227,7 @@ async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browse return page } -const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall) => { +const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall, webBrowserUserAgent: string) => { const oneTimeSession = params.session === undefined const sessionId = params.session || UUIDv1() const session = oneTimeSession @@ -239,7 +243,7 @@ const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall) = params = mergeSessionWithParams(session, params) try { - const page = await setupPage(ctx, params, session.browser) + const page = await setupPage(ctx, params, session.browser, webBrowserUserAgent) const data = await resolveChallengeWithTimeout(ctx, params, page) if (data) { @@ -274,7 +278,7 @@ export const routes: Routes = { if (await sessions.destroy(session)) { return ctx.successResponse('The session has been removed.') } ctx.errorResponse('This session does not exist.') }, - 'request.get': async (ctx, params: BaseRequestAPICall) => { + 'request.get': async (ctx, params: BaseRequestAPICall, webBrowserUserAgent: string) => { params.method = 'GET' if (params.userAgent) { log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.') @@ -282,9 +286,9 @@ export const routes: Routes = { if (params.postData) { return ctx.errorResponse('Cannot use "postBody" when sending a GET request.') } - await browserRequest(ctx, params) + await browserRequest(ctx, params, webBrowserUserAgent) }, - 'request.post': async (ctx, params: BaseRequestAPICall) => { + 'request.post': async (ctx, params: BaseRequestAPICall, webBrowserUserAgent: string) => { params.method = 'POST' if (params.userAgent) { log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.') @@ -292,12 +296,12 @@ export const routes: Routes = { if (!params.postData) { return ctx.errorResponse('Must send param "postBody" when sending a POST request.') } - await browserRequest(ctx, params) + await browserRequest(ctx, params, webBrowserUserAgent) }, } -export default async function Router(ctx: RequestContext, params: BaseAPICall): Promise { +export default async function Router(ctx: RequestContext, params: BaseAPICall, webBrowserUserAgent: string): Promise { const route = routes[params.cmd] - if (route) { return await route(ctx, params) } + if (route) { return await route(ctx, params, webBrowserUserAgent) } return ctx.errorResponse(`The command '${params.cmd}' is invalid.`) } diff --git a/src/session.ts b/src/session.ts index 967583d..2fcffa4 100644 --- a/src/session.ts +++ b/src/session.ts @@ -75,7 +75,7 @@ export default { puppeteerOptions.executablePath = path.join(path.dirname(process.execPath), 'chrome', exe) } - log.debug('Launching browser...') + log.debug('Launching web browser...') // TODO: maybe access env variable? // TODO: sometimes browser instances are created and not connected to correctly.