diff --git a/src/hh/bot-commands.ts b/src/hh/bot-commands.ts index fb9e4d5..d93907e 100644 --- a/src/hh/bot-commands.ts +++ b/src/hh/bot-commands.ts @@ -160,7 +160,7 @@ export function registerHHCommands() { const messageId = query.message.message_id const state = getState(chatId) - await bot.answerCallbackQuery(query.id) + await bot.answerCallbackQuery(query.id).catch(() => {}) const user = await prisma.user.findUnique({ where: { telegramId: chatId }, @@ -205,10 +205,14 @@ export function registerHHCommands() { result.errors.forEach(v => lines.push(`• ${v.title} — ${v.message}`)) } - await bot.sendMessage(chatId, lines.join('\n'), { - parse_mode: 'HTML', - disable_web_page_preview: true, - }) + const fullText = lines.join('\n') + const LIMIT = 4000 + for (let i = 0; i < fullText.length; i += LIMIT) { + await bot.sendMessage(chatId, fullText.slice(i, i + LIMIT), { + parse_mode: 'HTML', + disable_web_page_preview: true, + }) + } } await showMenu(chatId) }) @@ -234,12 +238,12 @@ export function registerHHCommands() { await showResult(chatId, messageId, '📋 Резюме не найдено.\n\nВыбери резюме через кнопку 📄 Выбрать резюме.') break } - const MAX = 10000 + const MAX = 3500 const text = resume.data.length > MAX ? `${resume.data.slice(0, MAX)}\n\n… (текст обрезан)` : resume.data await bot.editMessageText( - `📋 Твоё резюме\n
${escapeHtml(text)}`,
+ `📋 Твоё резюме:\n ${resume.title}\n${escapeHtml(text)}`,
{
chat_id: chatId,
message_id: messageId,
diff --git a/src/hh/scraper.ts b/src/hh/scraper.ts
index ef5b61d..d5d7df8 100644
--- a/src/hh/scraper.ts
+++ b/src/hh/scraper.ts
@@ -141,6 +141,7 @@ export async function saveResume(chatId: number, resumeItem: ResumeListItem): Pr
let resume: string | undefined
try {
resume = await page.locator('.resume').innerText()
+ await prisma.resume.deleteMany({ where: { telegramId: chatId, NOT: { id } } })
await prisma.resume.upsert({
where: { id },
create: { data: resume, id, telegramId: chatId, title },
@@ -238,10 +239,20 @@ export async function applyToJobs(
console.log('Ожидаемое резюме из БД:', resume.title)
if (currentResumeTitle !== resume.title) {
- // TODO: добавить логику смены резюме
console.log('Резюме не совпадает, нужно сменить')
- currentResumeEl?.focus()
- currentResumeEl?.click()
+ await currentResumeEl?.click()
+ await page.waitForSelector('[data-qa="magritte-select-option-list"]', { timeout: 5000 })
+ await page.pause()
+ const options = await page.$$('label[role="option"]')
+ for (const option of options) {
+ const titleEl = await option.$('[data-qa="resume-title"] [data-qa="cell-text-content"]')
+ const title = (await titleEl?.innerText())?.trim()
+ if (title === resume.title) {
+ await option.click()
+ await page.waitForTimeout(randomDelay())
+ break
+ }
+ }
}
await page.pause()
@@ -252,8 +263,8 @@ export async function applyToJobs(
await addLetter?.click()
}
- await keep(`✅ ${vacancy.title}\n\n${letter}`)
const letter = await letterPromise
+ await keep(`✅ ${vacancy.title}\n\n${letter}`)
if (letter) {
const letterInput = await page.$('[data-qa="vacancy-response-popup-form-letter-input"]')