hh-applicant-tool 0.3.5__tar.gz → 0.3.7__tar.gz

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.

Potentially problematic release.


This version of hh-applicant-tool might be problematic. Click here for more details.

Files changed (23) hide show
  1. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/PKG-INFO +117 -95
  2. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/README.md +116 -94
  3. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/api/client.py +28 -4
  4. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/constants.py +1 -1
  5. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/main.py +32 -8
  6. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/apply_similar.py +158 -45
  7. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/call_api.py +3 -7
  8. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/clear_negotiations.py +2 -6
  9. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/list_resumes.py +2 -6
  10. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/update_resumes.py +2 -6
  11. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/whoami.py +2 -6
  12. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/telemetry_client.py +0 -2
  13. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/utils.py +15 -0
  14. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/pyproject.toml +1 -1
  15. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/__init__.py +0 -0
  16. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/__main__.py +0 -0
  17. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/api/__init__.py +0 -0
  18. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/api/errors.py +0 -0
  19. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/color_log.py +0 -0
  20. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/__init__.py +0 -0
  21. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/authorize.py +0 -0
  22. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/operations/refresh_token.py +0 -0
  23. {hh_applicant_tool-0.3.5 → hh_applicant_tool-0.3.7}/hh_applicant_tool/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hh-applicant-tool
3
- Version: 0.3.5
3
+ Version: 0.3.7
4
4
  Summary:
5
5
  Author: Senior YAML Developer
6
6
  Author-email: yamldeveloper@proton.me
@@ -19,8 +19,6 @@ Description-Content-Type: text/markdown
19
19
 
20
20
  ## HH Applicant Tool
21
21
 
