infosimples/detect-headless

How can I bypass Plugins Prototype

Closed this issue · 1 comments

Isn't there a standard answer to this question?
I passed almost all the tests.
But Plugins Prototype Test is an exception.
Could you please help me?

const puppeteer = require('puppeteer');

async function test() {
    var browser = await puppeteer.launch({
        ignoreDefaultArgs: ['--enable-automation'],
    });
    var page = await pageInit(browser);
    // var page = await browser.newPage();
    page.on('dialog', async (age) => {
        console.log(age.type());
        await page.waitFor(3e2);
        console.log(age.message());
        await age.dismiss()
    });
    await page.goto('https://infosimples.github.io/detect-headless/');
    await page.waitFor(3e2);
    await page.mouse.move(50, 50, { steps: 50 });
    await page.screenshot({
        path: './' + Date.now() + '.png',
        fullPage: true,
    });
    // await browser.close();
    console.log('end');

}
async function pageInit(browser) {
    var page, pages = await browser.pages();
    if (pages.length > 0) {
        page = pages[0];
    } else {
        page = await browser.newPage();
    }
    await page.setExtraHTTPHeaders({
        'Accept-Language': 'zh-CN,zh;q=0.9'
    });

    //User-Agent Test
    await page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36');
    await page.evaluateOnNewDocument(() => {
        //Webdriver Test
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false,
        });
        //connection.rtt Test
        Object.defineProperty(navigator.connection, 'rtt', {
            get: () => 50,
        });
        //Plugins Length Test
        Object.defineProperty(navigator, 'plugins', {
            get: () => {
                var ChromiumPDFPlugin = {};
                ChromiumPDFPlugin.__proto__ = PluginArray.prototype;
                return [ChromiumPDFPlugin];
            },
        });
    });

    //Chrome Test
    const trueChromeObject = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
    await page.evaluateOnNewDocument(() => {
        chrome = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
        window.chrome = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
        window.navigator.chrome = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
    });

    //Permissions Test
    await page.evaluateOnNewDocument(() => {
        const originalQuery = window.navigator.permissions.query;
        return window.navigator.permissions.query = (parameters) => (
            parameters.name === 'notifications' ? Promise.resolve({ state: Notification.permission }) :
                originalQuery(parameters)
        );
    });

    //Languages Test
    await page.evaluateOnNewDocument(() => {
        Object.defineProperty(navigator, 'languages', {
            get: () => ['zh-CN'],
        });
    });
    return page;
}
test();

I am resolved.

//Plugins Length Test
Object.defineProperty(navigator, 'plugins', {
	get: () => {
		var ChromiumPDFPlugin = {};
		ChromiumPDFPlugin.__proto__ = Plugin.prototype;
		var plugins = {
			0: ChromiumPDFPlugin,
			description: 'Portable Document Format',
			filename: 'internal-pdf-viewer',
			length: 1,
			name: 'Chromium PDF Plugin',
			__proto__: PluginArray.prototype,
		};
		return plugins;
	},
});