From a2b3539f350f59a8a9ac8fc652ebe251a7893dcd Mon Sep 17 00:00:00 2001 From: Oscar Date: Thu, 28 May 2026 15:30:32 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A8=20refactor(browser/scraper):=20?= =?UTF-8?q?=D0=9A=D0=BE=D0=B4=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BE=D0=BA=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hh/browser.ts | 10 ++++++- src/hh/scraper.ts | 66 +++++++++++++++++++++++++---------------------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/hh/browser.ts b/src/hh/browser.ts index 6dfa88b..f5c48a5 100644 --- a/src/hh/browser.ts +++ b/src/hh/browser.ts @@ -16,7 +16,15 @@ export async function randomScroll(page: Page): Promise { } export async function getBrowser(): Promise { - return chromium.launch({ headless: !!(process.env?.debug ?? true) }) + return chromium.launch({ + headless: !!(process.env?.debug ?? true), + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-dev-shm-usage', + '--disable-gpu', + ], + }) } export async function loadSession(page: Page, telegramId: bigint | number): Promise { diff --git a/src/hh/scraper.ts b/src/hh/scraper.ts index d9a95a7..249295e 100644 --- a/src/hh/scraper.ts +++ b/src/hh/scraper.ts @@ -61,47 +61,51 @@ export async function login(email: string, chatId: number): Promise { return } - const context = await browser.newContext() - const page = await context.newPage() + try { + const context = await browser.newContext() + const page = await context.newPage() - await page.goto('https://hh.ru/account/login', { waitUntil: 'domcontentloaded' }) - // await bot.sendMessage(chatId, `page: ${page.url()}`) + await page.goto('https://hh.ru/account/login', { waitUntil: 'domcontentloaded' }) + // await bot.sendMessage(chatId, `page: ${page.url()}`) - await page.click('[data-qa="submit-button"]') - await page.waitForTimeout(randomDelay()) - // await bot.sendMessage(chatId, `Клик по "Войти"`) + await page.click('[data-qa="submit-button"]') + await page.waitForTimeout(randomDelay()) + // await bot.sendMessage(chatId, `Клик по "Войти"`) - await page.click('label:has([data-qa="credential-type-EMAIL"])') - await page.waitForTimeout(randomDelay()) - // await bot.sendMessage(chatId, `Клик по "Email"`) + await page.click('label:has([data-qa="credential-type-EMAIL"])') + await page.waitForTimeout(randomDelay()) + // await bot.sendMessage(chatId, `Клик по "Email"`) - await page.fill('[data-qa="applicant-login-input-email"]', email) - await page.waitForTimeout(randomDelay()) - // await bot.sendMessage(chatId, `Ввод "Email"`) + await page.fill('[data-qa="applicant-login-input-email"]', email) + await page.waitForTimeout(randomDelay()) + // await bot.sendMessage(chatId, `Ввод "Email"`) - await page.click('[data-qa="submit-button"]') - // await bot.sendMessage(chatId, `Клик по "Дальше"`) - await page.waitForTimeout(randomDelay()) + await page.click('[data-qa="submit-button"]') + // await bot.sendMessage(chatId, `Клик по "Дальше"`) + await page.waitForTimeout(randomDelay()) - await bot.sendMessage(chatId, '🔑 Введи код из email') - await page.waitForTimeout(randomDelay()) + await bot.sendMessage(chatId, '🔑 Введи код из email') + await page.waitForTimeout(randomDelay()) - await page.click('[data-qa="applicant-login-input-otp"]') - const otp = await waitForOtp(chatId) - await page.fill('[data-qa="applicant-login-input-otp"] input', otp) - // await bot.sendMessage(chatId, `Введён ОТП: ${otp}`) + await page.click('[data-qa="applicant-login-input-otp"]') + const otp = await waitForOtp(chatId) + await page.fill('[data-qa="applicant-login-input-otp"] input', otp) + // await bot.sendMessage(chatId, `Введён ОТП: ${otp}`) - await page.waitForTimeout(randomDelay()) - await page.waitForSelector('[data-qa="profileAndResumes-button"]', { timeout: 15000 }) + await page.waitForTimeout(randomDelay()) + await page.waitForSelector('[data-qa="profileAndResumes-button"]', { timeout: 15000 }) - const cookies = await context.cookies() - await prisma.user.update({ - where: { telegramId: chatId }, - data: { session: JSON.stringify(cookies, null, 2) }, - }) + const cookies = await context.cookies() + await prisma.user.update({ + where: { telegramId: chatId }, + data: { session: JSON.stringify(cookies, null, 2) }, + }) - await bot.sendMessage(chatId, cookies.length > 0 ? '✅ Авторизация выполнена' : '❌ Произошла ошибка') - await browser.close() + await bot.sendMessage(chatId, cookies.length > 0 ? '✅ Авторизация выполнена' : '❌ Произошла ошибка') + } + finally { + await browser.close() + } } export async function checkIsAuth(telegramId: bigint | number) {