一键导入
hh-outreach
Массовая рассылка откликов на HH вакансии для лидгена. Триггеры: /hh-outreach, 'отклики hh', 'рассылка hh', 'откликнись на вакансии'
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Массовая рассылка откликов на HH вакансии для лидгена. Триггеры: /hh-outreach, 'отклики hh', 'рассылка hh', 'откликнись на вакансии'
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | hh-outreach |
| description | Массовая рассылка откликов на HH вакансии для лидгена. Триггеры: /hh-outreach, 'отклики hh', 'рассылка hh', 'откликнись на вакансии' |
Полная спецификация: https://github.com/TimmyZinin/hh-outreach/blob/main/SPEC.md
/hh-outreach <количество> [запрос] [--флаги]
| Аргумент | Тип | Дефолт | Описание |
|---|---|---|---|
| количество | число | обязательный | Сколько откликов отправить |
| запрос | строка | "маркетолог OR SMM OR контент" | Поисковый запрос HH |
| --query | строка | - | Альтернатива позиционному запросу |
| --period | число | 1 | Период поиска в днях |
| --min-salary | число | - | Минимальная зарплата |
| --dry-run | флаг | - | Поиск + генерация БЕЗ отправки |
| --preview | флаг | - | Показать текст перед каждой отправкой |
| --any-format | флаг | - | Не фильтровать по удалёнке |
| --no-filter | флаг | - | Отключить exclusion фильтр |
~/hh-outreach-data/sent.json
.bak или создать пустойvacancies - массив, каждый элемент имеет id и statusidcp sent.json sent.json.bakCDP=~/.claude/skills/chrome-cdp/scripts/cdp.mjs
NODE=~/.nvm/versions/node/v22.22.1/bin/node
$NODE $CDP list
https://hh.ru/search/vacancy?text={QUERY}&order_by=publication_time&search_period={PERIOD}&items_on_page=20&page={PAGE}
&schedule=remote если НЕ --any-format&salary={MIN_SALARY} если указан --min-salary$NODE $CDP nav <tab> <url> (timeout 15s)$NODE $CDP eval:
var cards = document.querySelectorAll('a[data-qa="serp-item__title"]');
// Для каждой: id, title, company
$NODE $CDP nav <tab> <vacancy_url> (timeout 15s)$NODE $CDP eval:
Сгенерировать кастомный текст по модульному шаблону:
OPENING (random из 5):
Коллеги из {КОМПАНИЯ}, привет!Привет, команда {КОМПАНИЯ}!{КОМПАНИЯ}, привет!Привет! Пишу по вашей вакансии {ДОЛЖНОСТЬ}.Коллеги, привет!VACANCY_REACTION:
Насколько я понимаю, вы ищете {ПЕРЕСКАЗ - 1-2 предложения на основе описания}
OFFER (если зарплата есть):
У меня есть предложение получше. Вместо найма в штат предлагаю поработать на подряде - оплата на моё ИП, {SALARY*0.8} вместо {SALARY}.
OFFER (если зарплаты нет):
У меня есть предложение получше. Вместо найма в штат предлагаю поработать на подряде - оплата на моё ИП, на 20% дешевле чем штатный сотрудник с налогами.
WHAT_I_DO (match по ключевым словам):
| Ключевые слова | Текст модуля |
|---|---|
| SMM, соцсети, контент-план | AI-контент-завод генерит посты, визуалы, публикует на все площадки автоматически |
| лидогенерация, B2B, трафик | Лид-машина автоматически находит клиентов, обогащает контакты, генерит предложения |
| воронки, автоворонки, email | Вебинарные воронки с автоматическими прогревами, квалификация лидов |
| SEO, контент-маркетинг | AI генерит экспертные тексты под семантическое ядро, публикует |
| CRM, retention, рассылки | AI автоматизирует сегментацию, персональные письма, триггерные цепочки |
| видео, reels, YouTube | AI-видеопайплайн: HeyGen, ElevenLabs, автоматическая нарезка |
| блогеры, influencer | AI ищет блогеров, генерит ТЗ, отслеживает результаты |
SLOTS:
Я работаю как удалённый подрядчик. Беру до 5 клиентов одновременно, сейчас у меня есть 2 свободных слота.
CTA:
Кейсы: timzinin.com
Поговорить: calendly.com/timzinin
Anti-AI правила:
Используется по умолчанию для всех рассылок начиная с 2026-04-10. Задача: пробить через рекрутера к фаундеру, продать себя вместо 10 сотрудников.
Вакансии делятся на 2 категории:
{COMPANY} - название компании из HH API{POSITION_TITLE} - точное название вакансии{SALARY} - если salary_from указан: "200 000 руб" или "200-450K руб".
Если salary отсутствует - использовать альтернативную формулировку (см. ниже).Коллеги из {COMPANY}, слушайте.
Я даже календарь посмотрел на всякий случай — и да, на дворе 2026 год, а вы мне тут платите {SALARY} за работу человека на позиции {POSITION_TITLE}. Давайте я вам помогу этой ерундой прекратить заниматься?
Вместо того чтобы кормить 10 таких ребят, платите мне — я AI-инженер по процессам. Я вам соберу систему из Claude, GPT и автоматизаций, которая закроет вашу вакансию за меня. Я не пишу вам код руками — я вам строю армию агентов, которые работают за меня и за ваших будущих сотрудников сразу. В частности, {POSITION_TITLE} у вас закроется моими руками за пару дней.
Вы уже поняли, что вам пишет мой агент, да? Я так и работаю. Я плачу моим агентам копейки, а они мне делают работу целого отдела.
Вот мой сайт: timzinin.com
Вот мой календарь: https://calendly.com/timzinin
Хватит жечь свой бюджет на вакансии из прошлого — пора догонять прогресс.
С любовью,
Тим Зинин
Коллеги из {COMPANY}, слушайте.
Я даже календарь посмотрел на всякий случай — и да, на дворе 2026 год, а вы мне тут платите {SALARY} за работу человека на позиции {POSITION_TITLE}. Давайте я вам помогу этой ерундой прекратить заниматься?
Вместо того чтобы кормить 10 таких ребят, платите мне — я AI-инженер по процессам. Я вам соберу систему из Claude, GPT и автоматизаций, которая закроет вашу вакансию за меня. Я не пишу вам код руками — я вам строю армию агентов, которые работают за меня и за ваших будущих сотрудников сразу. В частности, задачи с вашей вакансии {POSITION_TITLE} я заберу на свою машину и отдам вам результат.
Вы уже поняли, что вам пишет мой агент, да? Я так и работаю. Я плачу моим агентам копейки, а они мне делают работу целого отдела.
Вот мой сайт: timzinin.com
Вот мой календарь: https://calendly.com/timzinin
Хватит жечь свой бюджет на вакансии из прошлого — пора догонять прогресс.
С любовью,
Тим Зинин
Заменить фрагмент
"вы мне тут платите {SALARY} за работу человека на позиции {POSITION_TITLE}"
на
"вы мне тут готовы платить живому человеку за работу на позиции {POSITION_TITLE}".
timzinin.com, https://calendly.com/timzinin~/.claude/hooks/social-text-spacing.py// Откликнуться
eval "var btns = document.querySelectorAll('a, button');
for (var i = 0; i < btns.length; i++) {
if (btns[i].textContent.trim() === 'Откликнуться') {
var rect = btns[i].getBoundingClientRect();
if (rect.y > 100 && rect.width > 100) { btns[i].click(); break; }
}
}"
eval "var btns = document.querySelectorAll('button');
for (var i = 0; i < btns.length; i++) {
if (btns[i].textContent.indexOf('Все равно') > -1) { btns[i].click(); break; }
}"
// В eval невозможен async polling, поэтому через повторные вызовы eval
eval "document.querySelector('textarea') ? 'ready' : 'no_ta'"
// Повторять каждые 500мс до 10 раз
$NODE $CDP type <tab> "<text>"Atomic write в sent.json:
cp sent.json sent.json.bak
# Через Claude: прочитать → добавить запись → записать через Write tool
Запись в sent.json:
{
"id": "131799467",
"company": "Арт-Матита",
"title": "Маркетолог автоворонок",
"salary": 100000,
"salary_raw": "от 100 000 ₽ за месяц, на руки",
"status": "SENT",
"reason": null,
"date": "2026-04-03",
"message_preview": "Коллеги из Арт-Матита..."
}
Reason codes: SENT, SKIP_NO_TEXTAREA, SKIP_ALREADY_APPLIED, SKIP_DRY_RUN, SKIP_USER, FAILED_NO_CONFIRMATION, FAILED_CDP_ERROR, FAILED_CDP_TIMEOUT, FAILED_ANTI_BOT
Дневной лог ~/hh-outreach-data/log-YYYY-MM-DD.md:
| # | ID | Компания | Вакансия | ЗП | Статус | Reason |
Вернуться к Шаг 2. Счётчик: X/N. Лимит: максимум 30 за сессию.
HH Outreach: завершено
Отправлено: X
Пропущено: Y (Nx SKIP_NO_TEXTAREA, Nx SKIP_ALREADY_APPLIED, ...)
Ошибок: Z (Nx FAILED_NO_CONFIRMATION, ...)
Топ-3 по зарплате: ...
Всего за всё время: N (из ~200 лимита HH)