# 🤖 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-процессов. Для имитации человеческого поведения используются случайные задержки и скроллы.
