fakebrowser
Version:
🤖 Fake fingerprints to bypass anti-bot systems. Simulate mouse and keyboard operations to make behavior like a real person.
194 lines • 14.8 kB
JavaScript
import { strict as assert } from 'assert';
import * as fs from 'fs-extra';
import { addExtra } from 'puppeteer-extra';
import DeviceDescriptorHelper from './DeviceDescriptor.js';
import { UserAgentHelper } from './UserAgentHelper.js';
import { PptrPatcher } from './PptrPatcher';
export const kDefaultTimeout = 15 * 1000;
export const kDefaultLaunchOptions = {
headless: true,
devtools: false,
timeout: kDefaultTimeout,
};
export default class Driver {
static checkParamsLegal(params) {
// deviceDesc must be set
const dd = params.deviceDesc;
assert(dd, 'deviceDesc must be set');
DeviceDescriptorHelper.checkLegal(dd);
// user data dir
// The userDataDir in launchParameters must be set
assert(params.userDataDir, 'userDataDir must be set');
}
/**
* Connect to browser
* @param uuid
* @param params
*/
static async connect(uuid, params) {
// Different instances with different puppeteer configurations
const pptr = addExtra(require('puppeteer'));
// patch with evasions
if (!params.doNotHook) {
await PptrPatcher.patch(uuid, pptr, params);
}
const fakeDD = params.fakeDeviceDesc;
assert(!!fakeDD);
const browser = await pptr.connect(params.connectOptions);
await this.patchUAFromLaunchedBrowser(browser, fakeDD);
return {
vanillaBrowser: browser,
pptrExtra: pptr,
};
}
/**
* Launch browser
* @param uuid
* @param defaultLaunchArgs
* @param params
*/
static async launch(uuid, defaultLaunchArgs, params) {
this.checkParamsLegal(params);
if (!params.launchOptions
|| Object.keys(params.launchOptions).length === 0) {
params.launchOptions = kDefaultLaunchOptions;
}
this.patchLaunchArgs(defaultLaunchArgs, params);
// Different instances with different puppeteer configurations
const pptr = addExtra(require('puppeteer'));
// patch with evasions
if (!params.doNotHook) {
await PptrPatcher.patch(uuid, pptr, params);
}
const fakeDD = params.fakeDeviceDesc;
assert(!!fakeDD);
const browser = await pptr.launch(params.launchOptions);
await this.patchUAFromLaunchedBrowser(browser, fakeDD);
return {
vanillaBrowser: browser,
pptrExtra: pptr,
};
}
static async patchUAFromLaunchedBrowser(browser, fakeDD) {
// read major version from the launched browser and replace dd.userAgent
const orgUA = await browser.userAgent();
const orgVersion = UserAgentHelper.chromeVersion(orgUA);
const fakeVersion = UserAgentHelper.chromeVersion(fakeDD.navigator.userAgent);
assert(orgVersion);
assert(fakeVersion);
fakeDD.navigator.userAgent = fakeDD.navigator.userAgent.replace(fakeVersion, orgVersion);
fakeDD.navigator.appVersion = fakeDD.navigator.appVersion.replace(fakeVersion, orgVersion);
}
static patchLaunchArgs(defaultLaunchArgs, launchParams) {
// args
// noinspection SuspiciousTypeOfGuard
assert(defaultLaunchArgs instanceof Array);
const args = [
...defaultLaunchArgs,
...(launchParams.launchOptions.args || []),
];
const fakeDD = launchParams.fakeDeviceDesc;
assert(!!fakeDD);
// Modify default options
launchParams.launchOptions = {
ignoreHTTPSErrors: true,
ignoreDefaultArgs: [
'--enable-automation',
'--enable-blink-features=IdleDetection',
],
handleSIGINT: false,
handleSIGTERM: false,
handleSIGHUP: false,
pipe: true,
defaultViewport: {
width: fakeDD.window.innerWidth,
height: fakeDD.window.innerHeight,
deviceScaleFactor: fakeDD.window.devicePixelRatio,
isMobile: UserAgentHelper.isMobile(fakeDD.navigator.userAgent),
hasTouch: fakeDD.navigator.maxTouchPoints > 0,
isLandscape: false,
},
...launchParams.launchOptions,
args,
};
// headless
let headless = launchParams.launchOptions.headless;
if ('undefined' === typeof headless) {
headless = true;
}
if (launchParams.launchOptions.devtools) {
headless = false;
}
// proxy
if (launchParams.proxy) {
args.push(`--proxy-server=${launchParams.proxy.proxy}`);
}
// browser language
assert(fakeDD.acceptLanguage);
args.push(`--lang=${fakeDD.acceptLanguage}`);
const userDataDir = launchParams.userDataDir;
assert(userDataDir);
fs.mkdirSync(userDataDir, { recursive: true }); // throw exception
args.push(`--user-data-dir=${userDataDir}`);
// window position & window size
let { screenX, screenY, innerWidth, innerHeight, outerWidth, outerHeight, } = fakeDD.window;
outerWidth = outerWidth || innerWidth;
outerHeight = outerHeight || (innerHeight + 85);
args.push(`--window-position=${screenX},${screenY}`, `--window-size=${outerWidth},${outerHeight}`);
// Some options can only be used in headless.
// If you use them again in headful, you will see a plain white browser window without any content.
if (headless) {
args.push('--in-process-gpu', // https://source.chromium.org/search?q=lang:cpp+symbol:kInProcessGPU&ss=chromium
'--disable-canvas-aa', // Disable antialiasing on 2d canvas
'--disable-2d-canvas-clip-aa', // Disable antialiasing on 2d canvas clips
'--disable-gl-drawing-for-tests');
}
}
static async getPids(pid) {
if ('string' === typeof (pid)) {
pid = parseInt(pid);
}
try {
const pidtree = require('pidtree');
const pids = await pidtree(pid);
return pids.includes(pid) ? pids : [...pids, pid];
}
catch (ignored) {
return [pid];
}
}
/**
* Shutdown browser
* @param browser
*/
static async shutdown(browser) {
try {
const pages = await browser.pages();
for (const page of pages) {
await page.close();
}
}
catch (ignored) {
}
const browserProcess = browser.process();
if (browserProcess) {
const pid = browserProcess.pid;
if (pid) {
const pids = await this.getPids(pid);
pids.forEach(pid => {
try {
process.kill(pid, 'SIGKILL');
}
catch (ignored) {
}
});
}
}
try {
await browser.close();
}
catch (ignored) {
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvRHJpdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLElBQUksTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRTlCLE9BQU8sRUFBRSxRQUFRLEVBQXdDLE1BQU0saUJBQWlCLENBQUE7QUFHaEYsT0FBTyxzQkFBa0UsTUFBTSx1QkFBdUIsQ0FBQTtBQUN0RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQW1DM0MsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFFeEMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDakMsUUFBUSxFQUFFLElBQUk7SUFDZCxRQUFRLEVBQUUsS0FBSztJQUNmLE9BQU8sRUFBRSxlQUFlO0NBQzNCLENBQUE7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU07SUFFZixNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBd0I7UUFDcEQseUJBQXlCO1FBQ3pCLE1BQU0sRUFBRSxHQUFxQixNQUFNLENBQUMsVUFBVSxDQUFBO1FBQzlDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsd0JBQXdCLENBQUMsQ0FBQTtRQUVwQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFckMsZ0JBQWdCO1FBQ2hCLGtEQUFrRDtRQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSx5QkFBeUIsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2hCLElBQVksRUFDWixNQUF5QjtRQUt6Qiw4REFBOEQ7UUFDOUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRTNDLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNuQixNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQ25CLElBQUksRUFDSixJQUFJLEVBQ0osTUFBTSxDQUNULENBQUE7U0FDSjtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUE7UUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVoQixNQUFNLE9BQU8sR0FBWSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUV0RCxPQUFPO1lBQ0gsY0FBYyxFQUFFLE9BQU87WUFDdkIsU0FBUyxFQUFFLElBQUk7U0FDbEIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNmLElBQVksRUFDWixpQkFBMkIsRUFDM0IsTUFBd0I7UUFLeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTdCLElBQ0ksQ0FBQyxNQUFNLENBQUMsYUFBYTtlQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUNuRDtZQUNFLE1BQU0sQ0FBQyxhQUFhLEdBQUcscUJBQXFCLENBQUE7U0FDL0M7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRS9DLDhEQUE4RDtRQUM5RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFFM0Msc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ25CLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FDbkIsSUFBSSxFQUNKLElBQUksRUFDSixNQUFNLENBQ1QsQ0FBQTtTQUNKO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQTtRQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWhCLE1BQU0sT0FBTyxHQUFZLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDaEUsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRXRELE9BQU87WUFDSCxjQUFjLEVBQUUsT0FBTztZQUN2QixTQUFTLEVBQUUsSUFBSTtTQUNsQixDQUFBO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsT0FBZ0IsRUFBRSxNQUE0QjtRQUMxRix3RUFBd0U7UUFDeEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDdkMsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2RCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFN0UsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUVuQixNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDOUYsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsaUJBQTJCLEVBQUUsWUFBOEI7UUFDdEYsT0FBTztRQUNQLHFDQUFxQztRQUNyQyxNQUFNLENBQUMsaUJBQWlCLFlBQVksS0FBSyxDQUFDLENBQUE7UUFFMUMsTUFBTSxJQUFJLEdBQUc7WUFDVCxHQUFHLGlCQUFpQjtZQUNwQixHQUFHLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1NBQzdDLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFaEIseUJBQXlCO1FBQ3pCLFlBQVksQ0FBQyxhQUFhLEdBQUc7WUFDekIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixpQkFBaUIsRUFBRTtnQkFDZixxQkFBcUI7Z0JBQ3JCLHVDQUF1QzthQUMxQztZQUNELFlBQVksRUFBRSxLQUFLO1lBQ25CLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFO2dCQUNiLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQy9CLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVc7Z0JBQ2pDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO2dCQUNqRCxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDOUQsUUFBUSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLENBQUM7Z0JBQzdDLFdBQVcsRUFBRSxLQUFLO2FBQ3JCO1lBQ0QsR0FBRyxZQUFZLENBQUMsYUFBYTtZQUM3QixJQUFJO1NBQ1AsQ0FBQTtRQUVELFdBQVc7UUFDWCxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQTtRQUNsRCxJQUFJLFdBQVcsS0FBSyxPQUFPLFFBQVEsRUFBRTtZQUNqQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1NBQ2xCO1FBRUQsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUNyQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1NBQ25CO1FBRUQsUUFBUTtRQUNSLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRTtZQUNwQixJQUFJLENBQUMsSUFBSSxDQUNMLGtCQUFrQixZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUMvQyxDQUFBO1NBQ0o7UUFFRCxtQkFBbUI7UUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUNMLFVBQVUsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUNwQyxDQUFBO1FBRUQsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQTtRQUM1QyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDbkIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQSxDQUFDLGtCQUFrQjtRQUVqRSxJQUFJLENBQUMsSUFBSSxDQUNMLG1CQUFtQixXQUFXLEVBQUUsQ0FDbkMsQ0FBQTtRQUVELGdDQUFnQztRQUNoQyxJQUFJLEVBQ0EsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEdBQ2QsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFBO1FBRWpCLFVBQVUsR0FBRyxVQUFVLElBQUksVUFBVSxDQUFBO1FBQ3JDLFdBQVcsR0FBRyxXQUFXLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FDTCxxQkFBcUIsT0FBTyxJQUFJLE9BQU8sRUFBRSxFQUN6QyxpQkFBaUIsVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUMvQyxDQUFBO1FBRUQsNkNBQTZDO1FBQzdDLG1HQUFtRztRQUNuRyxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksQ0FBQyxJQUFJLENBQ0wsa0JBQWtCLEVBQUUsaUZBQWlGO1lBQ3JHLHFCQUFxQixFQUFFLG9DQUFvQztZQUMzRCw2QkFBNkIsRUFBRSwwQ0FBMEM7WUFDekUsZ0NBQWdDLENBQ25DLENBQUE7U0FDSjtJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFvQjtRQUM3QyxJQUFJLFFBQVEsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDM0IsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUN0QjtRQUVELElBQUk7WUFDQSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDbEMsTUFBTSxJQUFJLEdBQWEsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUE7U0FDcEQ7UUFBQyxPQUFPLE9BQVksRUFBRTtZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7U0FDZjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFnQjtRQUNsQyxJQUFJO1lBQ0EsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDbkMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO2FBQ3JCO1NBQ0o7UUFBQyxPQUFPLE9BQU8sRUFBRTtTQUNqQjtRQUVELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN4QyxJQUFJLGNBQWMsRUFBRTtZQUNoQixNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFBO1lBRTlCLElBQUksR0FBRyxFQUFFO2dCQUNMLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDZixJQUFJO3dCQUNBLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO3FCQUMvQjtvQkFBQyxPQUFPLE9BQU8sRUFBRTtxQkFDakI7Z0JBQ0wsQ0FBQyxDQUFDLENBQUE7YUFDTDtTQUNKO1FBRUQsSUFBSTtZQUNBLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1NBQ3hCO1FBQUMsT0FBTyxPQUFPLEVBQUU7U0FDakI7SUFDTCxDQUFDO0NBQ0oifQ==