UNPKG

fakebrowser

Version:

🤖 Fake fingerprints to bypass anti-bot systems. Simulate mouse and keyboard operations to make behavior like a real person.

155 lines (154 loc) • 12.4 kB
"use strict"; // noinspection JSUnusedLocalSymbols,JSUnusedGlobalSymbols var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PptrPatcher = void 0; const path = __importStar(require("path")); const assert_1 = require("assert"); const axios_1 = __importDefault(require("axios")); const helper_1 = require("./helper"); const FakeBrowser_1 = require("./FakeBrowser"); class PptrPatcher { static async patch(browserUUID, pptr, params) { (0, assert_1.strict)(!!params.fakeDeviceDesc); const opts = { browserUUID: browserUUID, internalHttpServerPort: FakeBrowser_1.FakeBrowser.globalConfig.internalHttpServerPort, fakeDD: params.fakeDeviceDesc, proxyExportIP: params.proxy && params.proxy.exportIP, myRealExportIP: await helper_1.helper.myRealExportIP(), historyLength: helper_1.helper.rd(2, 10), }; // user action layer await this.patchUserActionLayer(browserUUID, pptr, params, opts); // evasions for (const evasionPath of params.evasionPaths) { const Plugin = require(evasionPath); const plugin = Plugin(opts); pptr.use(plugin); } // other plugins for (const plugin of params.usePlugins) { pptr.use(plugin); } // last, tidy up await this.patchLast(browserUUID, pptr, params, opts); } static patchUserActionLayer(uuid, pptr, params, opts) { if (params.displayUserActionLayer) { const Plugin = require(path.resolve(__dirname, '../plugins/user-action-layer')); const plugin = Plugin(opts); pptr.use(plugin); } } static patchLast(uuid, pptr, params, opts) { let Plugin = require(path.resolve(__dirname, '../plugins/evasions/zzzzzzzz.last')); let plugin = Plugin(opts); pptr.use(plugin); } /** * Package evasions to js string for worker to use * @param browser * @param jsContent */ static async patchWorkerJsContent(browser, jsContent) { const jsPatch = await this.evasionsCode(browser); jsContent = jsPatch + jsContent; return jsContent; } static async evasionsCode(browser) { let jsPatch = ''; const utils = require('../plugins/evasions/_utils'); // utils let utilsContent = `const utils = {};\n`; for (const [key, value] of Object.entries(utils)) { const utilsFuncCode = value.toString(); utilsContent += `utils.${key} = ${utilsFuncCode}; \n`; } utilsContent += `utils.init(); \n`; // code from puppeteer-extra const plugins = browser.pptrExtra.plugins; const runLast = plugins .filter(p => p.requirements.has('runLast')) .map(p => p.name); for (const name of runLast) { const index = plugins.findIndex(p => p.name === name); plugins.push(plugins.splice(index, 1)[0]); } for (const plugin of plugins) { if (plugin['onBrowser']) { await plugin['onBrowser'](browser.vanillaBrowser); } if (plugin['onServiceWorkerContent']) { // console.log(`SW Patch: ${plugin.name}`) jsPatch = await plugin['onServiceWorkerContent'](jsPatch); } } jsPatch = utilsContent + jsPatch; // when all evasions are patched, delete OffscreenCanvas.prototype.constructor.__cache return `(function() {${jsPatch};})(); \n\n const tmpVarNames = Object.getOwnPropertyNames( OffscreenCanvas.prototype.constructor, ).filter(e => e.startsWith('__$')); tmpVarNames.forEach(e => { delete OffscreenCanvas.prototype.constructor[e]; }); `; } static async patchServiceWorkerRequest(browser, requestId, request, responseHeaders, client) { try { let base64Encoded = true; let jsContent; if (responseHeaders && responseHeaders.length) { let body; ({ body, base64Encoded } = await client.send('Fetch.getResponseBody', { requestId })); jsContent = base64Encoded ? Buffer.from(body, 'base64').toString('utf-8') : body; } else { // TODO: get through proxy const jsResp = await axios_1.default.get(request.url, { headers: request.headers }); jsContent = jsResp.data; responseHeaders = Object.entries(jsResp.headers).map(e => ({ name: e[0], value: e[1] })); } jsContent = await this.patchWorkerJsContent(browser, jsContent); // The order I used is: Fetch.enable -> on Fetch.requestPaused event -> Fetch.getResponseBody -> Fetch.fulfillRequest -> Fetch.disable await client.send('Fetch.fulfillRequest', { requestId, responseCode: 200, responseHeaders: responseHeaders, body: 1 ? Buffer.from(jsContent).toString('base64') : jsContent, }); return true; } catch (ex) { console.error('SW inject failed', ex); await client.send('Fetch.failRequest', { requestId, errorReason: 'Aborted' }); } return false; } } exports.PptrPatcher = PptrPatcher; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHB0clBhdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9QcHRyUGF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMERBQTBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTFELDJDQUE0QjtBQUM1QixtQ0FBeUM7QUFFekMsa0RBQXlCO0FBSXpCLHFDQUFpQztBQUVqQywrQ0FBMkM7QUFZM0MsTUFBYSxXQUFXO0lBRXBCLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUNkLFdBQW1CLEVBQ25CLElBQW9CLEVBQ3BCLE1BQXdCO1FBRXhCLElBQUEsZUFBTSxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFL0IsTUFBTSxJQUFJLEdBQXlCO1lBQy9CLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLHNCQUFzQixFQUFFLHlCQUFXLENBQUMsWUFBWSxDQUFDLHNCQUFzQjtZQUN2RSxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWM7WUFDN0IsYUFBYSxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQ3BELGNBQWMsRUFBRSxNQUFNLGVBQU0sQ0FBQyxjQUFjLEVBQUU7WUFDN0MsYUFBYSxFQUFFLGVBQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztTQUNsQyxDQUFBO1FBRUQsb0JBQW9CO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRWhFLFdBQVc7UUFDWCxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDM0MsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ25DLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMzQixJQUFJLENB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