CentOS7 센토스가 머임
puppeteer stealth sample.js


 

import puppeteer from 'puppeteer';


 

async function run() {

    const browser = await puppeteer.launch({

        headless: false,

        args: ['--incognito'],

        defaultViewport: null,

    });


 

    const context = await browser.createBrowserContext();

    const page = await context.newPage();


 

    // 자동화 탐지 우회 설정

    await page.evaluateOnNewDocument(() => {

        // navigator.webdriver 제거

        Object.defineProperty(navigator, 'webdriver', {

            get: () => false,

        });


 

        // window.chrome 추가

        window.chrome = {

            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',

                },

                connect: function () { },

                sendMessage: function () { },

            },

            loadTimes: function () {

                return {

                    requestTime: Date.now() / 1200,

                    startLoadTime: Date.now() / 1300,

                    commitLoadTime: Date.now() / 1200,

                    finishDocumentLoadTime: Date.now() / 1100,

                    finishLoadTime: Date.now() / 1200,

                    firstPaintTime: Date.now() / 1300,

                    firstPaintAfterLoadTime: 0,

                    navigationType: 'Reload',

                    wasFetchedViaSpdy: false,

                    wasNpnNegotiated: false,

                    npnNegotiatedProtocol: '',

                    wasAlternateProtocolAvailable: false,

                    connectionInfo: 'h2',

                };

            },

            csi: function () {

                return {

                    startE: Date.now(),

                    onloadT: Date.now(),

                    pageT: Date.now(),

                    tran: 15,

                };

            },

            app: {

                isInstalled: false,

            },

            webstore: {

                onInstallStageChanged: {},

                onDownloadProgress: {},

            },

        };


 

        // 언어 설정

        Object.defineProperty(navigator, 'languages', {

            get: () => ['en-US', 'en'],

        });


 

        // 플러그인 설정

        const fakePlugins = [

            {

                name: 'Chrome PDF Plugin',

                filename: 'internal-pdf-viewer',

                description: 'Portable Document Format',

            },

            {

                name: 'Chrome PDF Viewer',

                filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai',

                description: '',

            },

            {

                name: 'Native Client',

                filename: 'internal-nacl-plugin',

                description: '',

            },

        ];


 

        const fakePluginArray = {

            length: fakePlugins.length,

            item: function (index) {

                return this[index];

            },

            namedItem: function (name) {

                return this.find(plugin => plugin.name === name);

            },

            ...fakePlugins,

        };


 

        Object.defineProperty(navigator, 'plugins', {

            get: () => fakePluginArray,

        });


 

        // User-Agent 수정은 필요에 따라 별도 args 또는 page.setUserAgent로 설정 가능

        Object.defineProperty(navigator, 'userAgent', {

            get: () => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",

        });


 

    });


 

    await page.goto('https://bot.sannysoft.com'); // 자동화 탐지 테스트 사이트


 

    // 결과 출력

    const webdriver = await page.evaluate(() => navigator.webdriver);

    console.log('navigator.webdriver:', webdriver); // false


 

    console.log(navigator);


 

    // 종료는 필요 시 수동으로

    await browser.close();

}


 

await run();

첨부파일
Comments
비밀글