HH.RU можешь не давать мне API, я сделаю playwrite бота 🫵
У меня нет воронок, я не инфо-циг... "продавец" поэтому в каком то смысле я не могу стать тем кого презираю даже несмотря на то что многие люди лицемерны и много кто такую двойную жизнь ведет, но речь тут не об этом.
Захотели внедрять ИИ - будет и обратка в виде скрипта автонапоминания и спама о том что бы вы не забывали крутых специалистов и помнили о наших выполненных тестовых заданиях и давали нормальную обратную связь
Сливаю вам часть своего бота по контр-откликам и напоминаниям несправедливому it рынку
def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: parser = argparse.ArgumentParser( description="Рассылка сообщений по откликам hh.ru старше суток", epilog='Пример: python3 send.py "Здравствуйте, подскажите по обратной связи"', ) parser.add_argument("message", help="текст сообщения работодателю") parser.add_argument( "--min-age-hours", type=int, default=DEFAULT_MIN_AGE_HOURS, help="возраст отклика в часах (по умолчанию 24)" ) parser.add_argument( "--states", default=None, help="статусы через запятую (по умолчанию: API — response; браузер — response,invitation,interview)", ) parser.add_argument("--repeat-after-days", type=int, default=None, help="разрешить повтор через N дней") parser.add_argument("--limit", type=int, default=None, help="максимум сообщений за запуск") parser.add_argument("--max-pages", type=int, default=10, help="сколько страниц списка читать (браузер)") parser.add_argument( "--newest-first", action="store_true", help="идти от новых откликов к старым (по умолчанию — со старых, они чаще «затихшие»)", ) parser.add_argument("--delay", type=float, default=DEFAULT_DELAY, help="пауза между отправками, сек") parser.add_argument("--no-chat-check", action="store_true", help="не заглядывать в переписку (быстрее, грубее)") parser.add_argument( "--browser", action="store_true", help="работать через браузер (вашу сессию hh.ru) вместо API; нарушает правила hh.ru", ) parser.add_argument("--dry-run", action="store_true", help="показать план без отправки") parser.add_argument("--quiet", action="store_true", help="только итоговая сводка") args = parser.parse_args(list(argv) if argv is not None else None) if not args.message.strip(): parser.error("сообщение не может быть пустым") if args.min_age_hours < 0: parser.error("--min-age-hours не может быть отрицательным") return args
def _states(raw: str | None, default: frozenset[str]) -> frozenset[str]: if not raw: return default return frozenset(part.strip() for part in raw.split(",") if part.strip()) or default
def _run_api(args, reporter: hc.ConsoleReporter) -> hc.Stats: repository = hc.NegotiationsRepository(hc.build_client()) history = hc.ActionHistory(HISTORY_FILE) policy = FollowUpPolicy( min_age=timedelta(hours=args.min_age_hours), states=_states(args.states, DEFAULT_STATES), history=history, repeat_after=timedelta(days=args.repeat_after_days) if args.repeat_after_days else None, probe=None if args.no_chat_check else repository, ) broadcaster = FollowUpBroadcaster(repository, policy, history, reporter, delay=args.delay) return broadcaster.run(args.message.strip(), limit=args.limit, dry_run=args.dry_run)
def _run_browser(args, reporter: hc.ConsoleReporter) -> hc.Stats: import hh_browser as hb
history = hc.ActionHistory(HISTORY_FILE) with hb.browser_backend() as (reader, sender): repository = hb.BrowserNegotiationsRepository( reader, sender=sender, max_pages=args.max_pages, reverse=not args.newest_first ) policy = policy_for_browser(args, history, repository) broadcaster = FollowUpBroadcaster(repository, policy, history, reporter, delay=args.delay) return broadcaster.run(args.message.strip(), limit=args.limit, dry_run=args.dry_run)
· вчера
Жестко, но по делу, рынок и правда перегнул с автоотказами и молчанием после выполненных ТЗ. Понравилось, что решение не просто «спамилка», а полноценный скрипт с защитой от бана, валидацией аргументов и логированием.
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответить
0
коммент удалён
· вчера
Спасибо 🙏 рад что был полезен, в своем блоге буду почаще подобного постить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответить
0
ответ удалён