Изменилась функция askLLM на createMessage для генерации сообщений.
🤖 HH Auto-Apply Bot
Telegram-бот для автоматизации откликов на вакансии с hh.ru. Бот логинится на hh.ru от твоего имени, парсит вакансии по запросу и с помощью LLM генерирует персонализированное сопроводительное письмо под каждую вакансию — с учётом твоего резюме и описания позиции.
Стек
| Слой | Технология |
|---|---|
| Runtime | Node.js 20+ (ESM), TypeScript |
| Telegram | node-telegram-bot-api (long polling) |
| Браузерная автоматизация | Playwright (headless Chromium) |
| LLM / AI | Groq API — llama-3.3-70b-versatile |
| ORM | Prisma 6 + SQLite |
| Планировщик | node-cron |
| Пакетный менеджер | Yarn 4 |
Как это работает
Пользователь → Telegram Bot
│
├─ Авторизация на hh.ru (Playwright + OTP через бот)
│ └─ Сохранение сессии (cookies) в БД
│
├─ Парсинг резюме с hh.ru → сохранение в БД
│
└─ Поиск вакансий по запросу
│
└─ Для каждой вакансии:
├─ Playwright парсит описание
└─ LLM (Llama 3.3 70B) генерирует
сопроводительное письмо на основе
резюме + описания вакансии
AI / LLM
Сопроводительные письма генерирует Llama 3.3 70B через Groq API (OpenAI-совместимый интерфейс). Модель получает:
- Системный промпт с инструкциями по стилю (настраивается пользователем)
- Текст резюме пользователя (парсится с hh.ru)
- Описание конкретной вакансии (парсится Playwright'ом в реальном времени)
На выходе — живое, не шаблонное письмо, адаптированное под конкретную позицию.
В коде также подключён Anthropic SDK (@anthropic-ai/sdk) для возможности использования Claude.
Возможности
- Авторизация — вход на hh.ru через email + OTP-код, сессия сохраняется в БД и переиспользуется
- Парсинг резюме — автоматически скачивает твоё резюме с hh.ru после логина
- Поиск вакансий — поиск по настраиваемому запросу с лимитом откликов
- AI-сопроводительные письма — уникальное письмо под каждую вакансию через LLM
- Авто-режим — крон-задача (пн–пт, 10:00) для ежедневного автозапуска
- Настройки через бот — поисковый запрос, макс. кол-во откликов — всё меняется прямо в чате
Команды бота
| Кнопка / команда | Действие |
|---|---|
/start |
Регистрация, главное меню |
💼 Меню |
Панель управления HH Auto-Apply |
🚀 Откликнуться сейчас |
Запустить поиск и генерацию писем |
🔍 Изменить запрос |
Сменить поисковый запрос |
🔢 Макс откликов |
Установить лимит вакансий за сессию |
⏰ Авто вкл / Авто выкл |
Включить/выключить ежедневный крон |
🔑 Логин |
Авторизоваться на hh.ru |
⚙️ Статус |
Текущие настройки и статус авторизации |
База данных
User — telegramId, hhEmail, session (cookies), AI-промпт
Resume — текст резюме, привязан к пользователю
Settings — searchQuery, maxApplies
Запуск
# 1. Установить зависимости
yarn
# 2. Создать .env
echo 'DATABASE_URL="file:./dev.db"' > .env
# 3. Применить миграции
yarn db-migrate
# 4. Запустить в dev-режиме
yarn dev
Команды разработки
yarn dev # запуск с hot reload (tsx watch)
yarn build # компиляция TypeScript → dist/
yarn start # запуск скомпилированного кода
yarn lint # проверка ESLint
yarn lint:fix # автофикс ESLint
yarn db-view # Prisma Studio (GUI для БД)
yarn db-migrate # создать и применить миграцию
yarn db-deploy # применить миграции на проде
Архитектура
Одиночный Node.js процесс без HTTP-сервера. Весь UI — Telegram inline-клавиатуры и сообщения. Два синглтона (TelegramBot, PrismaClient) шарятся через path-алиасы @bot и @prisma.
Playwright запускается headless для каждой операции с hh.ru и закрывается после — никаких persistent browser-процессов. Для имитации человеческого поведения используются случайные задержки и скроллы.