Files
hh-auto-reply/README.md

145 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🤖 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
```
## Docker
### Сборка образа
```bash
docker build -t oscr-test-bot .
```
### Запуск контейнера
Создай файл `.env.docker`:
```
DATABASE_URL=file:/data/dev.db
TG_BOT_TOKEN=your_token
GROQ_API_KEY=your_key
OPENROUTER_API_KEY=your_key
```
Запуск (Linux/Mac):
```bash
docker run --rm --env-file .env.docker -v $(pwd)/data:/data oscr-test-bot
```
Запуск (Windows PowerShell):
```powershell
docker run --rm --env-file .env.docker -v //c/MyApps/oscr-test-bot/data:/data oscr-test-bot
```
SQLite база данных сохраняется в папку `data/` и переживает перезапуски контейнера.
## Запуск локально
```bash
# 1. Установить зависимости
yarn
# 2. Создать .env
echo 'DATABASE_URL="file:./dev.db"' > .env
# 3. Применить миграции
yarn db-migrate
# 4. Запустить в dev-режиме
yarn dev
```
## Команды разработки
```bash
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-процессов. Для имитации человеческого поведения используются случайные задержки и скроллы.