Fix Cloudflare resolver for Linux ARM builds

This commit is contained in:
ngosang 2021-10-16 20:26:10 +02:00
parent ca3f84f458
commit 0459f2642d
3 changed files with 22 additions and 12 deletions

View File

@ -46,6 +46,12 @@ async function testWebBrowserInstallation() {
const page = await session.browser.newPage() const page = await session.browser.newPage()
await page.goto("https://www.google.com") await page.goto("https://www.google.com")
webBrowserUserAgent = await page.evaluate(() => navigator.userAgent) 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) log.info("FlareSolverr User-Agent: " + webBrowserUserAgent)
await page.close() await page.close()
await sessions.destroy(sessionId) await sessions.destroy(sessionId)
@ -177,7 +183,7 @@ testWebBrowserInstallation()
if (!validateIncomingRequest(ctx, params)) { return } if (!validateIncomingRequest(ctx, params)) { return }
// process request // process request
Router(ctx, params).catch(e => { Router(ctx, params, webBrowserUserAgent).catch(e => {
console.error(e) console.error(e)
ctx.errorResponse(e.message) ctx.errorResponse(e.message)
}) })

View File

@ -38,7 +38,7 @@ interface BaseRequestAPICall extends BaseAPICall {
} }
interface Routes { interface Routes {
[key: string]: (ctx: RequestContext, params: BaseAPICall) => void | Promise<void> [key: string]: (ctx: RequestContext, params: BaseAPICall, webBrowserUserAgent: string) => void | Promise<void>
} }
interface ChallengeResolutionResultT { interface ChallengeResolutionResultT {
@ -158,12 +158,16 @@ function mergeSessionWithParams({ defaults }: SessionsCacheItem, params: BaseReq
return copy return copy
} }
async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browser: Browser): Promise<Page> { async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browser: Browser,
webBrowserUserAgent: string): Promise<Page> {
const page = await browser.newPage() const page = await browser.newPage()
// merge session defaults with params // merge session defaults with params
const { method, postData, headers, cookies } = 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 // todo: redo all functionality
// let overrideResolvers: OverrideResolvers = {} // let overrideResolvers: OverrideResolvers = {}
@ -223,7 +227,7 @@ async function setupPage(ctx: RequestContext, params: BaseRequestAPICall, browse
return page return page
} }
const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall) => { const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall, webBrowserUserAgent: string) => {
const oneTimeSession = params.session === undefined const oneTimeSession = params.session === undefined
const sessionId = params.session || UUIDv1() const sessionId = params.session || UUIDv1()
const session = oneTimeSession const session = oneTimeSession
@ -239,7 +243,7 @@ const browserRequest = async (ctx: RequestContext, params: BaseRequestAPICall) =
params = mergeSessionWithParams(session, params) params = mergeSessionWithParams(session, params)
try { 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) const data = await resolveChallengeWithTimeout(ctx, params, page)
if (data) { if (data) {
@ -274,7 +278,7 @@ export const routes: Routes = {
if (await sessions.destroy(session)) { return ctx.successResponse('The session has been removed.') } if (await sessions.destroy(session)) { return ctx.successResponse('The session has been removed.') }
ctx.errorResponse('This session does not exist.') ctx.errorResponse('This session does not exist.')
}, },
'request.get': async (ctx, params: BaseRequestAPICall) => { 'request.get': async (ctx, params: BaseRequestAPICall, webBrowserUserAgent: string) => {
params.method = 'GET' params.method = 'GET'
if (params.userAgent) { if (params.userAgent) {
log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.') log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.')
@ -282,9 +286,9 @@ export const routes: Routes = {
if (params.postData) { if (params.postData) {
return ctx.errorResponse('Cannot use "postBody" when sending a GET request.') 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' params.method = 'POST'
if (params.userAgent) { if (params.userAgent) {
log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.') log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.')
@ -292,12 +296,12 @@ export const routes: Routes = {
if (!params.postData) { if (!params.postData) {
return ctx.errorResponse('Must send param "postBody" when sending a POST request.') 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<void> { export default async function Router(ctx: RequestContext, params: BaseAPICall, webBrowserUserAgent: string): Promise<void> {
const route = routes[params.cmd] 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.`) return ctx.errorResponse(`The command '${params.cmd}' is invalid.`)
} }

View File

@ -75,7 +75,7 @@ export default {
puppeteerOptions.executablePath = path.join(path.dirname(process.execPath), 'chrome', exe) 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: maybe access env variable?
// TODO: sometimes browser instances are created and not connected to correctly. // TODO: sometimes browser instances are created and not connected to correctly.