hh resume booster: free auto-bump for hh.ru (Playwright, Linux/Win/Mac)
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
# hh resume booster
|
||||
|
||||
Бесплатное автоматическое «поднятие» резюме в поиске hh.ru — по расписанию, на Linux, Windows и macOS.
|
||||
|
||||
## Как это работает
|
||||
|
||||
На hh **любое сохранение резюме заново поднимает его в выдаче поиска** — причём
|
||||
**без 4-часового кулдауна**, который есть у ручной кнопки «Поднять в поиске».
|
||||
Скрипт вносит невидимую правку в блок **«О себе»** (тумблерит один двойной пробел
|
||||
в середине текста — в вёрстке страницы он схлопывается, так что глазами он не виден
|
||||
и содержимое резюме не меняется) и сохраняет. Это бесплатный аналог платного
|
||||
сервиса «Автоподнятие».
|
||||
|
||||
Резюме на вашем аккаунте определяются **автоматически**. Планировщик ОС гоняет
|
||||
скрипт каждые 2 часа.
|
||||
|
||||
> ⚠️ **Требование:** у резюме должен быть непустой блок «О себе» (иначе прятать
|
||||
> правку негде — такое резюме скрипт пропустит и напишет об этом в лог).
|
||||
|
||||
## 🔐 Безопасность — прочитайте
|
||||
|
||||
Файл **`session/storage.json`** — это ваши cookie-сессии hh, то есть **полный доступ
|
||||
к аккаунту**. Никогда не выкладывайте его в git и не пересылайте архив ПОСЛЕ логина.
|
||||
В поставке этого файла нет — вы создаёте его локально сам через `login.py`.
|
||||
`.gitignore` уже исключает `session/`, `config.json` и логи.
|
||||
|
||||
Автоматизация браузером — «серая зона» правил hh (ToS). Риск низкий (вы правите
|
||||
своё же резюме), но частить не стоит: 2 часа — норм, каждые 5 минут — палево.
|
||||
|
||||
---
|
||||
|
||||
## 1. Требования
|
||||
|
||||
- **Python 3.9+**
|
||||
- Интернет и аккаунт соискателя на hh.ru
|
||||
- ~400 МБ на браузер Playwright (chromium)
|
||||
|
||||
Проверить питон: `python3 --version` (на Windows — `python --version`).
|
||||
|
||||
---
|
||||
|
||||
## 2. Установка (суть одна, команды под каждую ОС ниже)
|
||||
|
||||
Распакуйте архив, зайдите в папку `hh-resume-booster`, создайте виртуальное
|
||||
окружение, поставьте зависимости и браузер.
|
||||
|
||||
### 🐧 Linux
|
||||
|
||||
```bash
|
||||
cd hh-resume-booster
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
playwright install --with-deps chromium # --with-deps ставит системные библиотеки (нужен sudo)
|
||||
```
|
||||
Если `--with-deps` ругается на права — выполните `sudo $(which playwright) install-deps`
|
||||
один раз, затем `playwright install chromium`.
|
||||
|
||||
### 🪟 Windows (PowerShell)
|
||||
|
||||
```powershell
|
||||
cd hh-resume-booster
|
||||
python -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
pip install -r requirements.txt
|
||||
playwright install chromium
|
||||
```
|
||||
Если PowerShell не даёт активировать окружение — запустите один раз:
|
||||
`Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`.
|
||||
|
||||
### 🍎 macOS
|
||||
|
||||
```bash
|
||||
cd hh-resume-booster
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
playwright install chromium
|
||||
```
|
||||
(Если нет питона: `brew install python`.)
|
||||
|
||||
---
|
||||
|
||||
## 3. Логин (создаём сессию)
|
||||
|
||||
```bash
|
||||
python login.py # Windows: python login.py | Linux/mac: python login.py
|
||||
```
|
||||
Откроется настоящий браузер. **Войдите в hh.ru** любым способом (почта/пароль, код
|
||||
из письма/смс, госуслуги). Скрипт сам поймает вход и сохранит `session/storage.json`,
|
||||
после чего окно можно закрыть. Появится `✅ Готово`.
|
||||
|
||||
> **Сервер без экрана (headless Linux)?** `login.py` требует графику. Запустите его
|
||||
> на своём компьютере, затем скопируйте получившийся `session/storage.json` на сервер
|
||||
> в такую же папку `session/`.
|
||||
|
||||
---
|
||||
|
||||
## 4. Пробный прогон вручную
|
||||
|
||||
```bash
|
||||
python bump_resumes.py
|
||||
```
|
||||
Ожидаемый вывод — по строке на резюме, например:
|
||||
```
|
||||
[2026-08-24 20:08] 30ee2ebd…: about-added-ok | поднято✓ (next-manual=00:08)
|
||||
```
|
||||
`next-manual=HH:MM` = метка «Можно сегодня в …» на странице резюме; она равна
|
||||
времени_правки + 4ч и **двигается при каждом прогоне** — это и есть подтверждение,
|
||||
что резюме подняли. Всё пишется в `bump.log`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Автозапуск каждые 2 часа
|
||||
|
||||
### 🍎 macOS — launchd
|
||||
|
||||
```bash
|
||||
bash scheduler/install-mac.sh
|
||||
```
|
||||
- Статус: `launchctl list | grep hhbump`
|
||||
- Остановить: `launchctl bootout gui/$(id -u)/com.stackops.hhbump`
|
||||
|
||||
### 🐧 Linux — systemd (user timer)
|
||||
|
||||
```bash
|
||||
bash scheduler/install-linux.sh
|
||||
```
|
||||
- Статус: `systemctl --user list-timers | grep hhbump`
|
||||
- Разовый прогон: `systemctl --user start hhbump.service`
|
||||
- Остановить: `systemctl --user disable --now hhbump.timer`
|
||||
|
||||
<details><summary>Нет systemd? Вариант через cron</summary>
|
||||
|
||||
```bash
|
||||
crontab -e
|
||||
# добавить строку (замените /ПОЛНЫЙ/ПУТЬ):
|
||||
0 */2 * * * /ПОЛНЫЙ/ПУТЬ/hh-resume-booster/scheduler/run.sh >> /ПОЛНЫЙ/ПУТЬ/hh-resume-booster/bump.cron.log 2>&1
|
||||
```
|
||||
(сделайте `chmod +x scheduler/run.sh`)
|
||||
</details>
|
||||
|
||||
### 🪟 Windows — Планировщик заданий
|
||||
|
||||
В PowerShell **из папки пакета**:
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File .\scheduler\install-windows.ps1
|
||||
```
|
||||
- Статус: `schtasks /Query /TN hhbump`
|
||||
- Разовый прогон: `schtasks /Run /TN hhbump`
|
||||
- Удалить: `schtasks /Delete /TN hhbump /F`
|
||||
|
||||
---
|
||||
|
||||
## 6. Настройка (необязательно)
|
||||
|
||||
Скопируйте `config.example.json` → `config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"resume_ids": ["30ee2ebd...", "fb175217..."],
|
||||
"headless": true
|
||||
}
|
||||
```
|
||||
- `resume_ids` — если хотите поднимать только конкретные резюме (иначе — все на аккаунте).
|
||||
RID виден в URL резюме: `hh.ru/resume/ЭТОТ_ID`.
|
||||
- `headless: false` — показывать браузер во время прогона (для отладки).
|
||||
|
||||
**Сменить частоту:** поменяйте `StartInterval` (секунды) в plist / `OnUnitActiveSec`
|
||||
в `hhbump.timer` / интервал в задаче Windows и переустановите соответствующим
|
||||
`install-*` скриптом.
|
||||
|
||||
---
|
||||
|
||||
## 7. Диагностика
|
||||
|
||||
| Симптом в `bump.log` | Что делать |
|
||||
|---|---|
|
||||
| `STOP: нет session/storage.json` | запустите `python login.py` |
|
||||
| `STOP: сессия мертва (hhrole=...)` | сессия протухла (живёт ~30 дней) → `python login.py` заново |
|
||||
| `empty-about-skip` | добавьте текст в блок «О себе» этого резюме |
|
||||
| `no-about-field` / `ERR` | hh поменяли вёрстку или таймаут — проверьте вручную |
|
||||
|
||||
**Важно:** прогон случается, только когда компьютер **не спит**. launchd/systemd
|
||||
схлопывают пропуски в один прогон при пробуждении (свежак к утру — это ок).
|
||||
Нужен режим 24/7 без пропусков — держите машину бодрой или поставьте на VPS.
|
||||
|
||||
---
|
||||
|
||||
## Состав пакета
|
||||
|
||||
```
|
||||
hh-resume-booster/
|
||||
├── bump_resumes.py # сам бустер (автоопределение резюме)
|
||||
├── login.py # логин в hh -> session/storage.json
|
||||
├── requirements.txt
|
||||
├── config.example.json
|
||||
├── README.md
|
||||
├── session/ # сюда ляжет storage.json (в архиве пусто)
|
||||
└── scheduler/
|
||||
├── run.sh / run.bat # обёртки для планировщиков
|
||||
├── install-mac.sh # launchd
|
||||
├── install-linux.sh # systemd user-timer
|
||||
├── install-windows.ps1 # Task Scheduler
|
||||
├── com.stackops.hhbump.plist # шаблон launchd
|
||||
├── hhbump.service / .timer # шаблоны systemd
|
||||
```
|
||||
Reference in New Issue
Block a user