⚙️ Refactor(file): Обновлены импорты типов и добавлен вывод текущего запроса настройки.

This commit is contained in:
Oscar
2026-05-27 11:14:01 +03:00
parent 67c120930b
commit b041099b16
2 changed files with 23 additions and 12 deletions

View File

@@ -1,8 +1,8 @@
import type { ResumeListItem } from './types.js'
import bot from '@bot' import bot from '@bot'
import prisma from '@prisma' import prisma from '@prisma'
import cron, { type ScheduledTask } from 'node-cron' import cron, { type ScheduledTask } from 'node-cron'
import { applyToJobs, checkIsAuth, listResumes, login, saveResume } from './scraper.js' import { applyToJobs, checkIsAuth, listResumes, login, saveResume } from './scraper.js'
import { type ResumeListItem } from './types.js'
import { BACK_MARKUP, createStatusReporter, escapeHtml, LOGIN_MARKUP, MAIN_MARKUP, showResult } from './ui.js' import { BACK_MARKUP, createStatusReporter, escapeHtml, LOGIN_MARKUP, MAIN_MARKUP, showResult } from './ui.js'
interface UserState { interface UserState {
@@ -220,7 +220,7 @@ export function registerHHCommands() {
await showResult( await showResult(
chatId, chatId,
messageId, messageId,
`⚙️ Настройки:\n\nЗапрос: ${settings.searchQuery}\nМакс откликов: ${settings.maxApplies}\nАвто: ${state.autoCron ? '✅ включено' : '❌ выключено'}\nАвторизован: ${isAuth}`, `⚙️ Настройки:\n\nЗапрос: ${settings.searchQuery}\nМакс откликов: ${settings.maxApplies}\nАвто: ${state.autoCron ? '✅ включено' : '❌ выключено'}\nАвторизован: ${isAuth ? '✅' : '❌'}`,
) )
break break
} }
@@ -289,10 +289,18 @@ export function registerHHCommands() {
} }
case 'hh_query': case 'hh_query':
{
state.awaitingQuery = true state.awaitingQuery = true
state.menuMessageId = messageId state.menuMessageId = messageId
const q = await prisma.settings.findFirst({
where: { telegramId: chatId },
})
await bot.sendMessage(chatId, `🔍Текущий запрос: ${q?.searchQuery || '--'}`)
await bot.sendMessage(chatId, '🔍 Введи поисковый запрос:') await bot.sendMessage(chatId, '🔍 Введи поисковый запрос:')
break break
}
case 'hh_max': case 'hh_max':
state.awaitingMax = true state.awaitingMax = true

View File

