This commit is contained in:
Administrator
2026-03-06 15:30:11 +08:00
parent b992c8ee70
commit 9a96e927c3

View File

@@ -46,10 +46,10 @@ class BossRecruitHandler(BaseTaskHandler):
task_type = TaskType.BOSS_RECRUIT.value task_type = TaskType.BOSS_RECRUIT.value
async def execute( async def execute(
self, self,
task_id: str, task_id: str,
params: Dict[str, Any], params: Dict[str, Any],
progress_cb: Callable[[str, str], Coroutine], progress_cb: Callable[[str, str], Coroutine],
) -> Any: ) -> Any:
job_title = str(params.get("job_title", "") or "").strip() or "相关岗位" job_title = str(params.get("job_title", "") or "").strip() or "相关岗位"
# account_name 实际就是 browser_name由服务端从 BossAccount.browser_name 注入) # account_name 实际就是 browser_name由服务端从 BossAccount.browser_name 注入)
@@ -98,17 +98,17 @@ class BossRecruitHandler(BaseTaskHandler):
# ────────────────────── 同步主流程 ────────────────────── # ────────────────────── 同步主流程 ──────────────────────
def _run_sync( def _run_sync(
self, self,
job_title: str, job_title: str,
account_name: str, account_name: str,
bit_api_base: str, bit_api_base: str,
selected_filters: List[str], selected_filters: List[str],
position_names: List[str], position_names: List[str],
greet_target: int, greet_target: int,
worker_id: str, worker_id: str,
cancel_event, cancel_event,
age_min: Optional[int] = None, age_min: Optional[int] = None,
age_max: Optional[int] = None, age_max: Optional[int] = None,
) -> Dict[str, Any]: ) -> Dict[str, Any]:
self.ensure_not_cancelled(cancel_event) self.ensure_not_cancelled(cancel_event)
@@ -158,18 +158,18 @@ class BossRecruitHandler(BaseTaskHandler):
# ────────────────────── 主招聘循环(对齐 1.py main ────────────────────── # ────────────────────── 主招聘循环(对齐 1.py main ──────────────────────
def _run_main_flow( def _run_main_flow(
self, self,
*, *,
page, page,
job_title: str, job_title: str,
selected_filters: List[str], selected_filters: List[str],
position_names: List[str], position_names: List[str],
greet_target: int, greet_target: int,
worker_id: str, worker_id: str,
account_name: str, account_name: str,
cancel_event, cancel_event,
age_min: Optional[int] = None, age_min: Optional[int] = None,
age_max: Optional[int] = None, age_max: Optional[int] = None,
) -> Dict[str, Any]: ) -> Dict[str, Any]:
details: List[dict] = [] details: List[dict] = []
errors: List[str] = [] errors: List[str] = []
@@ -331,7 +331,7 @@ class BossRecruitHandler(BaseTaskHandler):
container.ele("x://*[contains(text(),'确定')]").click() container.ele("x://*[contains(text(),'确定')]").click()
def _load_and_extract_geek_list( def _load_and_extract_geek_list(
self, page, container, selected_filters: List[str] self, page, container, selected_filters: List[str]
) -> List[dict]: ) -> List[dict]:
""" """
与 1.py 一致的抓包逻辑: 与 1.py 一致的抓包逻辑:
@@ -379,17 +379,17 @@ class BossRecruitHandler(BaseTaskHandler):
).strip() ).strip()
def _greet_geek_list( def _greet_geek_list(
self, self,
*, *,
page, page,
container, container,
geek_list: List[dict], geek_list: List[dict],
greeted_keys: set[str], greeted_keys: set[str],
position_label: str, position_label: str,
default_job: str, default_job: str,
cancel_event, cancel_event,
age_min: Optional[int] = None, age_min: Optional[int] = None,
age_max: Optional[int] = None, age_max: Optional[int] = None,
) -> Tuple[int, List[dict]]: ) -> Tuple[int, List[dict]]:
"""与 1.py _greet_geek_list_skip_greeted 一致的去重逻辑,增加年龄过滤。""" """与 1.py _greet_geek_list_skip_greeted 一致的去重逻辑,增加年龄过滤。"""
added = 0 added = 0
@@ -494,14 +494,22 @@ class BossRecruitHandler(BaseTaskHandler):
a = page.get_frame(1) a = page.get_frame(1)
time.sleep(random.uniform(0.5, 5)) time.sleep(random.uniform(0.5, 5))
# 与 1.py 一致:打招呼
a.ele(f'x://*[contains(text(),"打招呼")]', timeout=2).click(by_js=True)
time.sleep(random.uniform(0.5, 5))
# 与 1.py 一致:收藏 # 与 1.py 一致:收藏
a.ele(f'x://*[contains(text(),"收藏")]', timeout=2).click(by_js=True) a.ele(f'x://*[contains(text(),"收藏")]', timeout=2).click(by_js=True)
time.sleep(random.uniform(0.5, 5)) time.sleep(random.uniform(0.5, 5))
# 与 1.py 一致:打招呼
try:
a.ele(f'x://*[contains(text(),"打招呼")]', timeout=2).click(by_js=True)
time.sleep(random.uniform(0.5, 5))
except:
pass
try:
a.ele(f'x://*[@class="btn-v2 btn-sure-v2 btn-greet"]', timeout=2).click(by_js=True)
except:
pass
time.sleep(random.uniform(0.5, 5))
# 与 1.py 一致btn-outline × 3 # 与 1.py 一致btn-outline × 3
for i in range(3): for i in range(3):
a.ele('x://*[@class="btn-v2 btn-outline-v2"]').click(by_js=True) a.ele('x://*[@class="btn-v2 btn-outline-v2"]').click(by_js=True)