hh-applicant-tool 1.4.12__py3-none-any.whl → 1.5.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hh_applicant_tool/__main__.py +1 -1
- hh_applicant_tool/ai/__init__.py +1 -0
- hh_applicant_tool/ai/openai.py +28 -12
- hh_applicant_tool/api/client.py +11 -7
- hh_applicant_tool/main.py +57 -31
- hh_applicant_tool/operations/apply_similar.py +12 -6
- hh_applicant_tool/operations/authorize.py +24 -12
- hh_applicant_tool/operations/clear_negotiations.py +0 -1
- hh_applicant_tool/operations/query.py +2 -2
- hh_applicant_tool/operations/refresh_token.py +9 -2
- hh_applicant_tool/operations/whoami.py +2 -2
- hh_applicant_tool/storage/models/base.py +5 -0
- hh_applicant_tool/storage/models/contacts.py +15 -1
- hh_applicant_tool/storage/queries/schema.sql +1 -1
- hh_applicant_tool/storage/utils.py +7 -1
- hh_applicant_tool/utils/log.py +2 -2
- hh_applicant_tool/utils/mixins.py +9 -28
- hh_applicant_tool/utils/string.py +15 -0
- hh_applicant_tool/utils/terminal.py +102 -0
- {hh_applicant_tool-1.4.12.dist-info → hh_applicant_tool-1.5.7.dist-info}/METADATA +247 -82
- {hh_applicant_tool-1.4.12.dist-info → hh_applicant_tool-1.5.7.dist-info}/RECORD +23 -23
- {hh_applicant_tool-1.4.12.dist-info → hh_applicant_tool-1.5.7.dist-info}/WHEEL +1 -1
- {hh_applicant_tool-1.4.12.dist-info → hh_applicant_tool-1.5.7.dist-info}/entry_points.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hh-applicant-tool
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.7
|
|
4
4
|
Summary: HH-Applicant-Tool: An automation utility for HeadHunter (hh.ru) designed to streamline the job search process by auto-applying to relevant vacancies and periodically refreshing resumes to stay at the top of recruiter searches.
|
|
5
5
|
Author: Senior YAML Developer
|
|
6
6
|
Author-email: yamldeveloper@proton.me
|
|
@@ -21,8 +21,9 @@ Project-URL: Homepage, https://github.com/s3rgeym/hh-applicant-tool
|
|
|
21
21
|
Project-URL: Repository, https://github.com/s3rgeym/hh-applicant-tool
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
# HH Applicant Tool
|
|
25
25
|
|
|
26
|
+
> [!NOTE]
|
|
26
27
|
> Ищу почасовую или проектную [@feedback_s3rgeym_bot](https://t.me/feedback_s3rgeym_bot) (Python, Vue.js, Devops)
|
|
27
28
|
|
|
28
29
|

|
|
@@ -36,39 +37,49 @@ Description-Content-Type: text/markdown
|
|
|
36
37
|
<img src="https://github.com/user-attachments/assets/29d91490-2c83-4e3f-a573-c7a6182a4044" width="500">
|
|
37
38
|
</div>
|
|
38
39
|
|
|
39
|
-
###
|
|
40
|
+
### ☕ Поддержать проект
|
|
41
|
+
|
|
42
|
+
[](bitcoin:BC1QWQXZX6D5Q0J5QVGH2VYXTFXX9Y6EPPGCW3REHS?label=%D0%94%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B6%D0%B5%D1%80%D1%82%D0%B2%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9)
|
|
43
|
+
|
|
44
|
+
**BTC Address:** `BC1QWQXZX6D5Q0J5QVGH2VYXTFXX9Y6EPPGCW3REHS`
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## ✨ Ключевые преимущества
|
|
40
49
|
|
|
41
50
|
- 💸 **Полностью бесплатно.** В то время как сервисы в интернете или Telegram с аналогичным функционалом просят за свои услуги от 5.000 до 12.000 рублей в месяц.
|
|
42
51
|
|
|
43
52
|
- 🔒 **Безопасность личных данных.** Ваши email, телефон, пароль и другие личные данные никуда не передаются в отличие от сторонних сервисов. В этом можно убедиться, изучив [открытый исходный код](https://github.com/s3rgeym/hh-applicant-tool/tree/main/src/hh_applicant_tool). Владельцы сторонних сервисов никогда вам не покажут исходники. Они знают о вас все и эти данные спокойно продадут каким-нибудь жуликам, либо те утекут в результате взлома.
|
|
44
53
|
|
|
45
|
-
- 💾 **Сохранение контактов и прочей информации.** Контакты работодалей и информация о них и их вакансиях сохраняется в базе
|
|
54
|
+
- 💾 **Сохранение контактов и прочей информации.** Контакты работодалей и информация о них и их вакансиях сохраняется в базе данных на вашем устройстве, что позволяет производить быстрый поиск нужной информации в отличии от сайта при минимальном опыте с SQL (язык запросов, придуманный в свое время для домохозяек).
|
|
46
55
|
|
|
47
56
|
- 🛡️ **Гарантия от блокировок.** Утилита выполняет запросы с вашего устройства, имитируя обычного пользователя. Сервисы рассылают запросы для сотен аккаунтов с одного сервера, что повышает вероятность блокировки вашего аккаунта до 100%.
|
|
48
57
|
|
|
49
58
|
- 😎 **Простота в использовании.** С утилитой разберется любой начинающий пользователь компьютера. Настолько, что херки в своем чате уже жалуются на массовые отклики от подростков 14-17 лет, которые успешно освоили данный инструмент.
|
|
50
59
|
|
|
51
|
-
- 👯 **Мультиаккаунтность и управление резюме.**
|
|
60
|
+
- 👯 **Мультиаккаунтность и управление резюме.** Утилита благодаря профилям может работать с неограниченным количеством аккаунтов и резюме.
|
|
52
61
|
|
|
53
|
-
- 🖥️ **Полноценный CLI и работа на серверах.** Утилита имеет чистый консольный интерфейс. Несмотря на то, что для обхода защиты при авторизации используется браузер, он работает по умолчанию в фоновом (headless) режиме. Для `hh-applicant-tool` не нужна видеокарта или графическая оболочка (X-сервер), что позволяет авторизоваться даже с сервера или из докер-контейнера.
|
|
62
|
+
- 🖥️ **Полноценный CLI и работа на серверах.** Утилита имеет чистый консольный интерфейс. Несмотря на то, что для обхода защиты при авторизации используется браузер, он работает по умолчанию в фоновом (headless) режиме. Для `hh-applicant-tool` не нужна видеокарта или графическая оболочка (X-сервер), что позволяет авторизоваться даже с сервера или из докер-контейнера. Капча так же выводится прямо в терминал при использовании флагов `--kitty`/`--sixel`.
|
|
54
63
|
|
|
55
64
|
- 🚀 **Скриптинг.** Вы можете использовать утилиту из своих Python-скриптов.
|
|
56
65
|
|
|
57
|
-
- 🤖 **Борьба с ATS и HR.**
|
|
66
|
+
- 🤖 **Борьба с ATS и HR.** Россиянские говнокомпании внедрили ATS с нейронками, которые отклоняют отклик в течение 5 секунд. Отказ может прийти даже из-за отсутствия одного ключевого слова в резюме. Это не говоря уже о тупопездом фильтре, отсеивающем по знаку зодика (они не любят козерогов!!!). Это обесценивает ваши усилия на написание сопроводительных писем и чтение бесконечных портянок бреда, сгенерированных нейронками по запросу каких-то дур. Если тупые ичары решили себя не утруждать чтением резюме (они сейчас и сами перестали писать), то и вам незачем читать высеры этих филологинь и психологинь. Утилита избавляет вас от этой рутины, превращающей поиск работы в полноценную работу. Сейчас доля отказов составляет 98-99%, включая "молчунов" и прочих долбоебов, и единственный способ увеличить шансы просто попасть на собеседование — это автоматическая рассылка откликов на все подходящие вакансии. У большинства телефоны с двумя симками, а значит каждый может разослать до 400 откликов в сутки, а если нарегать акков на родню — еще больше!
|
|
67
|
+
|
|
68
|
+
---
|
|
58
69
|
|
|
59
|
-
|
|
70
|
+
## Содержание
|
|
60
71
|
|
|
61
72
|
- [HH Applicant Tool](#hh-applicant-tool)
|
|
73
|
+
- [☕ Поддержать проект](#-поддержать-проект)
|
|
62
74
|
- [✨ Ключевые преимущества](#-ключевые-преимущества)
|
|
63
75
|
- [Содержание](#содержание)
|
|
64
76
|
- [Описание](#описание)
|
|
65
77
|
- [Предыстория](#предыстория)
|
|
66
|
-
- [
|
|
67
|
-
|
|
68
|
-
- [
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- [Об авторизации](#об-авторизации)
|
|
78
|
+
- [Запуск через Docker](#запуск-через-docker)
|
|
79
|
+
- [Стандартная установка](#стандартная-установка)
|
|
80
|
+
- [Установка утилиты](#установка-утилиты)
|
|
81
|
+
- [Дополнительные зависимости](#дополнительные-зависимости)
|
|
82
|
+
- [Авторизация](#авторизация)
|
|
72
83
|
- [Описание команд](#описание-команд)
|
|
73
84
|
- [Использование AI](#использование-ai)
|
|
74
85
|
- [OpenAI/ChatGPT](#openaichatgpt)
|
|
@@ -79,15 +90,16 @@ Description-Content-Type: text/markdown
|
|
|
79
90
|
- [База данных](#база-данных)
|
|
80
91
|
- [Использование в скриптах](#использование-в-скриптах)
|
|
81
92
|
- [Дополнительные настройки](#дополнительные-настройки)
|
|
82
|
-
- [TODO](#todo)
|
|
83
93
|
- [Лицензионное соглашение (Limited Non-Commercial License)](#лицензионное-соглашение-limited-non-commercial-license)
|
|
84
94
|
|
|
85
95
|
---
|
|
86
96
|
|
|
87
|
-
|
|
97
|
+
## Описание
|
|
88
98
|
|
|
99
|
+
> [!IMPORTANT]
|
|
89
100
|
> Данной утилите похуй на "запрет" доступа к API HH сторонним приложениям, так как она прикидывается официальным приложением под Android
|
|
90
101
|
|
|
102
|
+
> [!NOTE]
|
|
91
103
|
> Утилита для генерации сопроводительного письма может использовать AI, в т. ч. ChatGPT. Подробное описание ниже
|
|
92
104
|
|
|
93
105
|
Утилита для успешных волчат и старых волков с опытом, служащая для автоматизации действий на HH.RU, таких как рассылка откликов на подходящие вакансии и обновление всех резюме (бесплатный аналог услуги на HH). Утилита локально хранит информацию об откликах, в т. ч. полученные контакты. Это удобно, так как контакт сохранится, даже если вышлют отказ в дальнейшем. Мой совет: скрывайте свой номер от работодателя, если рассылаете отклики через утилиту, а то количество жуликов на красном сайте, мягко говоря, зашкаливает. У утилиты есть канал в дуровграме: [HH Applicant Tool](https://t.me/hh_applicant_tool). Старый <s>[HH Resume Automate](https://t.me/hh_resume_automate)</s> был выпилен какими-то долбоёбами, углядевшими во флаге Японии с двумя буквами «h» нарушение авторских прав...
|
|
@@ -102,11 +114,15 @@ asdf/pyenv/conda и что-то еще. В школотронской Manjaro и
|
|
|
102
114
|
|
|
103
115
|

|
|
104
116
|
|
|
117
|
+
> [!NOTE]
|
|
105
118
|
> Если в веб-интерфейсе выставить фильтры, то они будут применяться в скрипте при отклике на подходящие
|
|
106
119
|
|
|
120
|
+
> [!NOTE]
|
|
107
121
|
> Утилита автоматически подхватывает прокси из переменных окружения типа http_proxy или HTTPS_PROXY
|
|
108
122
|
|
|
109
|
-
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Предыстория
|
|
110
126
|
|
|
111
127
|
Долгое время я делал массовые заявки с помощью консоли браузера:
|
|
112
128
|
|
|
@@ -116,11 +132,11 @@ $$('[data-qa="vacancy-serp__vacancy_response"]').forEach((el) => el.click());
|
|
|
116
132
|
|
|
117
133
|
Оно работает, хоть и не идеально. Я даже пробовал автоматизировать рассылки через `p[yu]ppeteer`, пока не прочитал [документацию](https://github.com/hhru/api). И не обнаружил, что **API** (интерфейс) содержит все необходимые мне методы. Headhunter позволяет создать свое приложение, но там ручная модерация, и навряд ли кто-то разрешит мне создать приложение для спама заявками. Я [декомпилировал](https://gist.github.com/s3rgeym/eee96bbf91b04f7eb46b7449f8884a00) официальное приложение для **Android** и получил **CLIENT_ID** и **CLIENT_SECRET**, необходимые для работы через **API**.
|
|
118
134
|
|
|
119
|
-
|
|
135
|
+
---
|
|
120
136
|
|
|
121
|
-
|
|
137
|
+
## Запуск через Docker
|
|
122
138
|
|
|
123
|
-
Это самый простой способ для
|
|
139
|
+
Это рекомендованный способ разработчиком. Так же если не работает стандартная установка, то используйте его. Так же это самый простой способ запуска и использования утилиты, требующий скопипастить 5 команд. Он подойдет обладателям выделенных серверов, используемых под VPN. Единственным недостатком использования `docker` является требовательность его к месту, так как для запуска хромиума, который используется при авторизации, нужно половину убунты поставить (более гига).
|
|
124
140
|
|
|
125
141
|
Для начала нужно установить `docker` и `docker-compose`:
|
|
126
142
|
|
|
@@ -128,40 +144,49 @@ $$('[data-qa="vacancy-serp__vacancy_response"]').forEach((el) => el.click());
|
|
|
128
144
|
sudo apt install docker.io docker-compose-v2
|
|
129
145
|
```
|
|
130
146
|
|
|
131
|
-
Выкачиваем
|
|
147
|
+
Выкачиваем репозиторий и переходим в каталог:
|
|
132
148
|
|
|
133
149
|
```sh
|
|
134
150
|
git clone https://github.com/s3rgeym/hh-applicant-tool
|
|
151
|
+
cd hh-applicant-tool
|
|
135
152
|
```
|
|
136
153
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
```sh
|
|
140
|
-
cd hh-applicant-tool/docker
|
|
141
|
-
```
|
|
154
|
+
> [!IMPORTANT]
|
|
155
|
+
> Команды с docker-compose нужно запускать строго, находясь в данном каталоге!
|
|
142
156
|
|
|
143
|
-
Теперь
|
|
157
|
+
Теперь авторизуемся:
|
|
144
158
|
|
|
145
159
|
```sh
|
|
146
|
-
docker-compose run
|
|
147
|
-
hh-applicant-tool -vv
|
|
160
|
+
docker-compose run -u docker -it hh_applicant_tool \
|
|
161
|
+
hh-applicant-tool -vv auth -k
|
|
148
162
|
```
|
|
149
163
|
|
|
150
164
|
Пример вывода:
|
|
151
165
|
|
|
152
166
|
```
|
|
153
|
-
WARN[0000] No services to build
|
|
154
|
-
WARN[0000] No services to build
|
|
155
|
-
Container docker-tool-run-dfbc9f44c6a9 Creating
|
|
156
|
-
Container docker-tool-run-dfbc9f44c6a9 Created
|
|
157
167
|
👤 Введите email или телефон: your-mail@gmail.com
|
|
158
168
|
📨 Код был отправлен. Проверьте почту или SMS.
|
|
159
169
|
📩 Введите полученный код: 1234
|
|
160
170
|
🔓 Авторизация прошла успешно!
|
|
161
171
|
```
|
|
162
172
|
|
|
173
|
+
Авторизация с заданными логином и паролем выглядит так:
|
|
163
174
|
|
|
164
|
-
|
|
175
|
+
```sh
|
|
176
|
+
docker-compose run -u docker -it hh_applicant_tool \
|
|
177
|
+
hh-applicant-tool -vv auth -k '<login>' -p '<password>'
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Капча отобразится только в терминале с поддержкой протокола **kitty**, например, в **Kitty**, **Ghostty** или **Konsole**.
|
|
181
|
+
|
|
182
|
+
Если ваш терминал не поддерживает kitty protocol, то иожно попробовать использовать sixel protocol:
|
|
183
|
+
|
|
184
|
+
```sh
|
|
185
|
+
docker-compose run -u docker -it hh_applicant_tool \
|
|
186
|
+
hh-applicant-tool -vv auth -s
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Подробно про авторизацию можно почитать [здесь](#авторизация).
|
|
165
190
|
|
|
166
191
|
В случае успешной авторизации можно запускать рассылку откликов по крону:
|
|
167
192
|
|
|
@@ -174,19 +199,124 @@ docker-compose up -d
|
|
|
174
199
|
- Рассылать отклики со всех опубликованных резюме.
|
|
175
200
|
- Поднимать резюме.
|
|
176
201
|
|
|
177
|
-
|
|
202
|
+
Просмотр логов `cron`:
|
|
203
|
+
|
|
204
|
+
```sh
|
|
205
|
+
docker compose logs -f
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
В выводе должно быть что-то типа:
|
|
178
209
|
|
|
179
|
-
|
|
210
|
+
```sh
|
|
211
|
+
hh_applicant_tool | [Wed Jan 14 08:33:53 MSK 2026] Running startup tasks...
|
|
212
|
+
hh_applicant_tool | ℹ️ Токен не истек, обновление не требуется.
|
|
213
|
+
hh_applicant_tool | ✅ Обновлено Программист
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Чтобы прекратить просмотр логов, нажмите `Ctrl-C`.
|
|
217
|
+
|
|
218
|
+
Информацию об ошибках можно посмотреть в файле `config/log.txt`, а контакты работодателей — в `config/data` с помощью `sqlite3`. В `config/config.json` хранятся токены, дающие доступ к аккаунту.
|
|
219
|
+
|
|
220
|
+
Запущенные сервисы докер стартуют автоматически после перезагрузки. Остановить их можно выполнив:
|
|
180
221
|
|
|
181
222
|
```sh
|
|
182
223
|
docker-compose down
|
|
183
224
|
```
|
|
184
225
|
|
|
185
|
-
|
|
226
|
+
Чтобы обновить утилиту в большинству случаев достаточно в каталоге выполнить:
|
|
227
|
+
|
|
228
|
+
```sh
|
|
229
|
+
git pull
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
В редких случаях нужно пересобрать все:
|
|
233
|
+
|
|
234
|
+
```sh
|
|
235
|
+
docker compose up -d --build
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Чтобы рассылать отклики с нескольких аккаунтов, нужно переписать `docker-compose.yml`:
|
|
186
239
|
|
|
187
|
-
|
|
240
|
+
```yaml
|
|
241
|
+
services:
|
|
242
|
+
# Не меняем ничего тут
|
|
243
|
+
hh_applicant_tool:
|
|
244
|
+
# ...
|
|
245
|
+
|
|
246
|
+
# Добавляем новые строки
|
|
247
|
+
|
|
248
|
+
# Просто копипастим, меняя имя сервиса, container_name и значение HH_PROFILE_ID
|
|
249
|
+
hh_second:
|
|
250
|
+
extends: hh_applicant_tool
|
|
251
|
+
container_name: hh_second
|
|
252
|
+
environment:
|
|
253
|
+
- HH_PROFILE_ID=second
|
|
254
|
+
|
|
255
|
+
hh_third:
|
|
256
|
+
extends: hh_applicant_tool
|
|
257
|
+
container_name: hh_third
|
|
258
|
+
environment:
|
|
259
|
+
- HH_PROFILE_ID=third
|
|
260
|
+
|
|
261
|
+
# Общий шаблон для новых профилей
|
|
262
|
+
уникальное_имя_сервиса:
|
|
263
|
+
extends: hh_applicant_tool
|
|
264
|
+
# может совпадать с именем сервиса
|
|
265
|
+
container_name: уникальное_имя_контейнера
|
|
266
|
+
environment:
|
|
267
|
+
- HH_PROFILE_ID=название_профиля
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
> [!IMPORTANT]
|
|
271
|
+
> В этом файле важны отступы!
|
|
272
|
+
|
|
273
|
+
Обратите внимание на `HH_PROFILE_ID` — его значение указывается при авторизации, если профиль отличен от дефолтного. Далее нужно авторизоваться в каждом профиле:
|
|
274
|
+
|
|
275
|
+
```sh
|
|
276
|
+
# Авторизуемся со второго профиля
|
|
277
|
+
docker-compose exec -u docker -it hh_applicant_tool \
|
|
278
|
+
hh-applicant-tool --profile-id second auth -k
|
|
279
|
+
|
|
280
|
+
# Авторизуемся с третьего профиля
|
|
281
|
+
docker-compose exec -u docker -it hh_applicant_tool \
|
|
282
|
+
hh-applicant-tool --profile-id third auth -k
|
|
283
|
+
|
|
284
|
+
# И так далее
|
|
285
|
+
```
|
|
188
286
|
|
|
189
|
-
|
|
287
|
+
Ну и выполнить `docker-compose up -d` чтобы запустить новые сервисы.
|
|
288
|
+
|
|
289
|
+
[Команды](#описание-команд) можно потестировать в запущенном контейнере:
|
|
290
|
+
|
|
291
|
+
```sh
|
|
292
|
+
$ docker-compose exec -u docker -it hh_applicant_tool bash
|
|
293
|
+
docker@1897bdd7c80b:/app$ hh-applicant-tool config -p
|
|
294
|
+
/app/config/config.json
|
|
295
|
+
docker@1897bdd7c80b:/app$ hh-applicant-tool refresh-token
|
|
296
|
+
ℹ️ Токен не истек, обновление не требуется.
|
|
297
|
+
docker@1897bdd7c80b:/app$
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
> [!IMPORTANT]
|
|
301
|
+
> Обратите внимание, что `docker-compose exec`/`docker-compose run` запускаются с аргументами `-u docker`. Только для пользователя `docker` установлен `chromium`, необходимый для авторизации, а так же это избавляет от проблем с правами, когда созданные файлы для изменения требуют root-права.
|
|
302
|
+
|
|
303
|
+
Если хотите команду `apply-similar` вызывать с какими-то аргументами, то создайте в корне файл `apply-similar.sh`:
|
|
304
|
+
|
|
305
|
+
```sh
|
|
306
|
+
#!/bin/bash
|
|
307
|
+
|
|
308
|
+
/usr/local/bin/python -m hh_applicant_tool apply-similar -L messages.txt # укажите любые аргументы
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
В файлах `startup.sh` и `crontab` замените `/usr/local/bin/python -m hh_applicant_tool apply-similar` на `/bin/sh /app/apply-similar.sh`.
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Стандартная установка
|
|
316
|
+
|
|
317
|
+
### Установка утилиты
|
|
318
|
+
|
|
319
|
+
Универсальный способ с использованием pipx (требует пакета `python-pipx` в Arch):
|
|
190
320
|
|
|
191
321
|
```bash
|
|
192
322
|
# Полная версия с поддержкой авторизации, включает Node.js и различные утилиты
|
|
@@ -197,6 +327,9 @@ $ pipx install 'hh-applicant-tool[playwright]'
|
|
|
197
327
|
# Если хочется использовать самую последнюю версию, то можно установить ее через git
|
|
198
328
|
$ pipx install "git+https://github.com/s3rgeym/hh-applicant-tool[playwright]"
|
|
199
329
|
|
|
330
|
+
# Чтобы выводить капчу через sixel нужен pillow
|
|
331
|
+
$ pipx install 'hh-applicant-tool[playwright,pillow]'
|
|
332
|
+
|
|
200
333
|
# Для обновления до новой версии
|
|
201
334
|
$ pipx upgrade hh-applicant-tool
|
|
202
335
|
```
|
|
@@ -217,14 +350,17 @@ pip install 'hh-applicant-tool[playwright]'
|
|
|
217
350
|
|
|
218
351
|
- Для начала поставьте последнюю версию **Python 3** любым удобным способом.
|
|
219
352
|
- Запустите **Terminal** или **PowerShell** от Администратора и выполните:
|
|
353
|
+
|
|
220
354
|
```ps
|
|
221
355
|
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
|
|
222
356
|
```
|
|
357
|
+
|
|
223
358
|
Данная политика разрешает текущему пользователю (от которого зашли) запускать скрипты. Без нее не будут работать виртуальные окружения.
|
|
224
359
|
|
|
225
360
|
Далее можно поставить `pipx` и вернуться к инструкции в верху раздела:
|
|
226
361
|
|
|
227
362
|
- Все так же от администратора выполните:
|
|
363
|
+
|
|
228
364
|
```ps
|
|
229
365
|
python -m pip install --user pipx
|
|
230
366
|
```
|
|
@@ -251,32 +387,38 @@ pip install 'hh-applicant-tool[playwright]'
|
|
|
251
387
|
```
|
|
252
388
|
|
|
253
389
|
- Поставьте все пакеты в виртуальное окружение `hh-applicant-venv`:
|
|
390
|
+
|
|
254
391
|
```ps
|
|
255
392
|
(hh-applicant-venv) PS> pip install 'hh-applicant-tool[playwright]'
|
|
256
393
|
```
|
|
394
|
+
|
|
257
395
|
- Проверьте, работает ли оно:
|
|
396
|
+
|
|
258
397
|
```ps
|
|
259
398
|
(hh-applicant-venv) PS> hh-applicant-tool -h
|
|
260
399
|
```
|
|
400
|
+
|
|
261
401
|
- В случае неудачи вернитесь к первому шагу.
|
|
262
402
|
- Для последующих запусков сначала активируйте виртуальное окружение.
|
|
263
403
|
|
|
264
|
-
|
|
404
|
+
### Дополнительные зависимости
|
|
265
405
|
|
|
266
|
-
После вышеописанного нужно установить зависимости в виде Chromium и
|
|
406
|
+
После вышеописанного нужно установить зависимости в виде Chromium и др:
|
|
267
407
|
|
|
268
408
|
```sh
|
|
269
|
-
|
|
409
|
+
hh-applicant-tool install
|
|
270
410
|
```
|
|
271
411
|
|
|
272
412
|
Этот шаг необязателен. Все это нужно только для авторизации.
|
|
273
413
|
|
|
274
|
-
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## Авторизация
|
|
275
417
|
|
|
276
418
|
Прямая авторизация:
|
|
277
419
|
|
|
278
420
|
```bash
|
|
279
|
-
|
|
421
|
+
hh-applicant-tool authorize '<ваш телефон или email>' -p '<пароль>'
|
|
280
422
|
```
|
|
281
423
|
|
|
282
424
|
Если вы пропустили пункт про установку зависимостей, то увидите такую ошибку:
|
|
@@ -291,7 +433,6 @@ $ hh-applicant-tool authorize '<ваш телефон или email>' -p '<пар
|
|
|
291
433
|
[E] name 'async_playwright' is not defined
|
|
292
434
|
```
|
|
293
435
|
|
|
294
|
-
|
|
295
436
|
Если не помните пароль или др. причины, то можно авторизоваться с помощью одноразового кода:
|
|
296
437
|
|
|
297
438
|
```bash
|
|
@@ -303,7 +444,7 @@ $ hh-applicant-tool authorize '<ваш телефон или email>'
|
|
|
303
444
|
|
|
304
445
|
Если же при вводе правильных данных возникает ошибка авторизации, то, скорее всего, требуется ввод капчи.
|
|
305
446
|
|
|
306
|
-
Капчу можно ввести через терминал, если тот поддерживает kitty protocol (например, Kitty
|
|
447
|
+
Капчу можно ввести через терминал, если тот поддерживает **kitty protocol** (например, **Kitty**, **Konsole**, **Ghostty** и др):
|
|
307
448
|
|
|
308
449
|
```sh
|
|
309
450
|
hh-applicant-tool authorize --use-kitty
|
|
@@ -311,6 +452,10 @@ hh-applicant-tool authorize --use-kitty
|
|
|
311
452
|
|
|
312
453
|
<img width="843" height="602" alt="Untitled" src="https://github.com/user-attachments/assets/8f5dec0c-c3d4-4c5c-bd8b-3aeffa623d87" />
|
|
313
454
|
|
|
455
|
+
Так же для вывода капчи можно использовать **sixel protocol**: `--use-sixel/--sixel/-s`. Это старый протокол, реализованный во множестве терминалов в **Linux**/**BSD** (**MacOS**). Он так же поддерживается в **Windows Terminal**, начиная с версии [1.22](https://devblogs.microsoft.com/commandline/windows-terminal-preview-1-22-release/#sixel-image-support).
|
|
456
|
+
|
|
457
|
+
Из популярных современных терминалов вывод графики не поддерживает **Alacritty**.
|
|
458
|
+
|
|
314
459
|
Ручная авторизация с запуском встроенного браузера:
|
|
315
460
|
|
|
316
461
|
```sh
|
|
@@ -326,15 +471,19 @@ $ hh-applicant-tool whoami
|
|
|
326
471
|
|
|
327
472
|
В случае успешной авторизации токены будут сохранены в `config.json`.
|
|
328
473
|
|
|
474
|
+
При удачной авторизации логин (почта или телефон) и пароль, если последний был передан, запоминаются и будут подставляться автоматически, если не указать их явно.
|
|
475
|
+
|
|
329
476
|
Токен доступа выдается на две недели. Он обновляется автоматически. Для его ручного обновления нужно выполнить:
|
|
330
477
|
|
|
331
478
|
```bash
|
|
332
|
-
|
|
479
|
+
hh-applicant-tool refresh-token
|
|
333
480
|
```
|
|
334
481
|
|
|
335
482
|
Помните, что у `refresh_token` тоже есть время жизни, поэтому может потребоваться полная авторизация.
|
|
336
483
|
|
|
337
|
-
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## Описание команд
|
|
338
487
|
|
|
339
488
|
Примеры команд:
|
|
340
489
|
|
|
@@ -419,7 +568,6 @@ $ hh-applicant-tool settings
|
|
|
419
568
|
| Тип | Ключ | Значение |
|
|
420
569
|
+----------+-------------------------+-------------------------+
|
|
421
570
|
| str | user.email | dmitry.kozlov@yandex.ru |
|
|
422
|
-
| int | auth.last_login | 1768462521 |
|
|
423
571
|
+----------+-------------------------+-------------------------+
|
|
424
572
|
|
|
425
573
|
# Получить значение по ключу
|
|
@@ -452,7 +600,7 @@ $ hh-applicant-tool settings auth.username 'user@example.com'
|
|
|
452
600
|
| **uninstall** | Удаляет браузер Chromium, используемый для авторизации. |
|
|
453
601
|
| **check-proxy** | Проверяет используемые прокси |
|
|
454
602
|
| **migrate** | Починить базу |
|
|
455
|
-
| **query** | Выполнение SQL-запросов к базе. Схема БД находится в файле [schema.sql](./hh_hh_applicant_tool/storage/queries/schema.sql). Если скормить ее [DeepSeek](https://chat.deepseek.com), то он поможет написать любой запрос. |
|
|
603
|
+
| **query** | Выполнение SQL-запросов к базе. Схема БД находится в файле [schema.sql](./src//hh_hh_applicant_tool/storage/queries/schema.sql). Если скормить ее [DeepSeek](https://chat.deepseek.com), то он поможет написать любой запрос. |
|
|
456
604
|
| **log** | Просмотр файла-лога. С флагом -f будет следить за изменениями. В логах частично скрыты идентефикаторы в целях безопасности. |
|
|
457
605
|
|
|
458
606
|
Утилита использует систему плагинов. Все они лежат в [operations](https://github.com/s3rgeym/hh-applicant-tool/tree/main/src/hh_applicant_tool/operations). Модули, расположенные там, автоматически добавляются как доступные команды. За основу для своего плагина можно взять [whoami.py](https://github.com/s3rgeym/hh-applicant-tool/tree/main/src/hh_applicant_tool/operations/whoami.py).
|
|
@@ -471,7 +619,7 @@ https://hh.ru/employer/4679771
|
|
|
471
619
|
Синтаксис `call-api` немного похож на `httpie` или `curlie`:
|
|
472
620
|
|
|
473
621
|
```sh
|
|
474
|
-
|
|
622
|
+
hh-applicant-tool call-api [-m {GET|POST|PUT|DELETE}] <endpoint> [<key=value> ...]
|
|
475
623
|
```
|
|
476
624
|
|
|
477
625
|
Если используется метод `GET` или `DELETE` (или ничего не указано), то параметры будут переданы как query string. Во всех остальных случаях парметры передаются как `application/x-www-form-urlencoded` в теле запроса.
|
|
@@ -490,13 +638,14 @@ npx @redocly/cli preview -d docs/hhapi
|
|
|
490
638
|
|
|
491
639
|
Потом нужно открыть в браузере [http://localhost:4000](http://localhost:4000).
|
|
492
640
|
|
|
641
|
+
> [!NOTE]
|
|
493
642
|
> Отдельные замечания у меня к API HH. Оно пиздец какое кривое. Например, при создании заявки возвращается пустой ответ либо редирект, хотя по логике должен возвращаться созданный объект. Так же в ответах сервера нет `Content-Length`. Из-за этого нельзя узнать, есть ли тело у ответа сервера, нужно его пробовать прочитать. Я так понял, там какой-то прокси оборачивает все запросы и отдает всегда `Transfer-Encoding: Chunked`. А еще он возвращает 502 ошибку, когда бэкенд на Java падает либо долго отвечает (таймаут)? А вот [язык запросов](https://hh.ru/article/1175) мне понравился. Можно что-то вроде этого использовать `NOT (!ID:123 OR !ID:456 OR !ID:789)`, чтобы отсеить какие-то вакансии.
|
|
494
643
|
|
|
495
|
-
|
|
496
|
-
|
|
497
644
|
По сути, никакие дополнительные команды, кроме имеющихся, не нужны. Вы можете сделать что угодно с помощью `call-api`, но если хочется чего-то особенного, можно добавить свои команды.
|
|
498
645
|
|
|
499
|
-
|
|
646
|
+
---
|
|
647
|
+
|
|
648
|
+
## Использование AI
|
|
500
649
|
|
|
501
650
|
Для генерации опроводительных писем при откликах и ответа в чаты работодателей (`reply-employers`) можно использовать OpenAI (ChatGPT).
|
|
502
651
|
|
|
@@ -508,7 +657,9 @@ hh-applicant-tool apply-similar -f --ai
|
|
|
508
657
|
|
|
509
658
|
Генерацию сопроводительных писем в откликах я считаю лишним, так как их никто не читает. Экономнее воспользоваться шаблонами сообщений.
|
|
510
659
|
|
|
511
|
-
|
|
660
|
+
---
|
|
661
|
+
|
|
662
|
+
### OpenAI/ChatGPT
|
|
512
663
|
|
|
513
664
|
Отредактируйте конфиг:
|
|
514
665
|
|
|
@@ -523,11 +674,19 @@ hh-applicant-tool config -e
|
|
|
523
674
|
"openai": {
|
|
524
675
|
"token": "ВАШ_API_КЛЮЧ_OPENAI",
|
|
525
676
|
"model": "ВАША_МОДЕЛЬ",
|
|
677
|
+
// Это дефолтные значения, которые можно переопределить
|
|
678
|
+
"temperature": 0.7,
|
|
679
|
+
"max_completion_tokens": 1000,
|
|
680
|
+
// Вместо ChatGPT можно использовать другие сервисы
|
|
681
|
+
// Учтите, что при исп-ии Docker нужно указывать 192.168... вместо localhost
|
|
682
|
+
"completion_endpoint": "http://localhost:3000...",
|
|
526
683
|
}
|
|
527
684
|
}
|
|
528
685
|
```
|
|
529
686
|
|
|
530
|
-
|
|
687
|
+
---
|
|
688
|
+
|
|
689
|
+
## Шаблоны сообщений
|
|
531
690
|
|
|
532
691
|
Команды `apply-similar` и `reply-employers` поддерживают специальный формат сообщений.
|
|
533
692
|
|
|
@@ -559,7 +718,9 @@ hh-applicant-tool config -e
|
|
|
559
718
|
Привет, как ты?
|
|
560
719
|
```
|
|
561
720
|
|
|
562
|
-
|
|
721
|
+
---
|
|
722
|
+
|
|
723
|
+
## Данные приложения
|
|
563
724
|
|
|
564
725
|
Данные приложения хранятся по следующим путям:
|
|
565
726
|
|
|
@@ -569,7 +730,7 @@ hh-applicant-tool config -e
|
|
|
569
730
|
| **macOS** | `~/Library/Application Support/hh-applicant-tool/` |
|
|
570
731
|
| **Linux** | `~/.config/hh-applicant-tool/` |
|
|
571
732
|
|
|
572
|
-
|
|
733
|
+
### Конфигурационный файл
|
|
573
734
|
|
|
574
735
|
Главный конфиг называется `config.json`. Он содержит токены. Полный путь до конфигурационного файла можно вывести с помощью команды:
|
|
575
736
|
|
|
@@ -581,7 +742,8 @@ hh-applicant-tool config -p
|
|
|
581
742
|
|
|
582
743
|
| Имя атрибута | Описание |
|
|
583
744
|
| --------------- | ------------------------------------------------------------------------------------------ |
|
|
584
|
-
| `proxy_url` | Прокси, используемый для всех запросов, например, `socks5h://
|
|
745
|
+
| `proxy_url` | Прокси, используемый для всех запросов, например, `socks5h://localhost:1080` |
|
|
746
|
+
| `api_delay` | Минимальная между отправкой запросов к API HH |
|
|
585
747
|
| `reply_message` | Сообщение для ответа работодателю при отклике на вакансии, см. формат сообщений |
|
|
586
748
|
| `user_agent` | Кастомный юзерагент, передаваемый при каждом запросе. По умолчанию используется от Android |
|
|
587
749
|
| `client_id` | Идентификатор клиента, используемый для авторизации. По умолчанию используется от Android |
|
|
@@ -591,23 +753,25 @@ hh-applicant-tool config -p
|
|
|
591
753
|
|
|
592
754
|
При использовании профиля, отличного от дефолтного, данные хранятся в подкаталоге.
|
|
593
755
|
|
|
594
|
-
|
|
756
|
+
### Логи
|
|
595
757
|
|
|
596
758
|
В `log.txt` всегда можно посмотреть подробную информацию об ошибках. В целях безопасности токены, идентефикаторы резюме и тп затираются.
|
|
597
759
|
|
|
598
|
-
|
|
760
|
+
### База данных
|
|
599
761
|
|
|
600
762
|
Данные о работодателях и их вакансиях хранятся в файле `data`. Это обычная база `sqlite3`, вы ее можете просматривать через `DB Browser` и т. п.
|
|
601
763
|
|
|
602
764
|
Что хранится в базе:
|
|
603
765
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
766
|
+
- все просмотренные вакансии;
|
|
767
|
+
- профили работодателей;
|
|
768
|
+
- контакты работодателей;
|
|
769
|
+
- данные об откликах;
|
|
770
|
+
- иные данные, важные для работы.
|
|
771
|
+
|
|
772
|
+
---
|
|
609
773
|
|
|
610
|
-
|
|
774
|
+
## Использование в скриптах
|
|
611
775
|
|
|
612
776
|
Если хотите использовать `hh-applicant-tool` в своих скриптах, то можно это сделать так:
|
|
613
777
|
|
|
@@ -641,45 +805,46 @@ tool.save_token()
|
|
|
641
805
|
📩 Введите полученный код:
|
|
642
806
|
```
|
|
643
807
|
|
|
644
|
-
|
|
808
|
+
---
|
|
809
|
+
|
|
810
|
+
## Дополнительные настройки
|
|
645
811
|
|
|
646
|
-
|
|
812
|
+
<details>
|
|
813
|
+
<summary>Если вы обычный пользователь, то ничего лучше не трогайте.</summary>
|
|
647
814
|
|
|
648
815
|
Отключение проверки версии с выводом предупреждения:
|
|
649
816
|
|
|
650
817
|
```sh
|
|
651
|
-
|
|
818
|
+
hh-applicant-tool settings disable_version_check true
|
|
652
819
|
```
|
|
653
820
|
|
|
654
821
|
Утилита ищет в логах информацию о Python-ошибках. Они отправляются на сервер разработчика с целью их оперативного исправления, однако, вы можете отключить отправку отчетов:
|
|
655
822
|
|
|
656
823
|
```sh
|
|
657
|
-
|
|
824
|
+
hh-applicant-tool settings send_error_reports false
|
|
658
825
|
```
|
|
659
826
|
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
- Выкинуть ненужный функционал. Например, хранить отзывы нет смысла, так как они нигде не используются
|
|
827
|
+
</details>
|
|
663
828
|
|
|
829
|
+
---
|
|
664
830
|
|
|
665
|
-
|
|
831
|
+
## Лицензионное соглашение (Limited Non-Commercial License)
|
|
666
832
|
|
|
667
833
|
Данное программное обеспечение распространяется на условиях **ограниченной некоммерческой лицензии**.
|
|
668
834
|
|
|
669
835
|
- **Разрешённое использование**
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
836
|
+
- **Личное использование и изучение:** Разрешается копирование и модификация кода исключительно для личного ознакомления, обучения и отладки **без права публикации или распространения изменений**.
|
|
837
|
+
- **Интеграция в программное обеспечение:** Разрешается включение данного кода в состав сторонних бесплатных некоммерческих продуктов **только при полном сохранении исходного кода в неизменном виде**.
|
|
838
|
+
- **Атрибуция:** Любое распространение, демонстрация или использование кода (в том числе в составе других продуктов) допускается **только при обязательном указании автора и ссылки на оригинальный репозиторий**.
|
|
673
839
|
|
|
674
840
|
- **Ограничения на использование**
|
|
675
841
|
**Строго запрещается** использование данного кода в любых коммерческих целях без предварительного письменного согласия автора, включая, но не ограничиваясь:
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
842
|
+
- Интеграцией в платные сервисы, приложения, веб-сайты либо использованием в рамках оказания платных услуг.
|
|
843
|
+
- Публикацией, распространением или передачей третьим лицам **модифицированных (изменённых) версий** кода.
|
|
844
|
+
- Перепродажей, сублицензированием либо использованием кода в интересах коммерческих организаций.
|
|
679
845
|
|
|
680
846
|
- **Отказ от ответственности**
|
|
681
847
|
Программное обеспечение предоставляется по принципу «как есть» (**AS IS**). Автор не несёт ответственности за любые прямые или косвенные убытки, включая, но не ограничиваясь, блокировкой аккаунтов, потерей данных или иными негативными последствиями, возникшими в результате использования данного программного обеспечения.
|
|
682
848
|
|
|
683
|
-
|
|
684
849
|
**© 2023-2026 Sergey M. Все права защищены.**
|
|
685
850
|
|