hh-applicant-tool 1.4.7__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 +30 -14
- hh_applicant_tool/api/__init__.py +4 -2
- hh_applicant_tool/api/client.py +32 -17
- hh_applicant_tool/{constants.py → api/client_keys.py} +3 -3
- hh_applicant_tool/{datatypes.py → api/datatypes.py} +2 -0
- hh_applicant_tool/api/errors.py +8 -2
- hh_applicant_tool/{utils → api}/user_agent.py +1 -1
- hh_applicant_tool/main.py +63 -38
- hh_applicant_tool/operations/apply_similar.py +136 -52
- hh_applicant_tool/operations/authorize.py +97 -28
- hh_applicant_tool/operations/call_api.py +3 -3
- hh_applicant_tool/operations/{check_negotiations.py → clear_negotiations.py} +40 -26
- hh_applicant_tool/operations/list_resumes.py +5 -7
- hh_applicant_tool/operations/query.py +5 -3
- hh_applicant_tool/operations/refresh_token.py +9 -2
- hh_applicant_tool/operations/reply_employers.py +80 -40
- hh_applicant_tool/operations/settings.py +2 -2
- hh_applicant_tool/operations/update_resumes.py +5 -4
- hh_applicant_tool/operations/whoami.py +3 -3
- hh_applicant_tool/storage/__init__.py +5 -1
- hh_applicant_tool/storage/facade.py +2 -2
- hh_applicant_tool/storage/models/base.py +9 -4
- hh_applicant_tool/storage/models/contacts.py +42 -0
- hh_applicant_tool/storage/queries/schema.sql +23 -10
- hh_applicant_tool/storage/repositories/base.py +69 -15
- hh_applicant_tool/storage/repositories/contacts.py +5 -10
- hh_applicant_tool/storage/repositories/employers.py +1 -0
- hh_applicant_tool/storage/repositories/errors.py +19 -0
- hh_applicant_tool/storage/repositories/negotiations.py +1 -0
- hh_applicant_tool/storage/repositories/resumes.py +2 -7
- hh_applicant_tool/storage/repositories/settings.py +1 -0
- hh_applicant_tool/storage/repositories/vacancies.py +1 -0
- hh_applicant_tool/storage/utils.py +12 -15
- hh_applicant_tool/utils/__init__.py +3 -3
- hh_applicant_tool/utils/config.py +1 -1
- hh_applicant_tool/utils/log.py +6 -3
- hh_applicant_tool/utils/mixins.py +28 -46
- hh_applicant_tool/utils/string.py +15 -0
- hh_applicant_tool/utils/terminal.py +115 -0
- {hh_applicant_tool-1.4.7.dist-info → hh_applicant_tool-1.5.7.dist-info}/METADATA +384 -162
- hh_applicant_tool-1.5.7.dist-info/RECORD +68 -0
- {hh_applicant_tool-1.4.7.dist-info → hh_applicant_tool-1.5.7.dist-info}/WHEEL +1 -1
- hh_applicant_tool/storage/models/contact.py +0 -16
- hh_applicant_tool-1.4.7.dist-info/RECORD +0 -67
- /hh_applicant_tool/utils/{dateutil.py → date.py} +0 -0
- /hh_applicant_tool/utils/{jsonutil.py → json.py} +0 -0
- {hh_applicant_tool-1.4.7.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
|
|
@@ -11,7 +11,9 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.13
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.14
|
|
14
|
+
Provides-Extra: pillow
|
|
14
15
|
Provides-Extra: playwright
|
|
16
|
+
Requires-Dist: pillow (>=12.1.0,<13.0.0) ; extra == "pillow"
|
|
15
17
|
Requires-Dist: playwright (>=1.57.0,<2.0.0) ; extra == "playwright"
|
|
16
18
|
Requires-Dist: prettytable (>=3.6.0,<4.0.0)
|
|
17
19
|
Requires-Dist: requests[socks] (>=2.32.3,<3.0.0)
|
|
@@ -19,7 +21,10 @@ Project-URL: Homepage, https://github.com/s3rgeym/hh-applicant-tool
|
|
|
19
21
|
Project-URL: Repository, https://github.com/s3rgeym/hh-applicant-tool
|
|
20
22
|
Description-Content-Type: text/markdown
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
# HH Applicant Tool
|
|
25
|
+
|
|
26
|
+
> [!NOTE]
|
|
27
|
+
> Ищу почасовую или проектную [@feedback_s3rgeym_bot](https://t.me/feedback_s3rgeym_bot) (Python, Vue.js, Devops)
|
|
23
28
|
|
|
24
29
|

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

|
|
93
116
|
|
|
117
|
+
> [!NOTE]
|
|
94
118
|
> Если в веб-интерфейсе выставить фильтры, то они будут применяться в скрипте при отклике на подходящие
|
|
95
119
|
|
|
120
|
+
> [!NOTE]
|
|
96
121
|
> Утилита автоматически подхватывает прокси из переменных окружения типа http_proxy или HTTPS_PROXY
|
|
97
122
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
<img width="1306" height="1000" alt="image" src="https://github.com/user-attachments/assets/67742b8d-a16c-4304-bd79-7ac99d53ed38" />
|
|
101
|
-
|
|
102
|
-
### Внимание!!!
|
|
103
|
-
|
|
104
|
-
Если для Вас проблема установить данную утилиту, лень разбираться с ее настройкой, то Вы можете установить мое приложение под **Android** [HH Resume Automate](https://github.com/s3rgeym/hh-resume-automate/). Оно обладает минимальным функционалом: обновление резюме (одного) и рассылка откликов (чистить их и т. п. нельзя).
|
|
123
|
+
---
|
|
105
124
|
|
|
106
|
-
|
|
125
|
+
## Предыстория
|
|
107
126
|
|
|
108
127
|
Долгое время я делал массовые заявки с помощью консоли браузера:
|
|
109
128
|
|
|
@@ -113,11 +132,191 @@ $$('[data-qa="vacancy-serp__vacancy_response"]').forEach((el) => el.click());
|
|
|
113
132
|
|
|
114
133
|
Оно работает, хоть и не идеально. Я даже пробовал автоматизировать рассылки через `p[yu]ppeteer`, пока не прочитал [документацию](https://github.com/hhru/api). И не обнаружил, что **API** (интерфейс) содержит все необходимые мне методы. Headhunter позволяет создать свое приложение, но там ручная модерация, и навряд ли кто-то разрешит мне создать приложение для спама заявками. Я [декомпилировал](https://gist.github.com/s3rgeym/eee96bbf91b04f7eb46b7449f8884a00) официальное приложение для **Android** и получил **CLIENT_ID** и **CLIENT_SECRET**, необходимые для работы через **API**.
|
|
115
134
|
|
|
116
|
-
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Запуск через Docker
|
|
138
|
+
|
|
139
|
+
Это рекомендованный способ разработчиком. Так же если не работает стандартная установка, то используйте его. Так же это самый простой способ запуска и использования утилиты, требующий скопипастить 5 команд. Он подойдет обладателям выделенных серверов, используемых под VPN. Единственным недостатком использования `docker` является требовательность его к месту, так как для запуска хромиума, который используется при авторизации, нужно половину убунты поставить (более гига).
|
|
140
|
+
|
|
141
|
+
Для начала нужно установить `docker` и `docker-compose`:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
sudo apt install docker.io docker-compose-v2
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Выкачиваем репозиторий и переходим в каталог:
|
|
148
|
+
|
|
149
|
+
```sh
|
|
150
|
+
git clone https://github.com/s3rgeym/hh-applicant-tool
|
|
151
|
+
cd hh-applicant-tool
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
> [!IMPORTANT]
|
|
155
|
+
> Команды с docker-compose нужно запускать строго, находясь в данном каталоге!
|
|
156
|
+
|
|
157
|
+
Теперь авторизуемся:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
docker-compose run -u docker -it hh_applicant_tool \
|
|
161
|
+
hh-applicant-tool -vv auth -k
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Пример вывода:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
👤 Введите email или телефон: your-mail@gmail.com
|
|
168
|
+
📨 Код был отправлен. Проверьте почту или SMS.
|
|
169
|
+
📩 Введите полученный код: 1234
|
|
170
|
+
🔓 Авторизация прошла успешно!
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Авторизация с заданными логином и паролем выглядит так:
|
|
174
|
+
|
|
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
|
+
Подробно про авторизацию можно почитать [здесь](#авторизация).
|
|
190
|
+
|
|
191
|
+
В случае успешной авторизации можно запускать рассылку откликов по крону:
|
|
192
|
+
|
|
193
|
+
```sh
|
|
194
|
+
docker-compose up -d
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Что будет делать?
|
|
198
|
+
|
|
199
|
+
- Рассылать отклики со всех опубликованных резюме.
|
|
200
|
+
- Поднимать резюме.
|
|
201
|
+
|
|
202
|
+
Просмотр логов `cron`:
|
|
203
|
+
|
|
204
|
+
```sh
|
|
205
|
+
docker compose logs -f
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
В выводе должно быть что-то типа:
|
|
209
|
+
|
|
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` хранятся токены, дающие доступ к аккаунту.
|
|
117
219
|
|
|
118
|
-
|
|
220
|
+
Запущенные сервисы докер стартуют автоматически после перезагрузки. Остановить их можно выполнив:
|
|
119
221
|
|
|
120
|
-
|
|
222
|
+
```sh
|
|
223
|
+
docker-compose down
|
|
224
|
+
```
|
|
225
|
+
|
|
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`:
|
|
239
|
+
|
|
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
|
+
```
|
|
286
|
+
|
|
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):
|
|
121
320
|
|
|
122
321
|
```bash
|
|
123
322
|
# Полная версия с поддержкой авторизации, включает Node.js и различные утилиты
|
|
@@ -128,6 +327,9 @@ $ pipx install 'hh-applicant-tool[playwright]'
|
|
|
128
327
|
# Если хочется использовать самую последнюю версию, то можно установить ее через git
|
|
129
328
|
$ pipx install "git+https://github.com/s3rgeym/hh-applicant-tool[playwright]"
|
|
130
329
|
|
|
330
|
+
# Чтобы выводить капчу через sixel нужен pillow
|
|
331
|
+
$ pipx install 'hh-applicant-tool[playwright,pillow]'
|
|
332
|
+
|
|
131
333
|
# Для обновления до новой версии
|
|
132
334
|
$ pipx upgrade hh-applicant-tool
|
|
133
335
|
```
|
|
@@ -148,14 +350,17 @@ pip install 'hh-applicant-tool[playwright]'
|
|
|
148
350
|
|
|
149
351
|
- Для начала поставьте последнюю версию **Python 3** любым удобным способом.
|
|
150
352
|
- Запустите **Terminal** или **PowerShell** от Администратора и выполните:
|
|
353
|
+
|
|
151
354
|
```ps
|
|
152
355
|
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
|
|
153
356
|
```
|
|
357
|
+
|
|
154
358
|
Данная политика разрешает текущему пользователю (от которого зашли) запускать скрипты. Без нее не будут работать виртуальные окружения.
|
|
155
359
|
|
|
156
360
|
Далее можно поставить `pipx` и вернуться к инструкции в верху раздела:
|
|
157
361
|
|
|
158
362
|
- Все так же от администратора выполните:
|
|
363
|
+
|
|
159
364
|
```ps
|
|
160
365
|
python -m pip install --user pipx
|
|
161
366
|
```
|
|
@@ -182,32 +387,38 @@ pip install 'hh-applicant-tool[playwright]'
|
|
|
182
387
|
```
|
|
183
388
|
|
|
184
389
|
- Поставьте все пакеты в виртуальное окружение `hh-applicant-venv`:
|
|
390
|
+
|
|
185
391
|
```ps
|
|
186
392
|
(hh-applicant-venv) PS> pip install 'hh-applicant-tool[playwright]'
|
|
187
393
|
```
|
|
394
|
+
|
|
188
395
|
- Проверьте, работает ли оно:
|
|
396
|
+
|
|
189
397
|
```ps
|
|
190
398
|
(hh-applicant-venv) PS> hh-applicant-tool -h
|
|
191
399
|
```
|
|
400
|
+
|
|
192
401
|
- В случае неудачи вернитесь к первому шагу.
|
|
193
402
|
- Для последующих запусков сначала активируйте виртуальное окружение.
|
|
194
403
|
|
|
195
|
-
|
|
404
|
+
### Дополнительные зависимости
|
|
196
405
|
|
|
197
|
-
После вышеописанного нужно установить зависимости в виде Chromium и
|
|
406
|
+
После вышеописанного нужно установить зависимости в виде Chromium и др:
|
|
198
407
|
|
|
199
408
|
```sh
|
|
200
|
-
|
|
409
|
+
hh-applicant-tool install
|
|
201
410
|
```
|
|
202
411
|
|
|
203
412
|
Этот шаг необязателен. Все это нужно только для авторизации.
|
|
204
413
|
|
|
205
|
-
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## Авторизация
|
|
206
417
|
|
|
207
418
|
Прямая авторизация:
|
|
208
419
|
|
|
209
420
|
```bash
|
|
210
|
-
|
|
421
|
+
hh-applicant-tool authorize '<ваш телефон или email>' -p '<пароль>'
|
|
211
422
|
```
|
|
212
423
|
|
|
213
424
|
Если вы пропустили пункт про установку зависимостей, то увидите такую ошибку:
|
|
@@ -222,7 +433,6 @@ $ hh-applicant-tool authorize '<ваш телефон или email>' -p '<пар
|
|
|
222
433
|
[E] name 'async_playwright' is not defined
|
|
223
434
|
```
|
|
224
435
|
|
|
225
|
-
|
|
226
436
|
Если не помните пароль или др. причины, то можно авторизоваться с помощью одноразового кода:
|
|
227
437
|
|
|
228
438
|
```bash
|
|
@@ -232,18 +442,25 @@ $ hh-applicant-tool authorize '<ваш телефон или email>'
|
|
|
232
442
|
🔓 Авторизация прошла успешно!
|
|
233
443
|
```
|
|
234
444
|
|
|
235
|
-
- Если вы ввели телефон, то код придет через SMS
|
|
236
|
-
- Если был введен Email, то проверьте почту
|
|
237
|
-
|
|
238
445
|
Если же при вводе правильных данных возникает ошибка авторизации, то, скорее всего, требуется ввод капчи.
|
|
239
446
|
|
|
240
|
-
|
|
447
|
+
Капчу можно ввести через терминал, если тот поддерживает **kitty protocol** (например, **Kitty**, **Konsole**, **Ghostty** и др):
|
|
241
448
|
|
|
242
449
|
```sh
|
|
243
|
-
hh-applicant-tool authorize --
|
|
450
|
+
hh-applicant-tool authorize --use-kitty
|
|
244
451
|
```
|
|
245
452
|
|
|
246
|
-
|
|
453
|
+
<img width="843" height="602" alt="Untitled" src="https://github.com/user-attachments/assets/8f5dec0c-c3d4-4c5c-bd8b-3aeffa623d87" />
|
|
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
|
+
|
|
459
|
+
Ручная авторизация с запуском встроенного браузера:
|
|
460
|
+
|
|
461
|
+
```sh
|
|
462
|
+
hh-applicant-tool authorize --manual
|
|
463
|
+
```
|
|
247
464
|
|
|
248
465
|
Проверка авторизации:
|
|
249
466
|
|
|
@@ -254,57 +471,19 @@ $ hh-applicant-tool whoami
|
|
|
254
471
|
|
|
255
472
|
В случае успешной авторизации токены будут сохранены в `config.json`.
|
|
256
473
|
|
|
474
|
+
При удачной авторизации логин (почта или телефон) и пароль, если последний был передан, запоминаются и будут подставляться автоматически, если не указать их явно.
|
|
475
|
+
|
|
257
476
|
Токен доступа выдается на две недели. Он обновляется автоматически. Для его ручного обновления нужно выполнить:
|
|
258
477
|
|
|
259
478
|
```bash
|
|
260
|
-
|
|
479
|
+
hh-applicant-tool refresh-token
|
|
261
480
|
```
|
|
262
481
|
|
|
263
482
|
Помните, что у `refresh_token` тоже есть время жизни, поэтому может потребоваться полная авторизация.
|
|
264
483
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
Конфигурации хранятся по следующим путям:
|
|
268
|
-
|
|
269
|
-
| OS | Путь |
|
|
270
|
-
| ----------- | -------------------------------------------------------- |
|
|
271
|
-
| **Windows** | `C:\Users\%username%\AppData\Roaming\hh-applicant-tool\` |
|
|
272
|
-
| **macOS** | `~/Library/Application Support/hh-applicant-tool/` |
|
|
273
|
-
| **Linux** | `~/.config/hh-applicant-tool/` |
|
|
274
|
-
|
|
275
|
-
Главный конфиг называется `config.json`. Он содержит токены. Полный путь до конфигурационного файла можно вывести с помощью команды:
|
|
276
|
-
|
|
277
|
-
```bash
|
|
278
|
-
hh-applicant-tool config -p
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
Через конфиг можно задать дополнительные настройки:
|
|
282
|
-
|
|
283
|
-
| Имя атрибута | Описание |
|
|
284
|
-
| --------------- | ------------------------------------------------------------------------------------------ |
|
|
285
|
-
| `proxy_url` | Прокси, используемый для всех запросов, например, `socks5h://127.0.0.1:9050` |
|
|
286
|
-
| `reply_message` | Сообщение для ответа работодателю при отклике на вакансии, см. формат сообщений |
|
|
287
|
-
| `user_agent` | Кастомный юзерагент, передаваемый при каждом запросе. По умолчанию используется от Android |
|
|
288
|
-
| `client_id` | Идентификатор клиента, используемый для авторизации. По умолчанию используется от Android |
|
|
289
|
-
| `client_secret` | Секретный ключ клиента, используемый для авторизации. По умолчанию используется от Android |
|
|
290
|
-
|
|
291
|
-
В `log.txt` всегда можно посмотреть подробную информацию об ошибках. В целях безопасности токены, идентефикаторы резюме и тп затираются.
|
|
292
|
-
|
|
293
|
-
Данные о работодателях и их вакансиях хранятся в файле `data`. Это обычная база `sqlite3`, вы ее можете просматривать через `DB Browser` и т. п.
|
|
294
|
-
|
|
295
|
-
Что хранится в базе:
|
|
296
|
-
|
|
297
|
-
* все просмотренные вакансии;
|
|
298
|
-
* профили работодателей;
|
|
299
|
-
* контакты работодателей;
|
|
300
|
-
* данные об откликах;
|
|
301
|
-
* иные данные, важные для работы.
|
|
302
|
-
|
|
303
|
-
Если вы залогинитесь под другим аккаунтом, то данные не исчезнут.
|
|
304
|
-
|
|
305
|
-
При использовании профиля, отличного от дефолтного, данные хранятся в подкаталоге.
|
|
484
|
+
---
|
|
306
485
|
|
|
307
|
-
|
|
486
|
+
## Описание команд
|
|
308
487
|
|
|
309
488
|
Примеры команд:
|
|
310
489
|
|
|
@@ -356,7 +535,7 @@ $ hh-applicant-tool config -s proxy_url socks5h://localhost:1080
|
|
|
356
535
|
$ hh-applicant-tool config -u proxy_url
|
|
357
536
|
|
|
358
537
|
# Утилита все данные об откликах хранит в SQLite
|
|
359
|
-
$ hh-applicant-tool query 'select count(*) from
|
|
538
|
+
$ hh-applicant-tool query 'select count(*) from vacancy_contacts;'
|
|
360
539
|
+----------+
|
|
361
540
|
| count(*) |
|
|
362
541
|
+----------+
|
|
@@ -364,38 +543,14 @@ $ hh-applicant-tool query 'select count(*) from employer_contacts;'
|
|
|
364
543
|
+----------+
|
|
365
544
|
|
|
366
545
|
# Экспорт контактов в csv
|
|
367
|
-
$ hh-applicant-tool query 'select * from
|
|
546
|
+
$ hh-applicant-tool query 'select * from vacancy_contacts' --csv -o
|
|
368
547
|
contacts.csv
|
|
369
548
|
|
|
370
549
|
# Выполнение запросов в интерактивном режиме
|
|
371
550
|
$ hh-applicant-tool query
|
|
372
551
|
|
|
373
|
-
# Вывести приглашения с удаленкой и зарплатой от 200.000 рублей
|
|
374
|
-
$ hh-applicant-tool query <<<"SELECT
|
|
375
|
-
v.alternate_url,
|
|
376
|
-
v.name AS vacancy_name,
|
|
377
|
-
v.salary_from,
|
|
378
|
-
v.salary_to,
|
|
379
|
-
e.name AS employer_name,
|
|
380
|
-
e.site_url,
|
|
381
|
-
ec.name,
|
|
382
|
-
ec.email,
|
|
383
|
-
ec.phone_numbers
|
|
384
|
-
FROM vacancies v
|
|
385
|
-
JOIN negotiations n ON v.id = n.vacancy_id
|
|
386
|
-
JOIN employers e ON n.employer_id = e.id
|
|
387
|
-
LEFT JOIN employer_contacts ec ON e.id = ec.employer_id
|
|
388
|
-
WHERE v.salary_from >= 200000
|
|
389
|
-
AND v.currency = 'RUR'
|
|
390
|
-
AND v.remote = 1
|
|
391
|
-
AND n.state IN ('invitation', 'interview', 'hired')
|
|
392
|
-
ORDER BY v.salary_from DESC, v.salary_to DESC;"
|
|
393
|
-
|
|
394
|
-
# Перед выполнением запросов к базе желательно синхронизировать отклики
|
|
395
|
-
$ hh-applicant-tool sync-negotiations
|
|
396
|
-
|
|
397
552
|
# Чистим отказы
|
|
398
|
-
$ hh-applicant-tool
|
|
553
|
+
$ hh-applicant-tool clear-negotiations
|
|
399
554
|
|
|
400
555
|
# При обновлении может сломаться схема БД, для ее починки нужно выполнить
|
|
401
556
|
# поочерёдно все миграции, добавленные после выхода последней версии
|
|
@@ -413,7 +568,6 @@ $ hh-applicant-tool settings
|
|
|
413
568
|
| Тип | Ключ | Значение |
|
|
414
569
|
+----------+-------------------------+-------------------------+
|
|
415
570
|
| str | user.email | dmitry.kozlov@yandex.ru |
|
|
416
|
-
| int | auth.last_login | 1768462521 |
|
|
417
571
|
+----------+-------------------------+-------------------------+
|
|
418
572
|
|
|
419
573
|
# Получить значение по ключу
|
|
@@ -435,9 +589,9 @@ $ hh-applicant-tool settings auth.username 'user@example.com'
|
|
|
435
589
|
| **whoami**, **id** | Выводит информацию об авторизованном пользователе |
|
|
436
590
|
| **list-resumes**, **list**, **ls** | Список резюме |
|
|
437
591
|
| **update-resumes**, **update** | Обновить все резюме. Аналогично нажатию кнопки «Обновить дату». |
|
|
438
|
-
| **apply-similar** | Откликнуться на все подходящие
|
|
592
|
+
| **apply-similar** | Откликнуться на все подходящие вакансии СО ВСЕХ РЕЗЮМЕ. Лимит = 200 в день. На HH есть спам-фильтры, так что лучше не рассылайте отклики со ссылками, иначе рискуете попасть в теневой бан. |
|
|
439
593
|
| **reply-employers**, **reply** | Ответить во все чаты с работодателями, где нет ответа либо не прочитали ваш предыдущий ответ |
|
|
440
|
-
| **
|
|
594
|
+
| **clear-negotiations** | Отмена откликов |
|
|
441
595
|
| **call-api**, **api** | Вызов произвольного метода API с выводом результата. |
|
|
442
596
|
| **refresh-token**, **refresh** | Обновляет access_token. |
|
|
443
597
|
| **config** | Показывает содержимое конфига. С флагом -e открывает его для редактирования. |
|
|
@@ -446,10 +600,10 @@ $ hh-applicant-tool settings auth.username 'user@example.com'
|
|
|
446
600
|
| **uninstall** | Удаляет браузер Chromium, используемый для авторизации. |
|
|
447
601
|
| **check-proxy** | Проверяет используемые прокси |
|
|
448
602
|
| **migrate** | Починить базу |
|
|
449
|
-
| **query** | Выполнение SQL-запросов к базе. Схема БД находится в файле [schema.sql](./hh_hh_applicant_tool/storage/queries/schema.sql). Если скормить ее [DeepSeek](https://chat.deepseek.com), то он поможет написать любой запрос. |
|
|
450
|
-
| **log** | Просмотр файла-лога. С флагом -f будет следить за изменениями.
|
|
603
|
+
| **query** | Выполнение SQL-запросов к базе. Схема БД находится в файле [schema.sql](./src//hh_hh_applicant_tool/storage/queries/schema.sql). Если скормить ее [DeepSeek](https://chat.deepseek.com), то он поможет написать любой запрос. |
|
|
604
|
+
| **log** | Просмотр файла-лога. С флагом -f будет следить за изменениями. В логах частично скрыты идентефикаторы в целях безопасности. |
|
|
451
605
|
|
|
452
|
-
Утилита использует систему плагинов. Все они лежат в [operations](https://github.com/s3rgeym/hh-applicant-tool/tree/main/hh_applicant_tool/operations). Модули, расположенные там, автоматически добавляются как доступные команды. За основу для своего плагина можно взять [whoami.py](https://github.com/s3rgeym/hh-applicant-tool/tree/main/hh_applicant_tool/operations/whoami.py).
|
|
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).
|
|
453
607
|
|
|
454
608
|
Для тестирования запросов к API используйте команду `call-api` совместно с `jq` для обработки JSON.
|
|
455
609
|
|
|
@@ -465,7 +619,7 @@ https://hh.ru/employer/4679771
|
|
|
465
619
|
Синтаксис `call-api` немного похож на `httpie` или `curlie`:
|
|
466
620
|
|
|
467
621
|
```sh
|
|
468
|
-
|
|
622
|
+
hh-applicant-tool call-api [-m {GET|POST|PUT|DELETE}] <endpoint> [<key=value> ...]
|
|
469
623
|
```
|
|
470
624
|
|
|
471
625
|
Если используется метод `GET` или `DELETE` (или ничего не указано), то параметры будут переданы как query string. Во всех остальных случаях парметры передаются как `application/x-www-form-urlencoded` в теле запроса.
|
|
@@ -484,15 +638,57 @@ npx @redocly/cli preview -d docs/hhapi
|
|
|
484
638
|
|
|
485
639
|
Потом нужно открыть в браузере [http://localhost:4000](http://localhost:4000).
|
|
486
640
|
|
|
641
|
+
> [!NOTE]
|
|
487
642
|
> Отдельные замечания у меня к API HH. Оно пиздец какое кривое. Например, при создании заявки возвращается пустой ответ либо редирект, хотя по логике должен возвращаться созданный объект. Так же в ответах сервера нет `Content-Length`. Из-за этого нельзя узнать, есть ли тело у ответа сервера, нужно его пробовать прочитать. Я так понял, там какой-то прокси оборачивает все запросы и отдает всегда `Transfer-Encoding: Chunked`. А еще он возвращает 502 ошибку, когда бэкенд на Java падает либо долго отвечает (таймаут)? А вот [язык запросов](https://hh.ru/article/1175) мне понравился. Можно что-то вроде этого использовать `NOT (!ID:123 OR !ID:456 OR !ID:789)`, чтобы отсеить какие-то вакансии.
|
|
488
643
|
|
|
644
|
+
По сути, никакие дополнительные команды, кроме имеющихся, не нужны. Вы можете сделать что угодно с помощью `call-api`, но если хочется чего-то особенного, можно добавить свои команды.
|
|
645
|
+
|
|
646
|
+
---
|
|
489
647
|
|
|
648
|
+
## Использование AI
|
|
490
649
|
|
|
491
|
-
|
|
650
|
+
Для генерации опроводительных писем при откликах и ответа в чаты работодателей (`reply-employers`) можно использовать OpenAI (ChatGPT).
|
|
651
|
+
|
|
652
|
+
Пример рассылки откликов с генерированным письмом:
|
|
653
|
+
|
|
654
|
+
```sh
|
|
655
|
+
hh-applicant-tool apply-similar -f --ai
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
Генерацию сопроводительных писем в откликах я считаю лишним, так как их никто не читает. Экономнее воспользоваться шаблонами сообщений.
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
662
|
+
### OpenAI/ChatGPT
|
|
663
|
+
|
|
664
|
+
Отредактируйте конфиг:
|
|
665
|
+
|
|
666
|
+
```sh
|
|
667
|
+
hh-applicant-tool config -e
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
Добавьте в него эти строки:
|
|
671
|
+
|
|
672
|
+
```json
|
|
673
|
+
{
|
|
674
|
+
"openai": {
|
|
675
|
+
"token": "ВАШ_API_КЛЮЧ_OPENAI",
|
|
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...",
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
---
|
|
492
688
|
|
|
493
|
-
|
|
689
|
+
## Шаблоны сообщений
|
|
494
690
|
|
|
495
|
-
|
|
691
|
+
Команды `apply-similar` и `reply-employers` поддерживают специальный формат сообщений.
|
|
496
692
|
|
|
497
693
|
Так же в сообщении можно использовать плейсхолдеры:
|
|
498
694
|
|
|
@@ -502,6 +698,7 @@ npx @redocly/cli preview -d docs/hhapi
|
|
|
502
698
|
- **`%(last_name)s`**: Фамилия пользователя.
|
|
503
699
|
- **`%(email)s`**: Email пользователя.
|
|
504
700
|
- **`%(phone)s`**: Телефон пользователя.
|
|
701
|
+
- **`%(resume_title)s`**: Название резюме.
|
|
505
702
|
|
|
506
703
|
Эти плейсхолдеры могут быть использованы в сообщениях для отклика на вакансии, чтобы динамически подставлять соответствующие данные в текст сообщения. Например:
|
|
507
704
|
|
|
@@ -521,36 +718,60 @@ npx @redocly/cli preview -d docs/hhapi
|
|
|
521
718
|
Привет, как ты?
|
|
522
719
|
```
|
|
523
720
|
|
|
524
|
-
|
|
721
|
+
---
|
|
525
722
|
|
|
526
|
-
|
|
723
|
+
## Данные приложения
|
|
527
724
|
|
|
528
|
-
|
|
725
|
+
Данные приложения хранятся по следующим путям:
|
|
529
726
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
727
|
+
| OS | Путь |
|
|
728
|
+
| ----------- | -------------------------------------------------------- |
|
|
729
|
+
| **Windows** | `C:\Users\%username%\AppData\Roaming\hh-applicant-tool\` |
|
|
730
|
+
| **macOS** | `~/Library/Application Support/hh-applicant-tool/` |
|
|
731
|
+
| **Linux** | `~/.config/hh-applicant-tool/` |
|
|
533
732
|
|
|
534
|
-
|
|
733
|
+
### Конфигурационный файл
|
|
535
734
|
|
|
536
|
-
|
|
735
|
+
Главный конфиг называется `config.json`. Он содержит токены. Полный путь до конфигурационного файла можно вывести с помощью команды:
|
|
537
736
|
|
|
538
|
-
```
|
|
539
|
-
hh-applicant-tool config -
|
|
737
|
+
```bash
|
|
738
|
+
hh-applicant-tool config -p
|
|
540
739
|
```
|
|
541
740
|
|
|
542
|
-
|
|
741
|
+
Через конфиг можно задать дополнительные настройки:
|
|
543
742
|
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
743
|
+
| Имя атрибута | Описание |
|
|
744
|
+
| --------------- | ------------------------------------------------------------------------------------------ |
|
|
745
|
+
| `proxy_url` | Прокси, используемый для всех запросов, например, `socks5h://localhost:1080` |
|
|
746
|
+
| `api_delay` | Минимальная между отправкой запросов к API HH |
|
|
747
|
+
| `reply_message` | Сообщение для ответа работодателю при отклике на вакансии, см. формат сообщений |
|
|
748
|
+
| `user_agent` | Кастомный юзерагент, передаваемый при каждом запросе. По умолчанию используется от Android |
|
|
749
|
+
| `client_id` | Идентификатор клиента, используемый для авторизации. По умолчанию используется от Android |
|
|
750
|
+
| `client_secret` | Секретный ключ клиента, используемый для авторизации. По умолчанию используется от Android |
|
|
751
|
+
|
|
752
|
+
Если вы залогинитесь под другим аккаунтом, то данные не исчезнут.
|
|
753
|
+
|
|
754
|
+
При использовании профиля, отличного от дефолтного, данные хранятся в подкаталоге.
|
|
755
|
+
|
|
756
|
+
### Логи
|
|
757
|
+
|
|
758
|
+
В `log.txt` всегда можно посмотреть подробную информацию об ошибках. В целях безопасности токены, идентефикаторы резюме и тп затираются.
|
|
759
|
+
|
|
760
|
+
### База данных
|
|
761
|
+
|
|
762
|
+
Данные о работодателях и их вакансиях хранятся в файле `data`. Это обычная база `sqlite3`, вы ее можете просматривать через `DB Browser` и т. п.
|
|
763
|
+
|
|
764
|
+
Что хранится в базе:
|
|
765
|
+
|
|
766
|
+
- все просмотренные вакансии;
|
|
767
|
+
- профили работодателей;
|
|
768
|
+
- контакты работодателей;
|
|
769
|
+
- данные об откликах;
|
|
770
|
+
- иные данные, важные для работы.
|
|
552
771
|
|
|
553
|
-
|
|
772
|
+
---
|
|
773
|
+
|
|
774
|
+
## Использование в скриптах
|
|
554
775
|
|
|
555
776
|
Если хотите использовать `hh-applicant-tool` в своих скриптах, то можно это сделать так:
|
|
556
777
|
|
|
@@ -584,45 +805,46 @@ tool.save_token()
|
|
|
584
805
|
📩 Введите полученный код:
|
|
585
806
|
```
|
|
586
807
|
|
|
587
|
-
|
|
808
|
+
---
|
|
809
|
+
|
|
810
|
+
## Дополнительные настройки
|
|
588
811
|
|
|
589
|
-
|
|
812
|
+
<details>
|
|
813
|
+
<summary>Если вы обычный пользователь, то ничего лучше не трогайте.</summary>
|
|
590
814
|
|
|
591
815
|
Отключение проверки версии с выводом предупреждения:
|
|
592
816
|
|
|
593
817
|
```sh
|
|
594
|
-
|
|
818
|
+
hh-applicant-tool settings disable_version_check true
|
|
595
819
|
```
|
|
596
820
|
|
|
597
821
|
Утилита ищет в логах информацию о Python-ошибках. Они отправляются на сервер разработчика с целью их оперативного исправления, однако, вы можете отключить отправку отчетов:
|
|
598
822
|
|
|
599
823
|
```sh
|
|
600
|
-
|
|
824
|
+
hh-applicant-tool settings send_error_reports false
|
|
601
825
|
```
|
|
602
|
-
</details>
|
|
603
|
-
|
|
604
|
-
### Лицензия / License
|
|
605
826
|
|
|
606
|
-
|
|
827
|
+
</details>
|
|
607
828
|
|
|
608
|
-
|
|
829
|
+
---
|
|
609
830
|
|
|
610
|
-
-
|
|
611
|
-
* Разрешается бесплатное использование, копирование и модификация кода исключительно в **личных**, **образовательных** и **ознакомительных** целях.
|
|
612
|
-
* Разрешено использование в свободном некоммерческом ПО с открытым исходным кодом СТРОГО С УКАЗАНИЕМ ССЫЛОК НА ДАННЫЙ РЕПОЗИТОРИЙ И АВТОРА.
|
|
831
|
+
## Лицензионное соглашение (Limited Non-Commercial License)
|
|
613
832
|
|
|
614
|
-
|
|
615
|
-
Категорически запрещается использование данного кода (а также его частей или производных) в любых коммерческих целях без предварительного псогласия автора. Это включает, но не ограничивается:
|
|
616
|
-
* Интеграцию кода в платные сервисы, приложения или веб-сайты.
|
|
617
|
-
* Использование кода для оказания платных услуг (SaaS, консалтинг, техподдержка).
|
|
618
|
-
* Перепродажу или сублицензирование кода.
|
|
833
|
+
Данное программное обеспечение распространяется на условиях **ограниченной некоммерческой лицензии**.
|
|
619
834
|
|
|
620
|
-
-
|
|
621
|
-
|
|
835
|
+
- **Разрешённое использование**
|
|
836
|
+
- **Личное использование и изучение:** Разрешается копирование и модификация кода исключительно для личного ознакомления, обучения и отладки **без права публикации или распространения изменений**.
|
|
837
|
+
- **Интеграция в программное обеспечение:** Разрешается включение данного кода в состав сторонних бесплатных некоммерческих продуктов **только при полном сохранении исходного кода в неизменном виде**.
|
|
838
|
+
- **Атрибуция:** Любое распространение, демонстрация или использование кода (в том числе в составе других продуктов) допускается **только при обязательном указании автора и ссылки на оригинальный репозиторий**.
|
|
622
839
|
|
|
623
|
-
|
|
840
|
+
- **Ограничения на использование**
|
|
841
|
+
**Строго запрещается** использование данного кода в любых коммерческих целях без предварительного письменного согласия автора, включая, но не ограничиваясь:
|
|
842
|
+
- Интеграцией в платные сервисы, приложения, веб-сайты либо использованием в рамках оказания платных услуг.
|
|
843
|
+
- Публикацией, распространением или передачей третьим лицам **модифицированных (изменённых) версий** кода.
|
|
844
|
+
- Перепродажей, сублицензированием либо использованием кода в интересах коммерческих организаций.
|
|
624
845
|
|
|
625
|
-
|
|
846
|
+
- **Отказ от ответственности**
|
|
847
|
+
Программное обеспечение предоставляется по принципу «как есть» (**AS IS**). Автор не несёт ответственности за любые прямые или косвенные убытки, включая, но не ограничиваясь, блокировкой аккаунтов, потерей данных или иными негативными последствиями, возникшими в результате использования данного программного обеспечения.
|
|
626
848
|
|
|
627
|
-
|
|
849
|
+
**© 2023-2026 Sergey M. Все права защищены.**
|
|
628
850
|
|