@@ -29,7 +29,7 @@ export async function login(email: string, chatId: number): Promise<void> {
const context = await browser.newContext() const context = await browser.newContext()
const page = await context.newPage() const page = await context.newPage()
await page.goto('https://hh.ru/account/login', { waitUntil: 'networkidle' }) await page.goto('https://hh.ru/account/login', { waitUntil: 'domcontentloaded' })
// await bot.sendMessage(chatId, `page: ${page.url()}`) // await bot.sendMessage(chatId, `page: ${page.url()}`)
await page.click('[data-qa="submit-button"]') await page.click('[data-qa="submit-button"]')
@@ -57,7 +57,7 @@ export async function login(email: string, chatId: number): Promise<void> {
// await bot.sendMessage(chatId, `Введён ОТП: ${otp}`) // await bot.sendMessage(chatId, `Введён ОТП: ${otp}`)
await page.waitForTimeout(randomDelay()) await page.waitForTimeout(randomDelay())
await page.waitForLoadState('networkidle') await page.waitForSelector('[data-qa="profileAndResumes-button"]', { timeout: 15000 })
const cookies = await context.cookies() const cookies = await context.cookies()
await prisma.user.update({ await prisma.user.update({
@@ -74,12 +74,12 @@ export async function checkIsAuth(telegramId: bigint | number) {
const context = await browser.newContext() const context = await browser.newContext()
const page = await context.newPage() const page = await context.newPage()
await loadSession(page, telegramId) await loadSession(page, telegramId)
await page.goto('https://hh.ru/search/vacancy', { waitUntil: 'networkidle' }) await page.goto('https://hh.ru/search/vacancy', { waitUntil: 'domcontentloaded' })
try { try {
return await page.$('[data-qa="profileAndResumes-button"]') return await page.waitForSelector('[data-qa="profileAndResumes-button"]', { timeout: 5000 })
} }
catch (e) { catch {
return e return null
} }
} }
@@ -92,7 +92,8 @@ export async function listResumes(chatId: number): Promise<ResumeListItem[]> {
let lastError: Error | null = null let lastError: Error | null = null
for (let attempt = 1; attempt <= 2; attempt++) { for (let attempt = 1; attempt <= 2; attempt++) {
try { try {
await page.goto('https://hh.ru/applicant/resumes', { waitUntil: 'networkidle' }) await page.goto('https://hh.ru/applicant/resumes', { waitUntil: 'domcontentloaded' })
await page.waitForSelector('[data-qa^="resume-card-link-"]', { timeout: 10000 })
const resumes = await page.$$eval( const resumes = await page.$$eval(
'[data-qa^="resume-card-link-"]', '[data-qa^="resume-card-link-"]',
links => links.map(a => ({ links => links.map(a => ({
@@ -123,7 +124,7 @@ export async function saveResume(chatId: number, resumeHref: string): Promise<st
const id = new URL(`https://hh.ru${resumeHref}`).pathname.split('/').pop()! const id = new URL(`https://hh.ru${resumeHref}`).pathname.split('/').pop()!
const resumeUrl = `https://hh.ru/resume_converter/resume.txt?hash=${id}&type=txt&hhtmFrom=&hhtmSource=resume` const resumeUrl = `https://hh.ru/resume_converter/resume.txt?hash=${id}&type=txt&hhtmFrom=&hhtmSource=resume`
await page.goto(resumeUrl, { waitUntil: 'networkidle' }) await page.goto(resumeUrl, { waitUntil: 'load' })
let resume: string | undefined let resume: string | undefined
try { try {
@@ -159,7 +160,8 @@ export async function applyToJobs(
await loadSession(page, chatId) await loadSession(page, chatId)
const url = `https://hh.ru/search/vacancy?text=${encodeURIComponent(query)}&area=${area}` const url = `https://hh.ru/search/vacancy?text=${encodeURIComponent(query)}&area=${area}`
await page.goto(url, { waitUntil: 'networkidle' }) await page.goto(url, { waitUntil: 'domcontentloaded' })
await page.waitForSelector('[data-qa="serp-item__title"]', { timeout: 10000 }).catch(() => null)
if (!await page.$('[data-qa="profileAndResumes-button"]')) { if (!await page.$('[data-qa="profileAndResumes-button"]')) {
return { ...results, error: 'Не авторизован. Выполните login' } return { ...results, error: 'Не авторизован. Выполните login' }
@@ -189,7 +191,8 @@ export async function applyToJobs(
const ref: VacancyRef = { title: vacancy.title, href: vacancy.href } const ref: VacancyRef = { title: vacancy.title, href: vacancy.href }
try { try {
await status(`🔄 Обрабатывается: ${vacancy.title}`) await status(`🔄 Обрабатывается: ${vacancy.title}`)
await page.goto(vacancy.href, { waitUntil: 'networkidle' }) await page.goto(vacancy.href, { waitUntil: 'domcontentloaded' })
await page.waitForSelector('[data-qa="vacancy-description"]', { timeout: 10000 }).catch(() => null)
const description = await page const description = await page
.locator('[data-qa="vacancy-description"]') .locator('[data-qa="vacancy-description"]')