22
- > ! Наложен мораторий на доработки/переработки. Разработка будет возобновлена после 100 звезд 💫
23
-
24
22
  ![Publish to PyPI](https://github.com/s3rgeym/hh-applicant-tool/actions/workflows/publish.yml/badge.svg)
25
23
  [![PyPi Version](https://img.shields.io/pypi/v/hh-applicant-tool)]()
26
24
  [![Python Versions](https://img.shields.io/pypi/pyversions/hh-applicant-tool.svg)]()
@@ -32,19 +30,21 @@ Description-Content-Type: text/markdown
32
30
  <img src="https://github.com/user-attachments/assets/29d91490-2c83-4e3f-a573-c7a6182a4044" width="500">
33
31
  </div>
34
32
 
33
+ ### Описание
34
+
35
35
  Утилита для успешных волчат, служащая для автоматизации действий на HH.RU таких как рассылка откликов на подходящие вакансии и обновление всех резюме. Поддержка осуществляется строго в группе https://t.me/+aSjr8qM_AP85ZDBi (в ней разрешены мат, п*рнография, оскорбления всех участников кроме админа, а так же слив любой информации про хуевых работодателей и нерадивых херок).
36
36
 
37
37
  Работает с Python >= 3.10. Нужную версию Python можно поставить через
38
38
  asdf/pyenv/conda и что-то еще...
39
39
 
40
- Данная утилита написана для Linux, но будет работать и на Ga..Mac OS, и в Windows, но с WSL не будет, так как для авторизации требуются оконный сервер X11 либо Wayland — только прямая установка пакета через pip в Windows. После авторизации вы можете перенести `~/.config/hh-applicant-tool/config.json` (`C:\Users\%username%\AppData\Roaming\hh-applicant-tool\config.json` — в Windows) на сервер и запускать утилиту через systemd или cron. Столь странный процесс связан с тем, что на странице авторизации запускается море скриптов, которые шифруют данные на клиенте перед отправкой на сервер, а так же выполняется куча запросов чтобы проверить не бот ли ты. Хорошо, что после авторизации никаких проверок по факту нет, даже айпи не проверяется на соответсвие тому с какого была авторизация. В этой лапше мне лень разбираться. Так же при наличии рутованного телефона можно вытащить `access` и `refresh` токены из официального приложения и добавить их в конфиг.
40
+ Данная утилита написана для Linux, но будет работать и на Ga..Mac OS, и в Windows, но с WSL не будет, так как для авторизации требуются оконный сервер X11 либо Wayland — только прямая установка пакета через pip в Windows. После авторизации вы можете перенести конфиг на сервер и запускать утилиту через systemd или cron. Столь странный процесс связан с тем, что на странице авторизации запускается море скриптов, которые шифруют данные на клиенте перед отправкой на сервер, а так же выполняется куча запросов чтобы проверить не бот ли ты. Хорошо, что после авторизации никаких проверок по факту нет, даже айпи не проверяется на соответсвие тому с какого была авторизация. В этой лапше мне лень разбираться. Так же при наличии рутованного телефона можно вытащить `access` и `refresh` токены из официального приложения и добавить их в конфиг.
41
41
 
42
42
  Пример работы:
43
43
 
44
44
  ![image](https://github.com/user-attachments/assets/55ab24ba-5325-40b4-9bd9-69ebcbc011c4)
45
45
 
46
46
 
47
- Предыстория.
47
+ ### Предыстория
48
48
 
49
49
  Был один знакомый знакомого, который работал хрюшей. Этот чувак не заморачивался с чтением резюме, а тупо скриптами рассылал предложения о работе... Бывают, конечно, филологини, которые не могут отличить Java от JavaScript, но я думаю, что <s>в значительном числе случаев, тут имеют место такие вот рассылки</s> они просто идиотки... И я тупо стал спамить как они. Мне уже было просто лень читать весь этот бред, что пишут долбоебы в описании вакансий. Там стандартное ООП, алгоритмы и прочая хуета... Вроде все подходят, а вроде хз — все не мое.
50
50
 
@@ -56,7 +56,7 @@ $$('[data-qa="vacancy-serp__vacancy_response"]').forEach((el) => el.click());
56
56
 
57
57
  Оно работает, хоть и не идеально. Я даже пробовал автоматизировать рассылки через `p[yu]ppeeter`, пока не прочитал [документацию](https://github.com/hhru/api). И не обнаружил, что **API** (интерфейс) содержит все необходимые мне методы. Headhunter позволяет создать свое приложение, но там ручная модерация, и наврядли кто-то разрешит мне создать приложение для спама заявками. Я [декомпилировал](https://gist.github.com/s3rgeym/eee96bbf91b04f7eb46b7449f8884a00) официальное приложение для **Android** и получил **CLIENT_ID** и **CLIENT_SECRET**, необходимые для работы через **API**.
58
58
 
59
- Установка:
59
+ ### Установка
60
60
 
61
61
  ```bash
62
62
  # Версия с поддержкой авторизации через запуск окна с браузером (эта версия очень много весит)
@@ -72,18 +72,18 @@ $ pipx upgrade hh-applicant-tool
72
72
 
73
73
  Отдельно я распишу процесс установки в **Windows** в подробностях:
74
74
 
75
- * Для начала поставьте Python 3 любым удобным способом.
76
- * Запустите терминал/консоль от Администратора и выполните:
75
+ * Для начала поставьте последнюю версию **Python 3** любым удобным способом.
76
+ * Запустите **Terminal** или **PowerShell** от Администратора и выполните:
77
77
  ```ps
78
78
  Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
79
79
  ```
80
- Без этой настройки не будут работать виртуальные окружения.
80
+ Данная политика разрешает текущему пользователю (от которого зашли) запускать скрипты. Без нее не будут работать виртуальные окружения.
81
81
  * Создайте и активируйте виртуальное окружение:
82
82
  ```ps
83
83
  PS> python -m pip venv hh-applicant-venv
84
84
  PS> .\hh-applicant-venv\Scripts\activate
85
85
  ```
86
- * Поставьте все пакеты в виртуальное окружение `hh-applicant-tool`:
86
+ * Поставьте все пакеты в виртуальное окружение `hh-applicant-venv`:
87
87
  ```ps
88
88
  (hh-applicant-venv) PS> pip install hh-applicant-tool[qt]
89
89
  ```
@@ -91,11 +91,92 @@ $ pipx upgrade hh-applicant-tool
91
91
  ```ps
92
92
  (hh-applicant-venv) PS> hh-applicant-tool -h
93
93
  ```
94
- * В случае неудачи, вернитесь к первому шагу. Для последующих запусков сперва активируйте виртуальное окружение.
95
-
94
+ * В случае неудачи вернитесь к первому шагу.
95
+ * Для последующих запусков сначала активируйте виртуальное окружение.
96
+
97
+ ### Авторизация
98
+
99
+ ```bash
100
+ $ hh-applicant-tool -vv authorize
101
+ ```
102
+
103
+ ![image](https://github.com/user-attachments/assets/88961e31-4ea3-478f-8c43-914d6785bc3b)
104
+
105
+ > В Windows не забудьте разрешить доступ к сети (Allow access) в всплывающем окне.
106
+
107
+ Проверка авторизации:
108
+
109
+ ```bash
110
+ $ hh-applicant-tool whoami
111
+ {
112
+ "auth_type": "applicant",
113
+ "counters": {
114
+ "new_resume_views": 1488,
115
+ "resumes_count": 1,
116
+ "unread_negotiations": 228
117
+ },
118
+ "email": "vasya.pupkin@gmail.com",
119
+ "employer": null,
120
+ "first_name": "Вася",
121
+ "id": "1234567890",
122
+ "is_admin": false,
123
+ "is_anonymous": false,
124
+ "is_applicant": true,
125
+ "is_application": false,
126
+ "is_employer": false,
127
+ "is_in_search": true,
128
+ "last_name": "Пупкин",
129
+ "manager": null,
130
+ "mid_name": null,
131
+ "middle_name": null,
132
+ "negotiations_url": "https://api.hh.ru/negotiations",
133
+ "personal_manager": null,
134
+ "phone": "79012345678",
135
+ "profile_videos": {
136
+ "items": []
137
+ },
138
+ "resumes_url": "https://api.hh.ru/resumes/mine"
139
+ }
140
+ ```
141
+
142
+ В случае успешной авторизации токены будут сохранены в `config.json`:
143
+
144
+ ```json
145
+ {
146
+ "token": {
147
+ "access_token": "...",
148
+ "created_at": 1678151427,
149
+ "expires_in": 1209599,
150
+ "refresh_token": "...",
151
+ "token_type": "bearer"
152
+ }
153
+ }
154
+ ```
155
+
156
+ Токен доступа выдается на две недели. После его нужно обновить:
157
+
158
+ ```bash
159
+ $ hh-applicant-tool refresh-token
160
+ ```
161
+
162
+ ### Пути до файла config.json
163
+
164
+ | OS | Путь |
165
+ |----------------------------|---------------------------------------------------------------------|
166
+ | **Windows** | `C:\Users\%username%\AppData\Roaming\hh-applicant-tool\config.json` |
167
+ | **macOS** | `~/Library/Application Support/hh-applicant-tool/config.json` |
168
+ | **Linux** | `~/.config/hh-applicant-tool/config.json` |
169
+
170
+
171
+ Через этот файл, например, можно задать кастомный `user_agent`:
96
172
 
173
+ ```json
174
+ {
175
+ "user_agent": "Mozilla/5.0 YablanBrowser"
176
+ }
177
+ ```
97
178
 
98
- Использование:
179
+ ### Описание команд
99
180
 
100
181
  ```bash
101
182
  $ hh-applicant-tool [ GLOBAL_FLAGS ] [ OPERATION [ OPERATION_FLAGS ] ]
@@ -158,111 +239,52 @@ https://hh.ru/employer/1918903
158
239
  | **whoami** | Выводит информацию об авторизованном пользователе |
159
240
  | **list-resumes** | Список резюме |
160
241
  | **update-resumes** | Обновить все резюме. Аналогично нажатию кнопки «Обновить дату». |
161
- | **apply-similar** | Откликнуться на все подходящие вакансии. Лимит = 200 в день |
242
+ | **apply-similar** | Откликнуться на все подходящие вакансии. Лимит = 200 в день. На HH есть спам-фильтры, так что лучше не рассылайте отклики со ссылками. |
162
243
  | **clear-negotiations** | Удаляет отказы и отменяет заявки, которые долго висят |
163
244
  | **call-api** | Вызов произвольного метода API с выводом результата. |
164
245
  | **refresh-token** | Обновляет access_token. |
246
+ | **get-employer-contacts** | Получить список контактов работодателя, даже если тот не высылал приглашения. Контакты получаются строго из публичного доступа, например, с сайта фирмы и могут быть удалены только по просьбе уполнамоченного лица. Данная функция готова и будет доступна после 100 ⭐ |
165
247
 
166
- Авторизуемся:
248
+ ### Формат текста сообщений
167
249
 
168
- ```bash
169
- $ hh-applicant-tool -vv authorize
170
- ```
250
+ Команда `apply-similar` поддерживает специальный формат сообщений.
171
251
 
172
- ![image](https://github.com/user-attachments/assets/88961e31-4ea3-478f-8c43-914d6785bc3b)
252
+ Так же в сообщении можно использовать плейсхолдеры:
173
253
 
174
- > В Windows не забудьте разрешить доступ к сети (Allow access) в всплывающем окне.
254
+ - **`%(vacancy_name)s`**: Название вакансии.
255
+ - **`%(employer_name)s`**: Название работодателя.
256
+ - **`%(first_name)s`**: Имя пользователя.
257
+ - **`%(last_name)s`**: Фамилия пользователя.
258
+ - **`%(email)s`**: Email пользователя.
259
+ - **`%(phone)s`**: Телефон пользователя.
175
260
 
261
+ Эти плейсхолдеры могут быть использованы в сообщениях для отклика на вакансии, чтобы динамически подставлять соответствующие данные в текст сообщения. Например:
176
262
 
177
-
178
- В случае успешной авторизации токены будут сохранены в `~/.config/hh-applicant-tool/config.json`:
179
-
180
- ```json
181
- {
182
- "token": {
183
- "access_token": "...",
184
- "created_at": 1678151427,
185
- "expires_in": 1209599,
186
- "refresh_token": "...",
187
- "token_type": "bearer"
188
- }
189
- }
190
263
  ```
191
-
192
- Через этот файл можно задать кастомный `user_agent`:
193
-
194
- ```json
195
- {
196
- "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/110.0"
197
- }
264
+ "Меня заинтересовала ваша вакансия %(vacancy_name)s. Прошу рассмотреть мою кандидатуру. С уважением, %(first_name)s %(last_name)s."
198
265
  ```
199
266
 
200
- Проверка авторизации:
267
+ Так же можно делать текст уникальным с помощью `{}`. Внутри них через `|` перечисляются варианты, один из которых будет случайно выбран:
201
268
 
202
- ```bash
203
- $ hh-applicant-tool whoami
204
- {
205
- "auth_type": "applicant",
206
- "counters": {
207
- "new_resume_views": 1488,
208
- "resumes_count": 1,
209
- "unread_negotiations": 228
210
- },
211
- "email": "vasya.pupkin@gmail.com",
212
- "employer": null,
213
- "first_name": "Вася",
214
- "id": "1234567890",
215
- "is_admin": false,
216
- "is_anonymous": false,
217
- "is_applicant": true,
218
- "is_application": false,
219
- "is_employer": false,
220
- "is_in_search": true,
221
- "last_name": "Пупкин",
222
- "manager": null,
223
- "mid_name": null,
224
- "middle_name": null,
225
- "negotiations_url": "https://api.hh.ru/negotiations",
226
- "personal_manager": null,
227
- "phone": "79012345678",
228
- "profile_videos": {
229
- "items": []
230
- },
231
- "resumes_url": "https://api.hh.ru/resumes/mine"
232
- }
233
269
  ```
234
-
235
- Токен выдается на две недели:
236
-
237
- ```python
238
- Python 3.10.9 (main, Dec 19 2022, 17:35:49) [GCC 12.2.0] on linux
239
- Type "help", "copyright", "credits" or "license" for more information.
240
- >>> from datetime import datetime, timedelta
241
- >>> datetime.now() + timedelta(seconds=1209599)
242
- datetime.datetime(2023, 3, 23, 6, 36, 15, 596290)
243
- >>>
270
+ {Здоров|Привет}, {как {ты|сам}|что делаешь}?
244
271
  ```
245
272
 
246
- После нужно вызвать `refresh-token`:
273
+ В итоге получится что-то типа:
247
274
 
248
- ```bash
249
- $ hh-applicant-tool refresh-token
250
275
  ```
251
-
252
- Удаление хвостов:
253
-
254
- ```bash
255
- rm -rf ~/.config/hh-applicant-tool
256
-
257
- # В старых версиях добавлялся обработчик протокола через socat
258
- rm -f ~/.local/share/applications/hhandroid.desktop
276
+ Привет, как ты?
259
277
  ```
260
278
 
279
+ ### Написание плагинов
280
+
261
281
  Утилита использует систему плагинов. Все они лежат в [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).
262
282
 
263
283
  Отдельные замечания у меня к API HH. Оно пиздец какое кривое. Например, при создании заявки возвращается пустой ответ либо редирект, хотя по логике должен возвраться созданный объект. Так же в ответах сервера нет `Content-Length`. Из-за этого нельзя узнать есть тело у ответа сервера нужно его пробовать прочитать. Я так понял там какой-то прокси оборачивает все запросы и отдает всегда `Transfer-Encoding: Chunked`. А еще он возвращает 502 ошибку, когда бекенд на Java падает либо долго отвечает (таймаут)? А вот [язык запросов](https://hh.ru/article/1175) мне понравился. Можно что-то типа этого использовать `NOT (!ID:123 OR !ID:456 OR !ID:789)` что бы отсеить какие-то вакансии.
264
284
 
265
- Утилита собирает и передает на сервер разработчика следующую ифнормацию:
285
+ ### Сбор данных
286
+
287
+ Утилита собирает и передает на сервер разработчика следующую информацию:
266
288
 
267
289
  1. Название вакансии.
268
290
  1. Тип вакансии (открытая/закрытая).
@@ -271,7 +293,7 @@ rm -f ~/.local/share/applications/hhandroid.desktop
271
293
  1. Прямая ссылка на вакансию.
272
294
  1. Дата создания вакансии.
273
295
  1. Дата публикации вакансии.
274
- 1. Контактная информация хрюши (ее телефон, email и тп).
296
+ 1. Контактная информация работодателя, которую он или его сотрудники сами выложили в общественный доступ, которая в дальнейшем _может_ храниться в строго обезличенной форме с соблюдением законов РФ, GDPR и американского экспортного контроля. Данная информация может быть удалена при письменном запросе в утвержденной Законом форме с оригинальными печатями фирмы и подписью генерального директора и/или по требованию РКН, прокуратуры или лично Адама Кадырова.
275
297
  1. Название компании.
276
298
  1. Тип компании.
277
299
  1. Описание компании.
@@ -1,7 +1,5 @@
1
1
  ## HH Applicant Tool
2
2
 
3
- > ! Наложен мораторий на доработки/переработки. Разработка будет возобновлена после 100 звезд 💫
4
-
5
3
  ![Publish to PyPI](https://github.com/s3rgeym/hh-applicant-tool/actions/workflows/publish.yml/badge.svg)
6
4
  [![PyPi Version](https://img.shields.io/pypi/v/hh-applicant-tool)]()
7
5
  [![Python Versions](https://img.shields.io/pypi/pyversions/hh-applicant-tool.svg)]()
@@ -13,19 +11,21 @@
13
11
  <img src="https://github.com/user-attachments/assets/29d91490-2c83-4e3f-a573-c7a6182a4044" width="500">
14
12
  </div>
15
13
 
14
+ ### Описание
15
+
16
16
  Утилита для успешных волчат, служащая для автоматизации действий на HH.RU таких как рассылка откликов на подходящие вакансии и обновление всех резюме. Поддержка осуществляется строго в группе https://t.me/+aSjr8qM_AP85ZDBi (в ней разрешены мат, п*рнография, оскорбления всех участников кроме админа, а так же слив любой информации про хуевых работодателей и нерадивых херок).
17
17
 
18
18
  Работает с Python >= 3.10. Нужную версию Python можно поставить через
19
19
  asdf/pyenv/conda и что-то еще...
20
20
 
21
- Данная утилита написана для Linux, но будет работать и на Ga..Mac OS, и в Windows, но с WSL не будет, так как для авторизации требуются оконный сервер X11 либо Wayland — только прямая установка пакета через pip в Windows. После авторизации вы можете перенести `~/.config/hh-applicant-tool/config.json` (`C:\Users\%username%\AppData\Roaming\hh-applicant-tool\config.json` — в Windows) на сервер и запускать утилиту через systemd или cron. Столь странный процесс связан с тем, что на странице авторизации запускается море скриптов, которые шифруют данные на клиенте перед отправкой на сервер, а так же выполняется куча запросов чтобы проверить не бот ли ты. Хорошо, что после авторизации никаких проверок по факту нет, даже айпи не проверяется на соответсвие тому с какого была авторизация. В этой лапше мне лень разбираться. Так же при наличии рутованного телефона можно вытащить `access` и `refresh` токены из официального приложения и добавить их в конфиг.
21
+ Данная утилита написана для Linux, но будет работать и на Ga..Mac OS, и в Windows, но с WSL не будет, так как для авторизации требуются оконный сервер X11 либо Wayland — только прямая установка пакета через pip в Windows. После авторизации вы можете перенести конфиг на сервер и запускать утилиту через systemd или cron. Столь странный процесс связан с тем, что на странице авторизации запускается море скриптов, которые шифруют данные на клиенте перед отправкой на сервер, а так же выполняется куча запросов чтобы проверить не бот ли ты. Хорошо, что после авторизации никаких проверок по факту нет, даже айпи не проверяется на соответсвие тому с какого была авторизация. В этой лапше мне лень разбираться. Так же при наличии рутованного телефона можно вытащить `access` и `refresh` токены из официального приложения и добавить их в конфиг.
22
22
 
23
23
  Пример работы:
24
24
 
25
25
  ![image](https://github.com/user-attachments/assets/55ab24ba-5325-40b4-9bd9-69ebcbc011c4)
26
26
 
27
27
 
28
- Предыстория.
28
+ ### Предыстория
29
29
 
30
30
  Был один знакомый знакомого, который работал хрюшей. Этот чувак не заморачивался с чтением резюме, а тупо скриптами рассылал предложения о работе... Бывают, конечно, филологини, которые не могут отличить Java от JavaScript, но я думаю, что <s>в значительном числе случаев, тут имеют место такие вот рассылки</s> они просто идиотки... И я тупо стал спамить как они. Мне уже было просто лень читать весь этот бред, что пишут долбоебы в описании вакансий. Там стандартное ООП, алгоритмы и прочая хуета... Вроде все подходят, а вроде хз — все не мое.
31
31
 
@@ -37,7 +37,7 @@ $$('[data-qa="vacancy-serp__vacancy_response"]').forEach((el) => el.click());
37
37
 
38
38
  Оно работает, хоть и не идеально. Я даже пробовал автоматизировать рассылки через `p[yu]ppeeter`, пока не прочитал [документацию](https://github.com/hhru/api). И не обнаружил, что **API** (интерфейс) содержит все необходимые мне методы. Headhunter позволяет создать свое приложение, но там ручная модерация, и наврядли кто-то разрешит мне создать приложение для спама заявками. Я [декомпилировал](https://gist.github.com/s3rgeym/eee96bbf91b04f7eb46b7449f8884a00) официальное приложение для **Android** и получил **CLIENT_ID** и **CLIENT_SECRET**, необходимые для работы через **API**.
39
39
 
40
- Установка:
40
+ ### Установка
41
41
 
42
42
  ```bash
43
43
  # Версия с поддержкой авторизации через запуск окна с браузером (эта версия очень много весит)
@@ -53,18 +53,18 @@ $ pipx upgrade hh-applicant-tool
53
53
 
54
54
  Отдельно я распишу процесс установки в **Windows** в подробностях:
55
55
 
56
- * Для начала поставьте Python 3 любым удобным способом.
57
- * Запустите терминал/консоль от Администратора и выполните:
56
+ * Для начала поставьте последнюю версию **Python 3** любым удобным способом.
57
+ * Запустите **Terminal** или **PowerShell** от Администратора и выполните:
58
58
  ```ps
59
59
  Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
60
60
  ```
61
- Без этой настройки не будут работать виртуальные окружения.
61
+ Данная политика разрешает текущему пользователю (от которого зашли) запускать скрипты. Без нее не будут работать виртуальные окружения.
62
62
  * Создайте и активируйте виртуальное окружение:
63
63
  ```ps
64
64
  PS> python -m pip venv hh-applicant-venv
65
65
  PS> .\hh-applicant-venv\Scripts\activate
66
66
  ```
67
- * Поставьте все пакеты в виртуальное окружение `hh-applicant-tool`:
67
+ * Поставьте все пакеты в виртуальное окружение `hh-applicant-venv`:
68
68
  ```ps
69
69
  (hh-applicant-venv) PS> pip install hh-applicant-tool[qt]
70
70
  ```
@@ -72,11 +72,92 @@ $ pipx upgrade hh-applicant-tool
72
72
  ```ps
73
73
  (hh-applicant-venv) PS> hh-applicant-tool -h
74
74
  ```
75
- * В случае неудачи, вернитесь к первому шагу. Для последующих запусков сперва активируйте виртуальное окружение.
76
-
75
+ * В случае неудачи вернитесь к первому шагу.
76
+ * Для последующих запусков сначала активируйте виртуальное окружение.
77
+
78
+ ### Авторизация
79
+
80
+ ```bash
81
+ $ hh-applicant-tool -vv authorize
82
+ ```
83
+
84
+ ![image](https://github.com/user-attachments/assets/88961e31-4ea3-478f-8c43-914d6785bc3b)
85
+
86
+ > В Windows не забудьте разрешить доступ к сети (Allow access) в всплывающем окне.
87
+
88
+ Проверка авторизации:
89
+
90
+ ```bash
91
+ $ hh-applicant-tool whoami
92
+ {
93
+ "auth_type": "applicant",
94
+ "counters": {
95
+ "new_resume_views": 1488,
96
+ "resumes_count": 1,
97
+ "unread_negotiations": 228
98
+ },
99
+ "email": "vasya.pupkin@gmail.com",
100
+ "employer": null,
101
+ "first_name": "Вася",
102
+ "id": "1234567890",
103
+ "is_admin": false,
104
+ "is_anonymous": false,
105
+ "is_applicant": true,
106
+ "is_application": false,
107
+ "is_employer": false,
108
+ "is_in_search": true,
109
+ "last_name": "Пупкин",
110
+ "manager": null,
111
+ "mid_name": null,
112
+ "middle_name": null,
113
+ "negotiations_url": "https://api.hh.ru/negotiations",
114
+ "personal_manager": null,
115
+ "phone": "79012345678",
116
+ "profile_videos": {
117
+ "items": []
118
+ },
119
+ "resumes_url": "https://api.hh.ru/resumes/mine"
120
+ }
121
+ ```
122
+
123
+ В случае успешной авторизации токены будут сохранены в `config.json`:
124
+
125
+ ```json
126
+ {
127
+ "token": {
128
+ "access_token": "...",
129
+ "created_at": 1678151427,
130
+ "expires_in": 1209599,
131
+ "refresh_token": "...",
132
+ "token_type": "bearer"
133
+ }
134
+ }
135
+ ```
136
+
137
+ Токен доступа выдается на две недели. После его нужно обновить:
138
+
139
+ ```bash
140
+ $ hh-applicant-tool refresh-token
141
+ ```
142
+
143
+ ### Пути до файла config.json
144
+
145
+ | OS | Путь |
146
+ |----------------------------|---------------------------------------------------------------------|
147
+ | **Windows** | `C:\Users\%username%\AppData\Roaming\hh-applicant-tool\config.json` |
148
+ | **macOS** | `~/Library/Application Support/hh-applicant-tool/config.json` |
149
+ | **Linux** | `~/.config/hh-applicant-tool/config.json` |
150
+
151
+
152
+ Через этот файл, например, можно задать кастомный `user_agent`:
77
153
 
154
+ ```json
155
+ {
156
+ "user_agent": "Mozilla/5.0 YablanBrowser"
157
+ }
158
+ ```
78
159
 
79
- Использование:
160
+ ### Описание команд
80
161
 
81
162
  ```bash
82
163
  $ hh-applicant-tool [ GLOBAL_FLAGS ] [ OPERATION [ OPERATION_FLAGS ] ]
@@ -139,111 +220,52 @@ https://hh.ru/employer/1918903
139
220
  | **whoami** | Выводит информацию об авторизованном пользователе |
140
221
  | **list-resumes** | Список резюме |
141
222
  | **update-resumes** | Обновить все резюме. Аналогично нажатию кнопки «Обновить дату». |
142
- | **apply-similar** | Откликнуться на все подходящие вакансии. Лимит = 200 в день |
223
+ | **apply-similar** | Откликнуться на все подходящие вакансии. Лимит = 200 в день. На HH есть спам-фильтры, так что лучше не рассылайте отклики со ссылками. |
143
224
  | **clear-negotiations** | Удаляет отказы и отменяет заявки, которые долго висят |
144
225
  | **call-api** | Вызов произвольного метода API с выводом результата. |
145
226
  | **refresh-token** | Обновляет access_token. |
227
+ | **get-employer-contacts** | Получить список контактов работодателя, даже если тот не высылал приглашения. Контакты получаются строго из публичного доступа, например, с сайта фирмы и могут быть удалены только по просьбе уполнамоченного лица. Данная функция готова и будет доступна после 100 ⭐ |
146
228
 
147
- Авторизуемся:
229
+ ### Формат текста сообщений
148
230
 
149
- ```bash
150
- $ hh-applicant-tool -vv authorize
151
- ```
231
+ Команда `apply-similar` поддерживает специальный формат сообщений.
152
232
 
153
- ![image](https://github.com/user-attachments/assets/88961e31-4ea3-478f-8c43-914d6785bc3b)
233
+ Так же в сообщении можно использовать плейсхолдеры:
154
234
 
155
- > В Windows не забудьте разрешить доступ к сети (Allow access) в всплывающем окне.
235
+ - **`%(vacancy_name)s`**: Название вакансии.
236
+ - **`%(employer_name)s`**: Название работодателя.
237
+ - **`%(first_name)s`**: Имя пользователя.
238
+ - **`%(last_name)s`**: Фамилия пользователя.
239
+ - **`%(email)s`**: Email пользователя.
240
+ - **`%(phone)s`**: Телефон пользователя.
156
241
 
242
+ Эти плейсхолдеры могут быть использованы в сообщениях для отклика на вакансии, чтобы динамически подставлять соответствующие данные в текст сообщения. Например:
157
243
 
158
-
159
- В случае успешной авторизации токены будут сохранены в `~/.config/hh-applicant-tool/config.json`:
160
-
161
- ```json
162
- {
163
- "token": {
164
- "access_token": "...",
165
- "created_at": 1678151427,
166
- "expires_in": 1209599,
167
- "refresh_token": "...",
168
- "token_type": "bearer"
169
- }
170
- }
171
244
  ```
172
-
173
- Через этот файл можно задать кастомный `user_agent`:
174
-
175
- ```json
176
- {
177
- "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/110.0"
178
- }
245
+ "Меня заинтересовала ваша вакансия %(vacancy_name)s. Прошу рассмотреть мою кандидатуру. С уважением, %(first_name)s %(last_name)s."
179
246
  ```
180
247
 
181
- Проверка авторизации:
248
+ Так же можно делать текст уникальным с помощью `{}`. Внутри них через `|` перечисляются варианты, один из которых будет случайно выбран:
182
249
 
183
- ```bash
184
- $ hh-applicant-tool whoami
185
- {
186
- "auth_type": "applicant",
187
- "counters": {
188
- "new_resume_views": 1488,
189
- "resumes_count": 1,
190
- "unread_negotiations": 228
191
- },
192
- "email": "vasya.pupkin@gmail.com",
193
- "employer": null,
194
- "first_name": "Вася",
195
- "id": "1234567890",
196
- "is_admin": false,
197
- "is_anonymous": false,
198
- "is_applicant": true,
199
- "is_application": false,
200
- "is_employer": false,
201
- "is_in_search": true,
202
- "last_name": "Пупкин",
203
- "manager": null,
204
- "mid_name": null,
205
- "middle_name": null,
206
- "negotiations_url": "https://api.hh.ru/negotiations",
207
- "personal_manager": null,
208
- "phone": "79012345678",
209
- "profile_videos": {
210
- "items": []
211
- },
212
- "resumes_url": "https://api.hh.ru/resumes/mine"
213
- }
214
250
  ```
215
-
216
- Токен выдается на две недели:
217
-
218
- ```python
219
- Python 3.10.9 (main, Dec 19 2022, 17:35:49) [GCC 12.2.0] on linux
220
- Type "help", "copyright", "credits" or "license" for more information.
221
- >>> from datetime import datetime, timedelta
222
- >>> datetime.now() + timedelta(seconds=1209599)
223
- datetime.datetime(2023, 3, 23, 6, 36, 15, 596290)
224
- >>>
251
+ {Здоров|Привет}, {как {ты|сам}|что делаешь}?
225
252
  ```
226
253
 
227
- После нужно вызвать `refresh-token`:
254
+ В итоге получится что-то типа:
228
255
 
229
- ```bash
230
- $ hh-applicant-tool refresh-token
231
256
  ```
232
-
233
- Удаление хвостов:
234
-
235
- ```bash
236
- rm -rf ~/.config/hh-applicant-tool
237
-
238
- # В старых версиях добавлялся обработчик протокола через socat
239
- rm -f ~/.local/share/applications/hhandroid.desktop
257
+ Привет, как ты?
240
258
  ```
241
259
 
260
+ ### Написание плагинов
261
+
242
262
  Утилита использует систему плагинов. Все они лежат в [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).
243
263
 
244
264
  Отдельные замечания у меня к API HH. Оно пиздец какое кривое. Например, при создании заявки возвращается пустой ответ либо редирект, хотя по логике должен возвраться созданный объект. Так же в ответах сервера нет `Content-Length`. Из-за этого нельзя узнать есть тело у ответа сервера нужно его пробовать прочитать. Я так понял там какой-то прокси оборачивает все запросы и отдает всегда `Transfer-Encoding: Chunked`. А еще он возвращает 502 ошибку, когда бекенд на Java падает либо долго отвечает (таймаут)? А вот [язык запросов](https://hh.ru/article/1175) мне понравился. Можно что-то типа этого использовать `NOT (!ID:123 OR !ID:456 OR !ID:789)` что бы отсеить какие-то вакансии.
245
265
 
246
- Утилита собирает и передает на сервер разработчика следующую ифнормацию:
266
+ ### Сбор данных
267
+
268
+ Утилита собирает и передает на сервер разработчика следующую информацию:
247
269
 
248
270
  1. Название вакансии.
249
271
  1. Тип вакансии (открытая/закрытая).
@@ -252,7 +274,7 @@ rm -f ~/.local/share/applications/hhandroid.desktop
252
274
  1. Прямая ссылка на вакансию.
253
275
  1. Дата создания вакансии.
254
276
  1. Дата публикации вакансии.
255
- 1. Контактная информация хрюши (ее телефон, email и тп).
277
+ 1. Контактная информация работодателя, которую он или его сотрудники сами выложили в общественный доступ, которая в дальнейшем _может_ храниться в строго обезличенной форме с соблюдением законов РФ, GDPR и американского экспортного контроля. Данная информация может быть удалена при письменном запросе в утвержденной Законом форме с оригинальными печатями фирмы и подписью генерального директора и/или по требованию РКН, прокуратуры или лично Адама Кадырова.
256
278
  1. Название компании.
257
279
  1. Тип компании.
258
280
  1. Описание компании.