
- [남군]빛고을한량
- 0
- 22
- 0
- 0
- 2025-05-24 15:07:57
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();