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
JavaScript
;
// 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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