From a9635be640ad8cca74206e464228600cf2216343 Mon Sep 17 00:00:00 2001 From: Oscar Date: Thu, 28 May 2026 21:21:23 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20feat(browser):=20=D0=94=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8F=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=81?= =?UTF-8?q?=D0=BA=D1=80=D1=8B=D1=82=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D1=83=D0=B7=D0=B5=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hh/browser.ts | 16 +++++++++++++++- src/hh/scraper.ts | 10 +++++----- src/index.ts | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/hh/browser.ts b/src/hh/browser.ts index f5c48a5..10a8f81 100644 --- a/src/hh/browser.ts +++ b/src/hh/browser.ts @@ -17,16 +17,30 @@ export async function randomScroll(page: Page): Promise { export async function getBrowser(): Promise { return chromium.launch({ - headless: !!(process.env?.debug ?? true), + headless: !process.env.debug, args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu', + '--disable-blink-features=AutomationControlled', ], }) } +export async function newStealthContext(browser: Browser) { + const context = await browser.newContext({ + userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', + viewport: { width: 1280, height: 800 }, + locale: 'ru-RU', + timezoneId: 'Europe/Moscow', + }) + await context.addInitScript(() => { + Object.defineProperty(navigator, 'webdriver', { get: () => false }) + }) + return context +} + export async function loadSession(page: Page, telegramId: bigint | number): Promise { const user = await prisma.user.findUnique({ where: { telegramId } }) if (!user?.session) diff --git a/src/hh/scraper.ts b/src/hh/scraper.ts index 249295e..a59f267 100644 --- a/src/hh/scraper.ts +++ b/src/hh/scraper.ts @@ -5,7 +5,7 @@ import type { StatusReporter } from './ui.js' import bot from '@bot' import prisma from '@prisma' import { createMessage } from '@/openai' -import { getBrowser, loadSession, randomDelay, randomScroll } from './browser.js' +import { getBrowser, loadSession, newStealthContext, randomDelay, randomScroll } from './browser.js' import { escapeHtml } from './ui.js' function waitForOtp(chatId: number): Promise { @@ -62,7 +62,7 @@ export async function login(email: string, chatId: number): Promise { } try { - const context = await browser.newContext() + const context = await newStealthContext(browser) const page = await context.newPage() await page.goto('https://hh.ru/account/login', { waitUntil: 'domcontentloaded' }) @@ -110,7 +110,7 @@ export async function login(email: string, chatId: number): Promise { export async function checkIsAuth(telegramId: bigint | number) { const browser = await getBrowser() - const context = await browser.newContext() + const context = await newStealthContext(browser) const page = await context.newPage() await loadSession(page, telegramId) await page.goto('https://hh.ru/search/vacancy', { waitUntil: 'domcontentloaded' }) @@ -127,7 +127,7 @@ export async function checkIsAuth(telegramId: bigint | number) { export async function listResumes(chatId: number): Promise { const browser = await getBrowser() - const context = await browser.newContext() + const context = await newStealthContext(browser) const page = await context.newPage() await loadSession(page, chatId) @@ -218,7 +218,7 @@ export async function applyToJobs( { chatId, reporter }: { chatId: number, reporter: StatusReporter }, ): Promise { const browser = await getBrowser() - const context = await browser.newContext() + const context = await newStealthContext(browser) const page = await context.newPage() const results: ApplyResult = { applied: [], skipped: [], errors: [] } const { status, keep, clear } = reporter diff --git a/src/index.ts b/src/index.ts index fb725c4..032d67a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import { registerHHCommands, triggerHHStart } from './hh/bot-commands.js' process.on('unhandledRejection', (reason) => { console.error('[unhandledRejection]', reason) }) -// console.log('hi') +// console.log('hi') //PWDEBUG=1 registerHHCommands() bot.onText(/\/start/, async (msg) => {