From e5becbae86de6f7e3c4cfacfe6305c1b468f27f1 Mon Sep 17 00:00:00 2001 From: 27942 Date: Fri, 6 Mar 2026 01:33:11 +0800 Subject: [PATCH] haha --- 1.html | 1320 ++++++++++++++++++++++++++--------------------------- 1.py | 83 +++- 自动化.py | 46 +- 3 files changed, 774 insertions(+), 675 deletions(-) diff --git a/1.html b/1.html index 1c3193e..72324bd 100644 --- a/1.html +++ b/1.html @@ -1,776 +1,774 @@ BOSS直聘
\ No newline at end of file + +
\ No newline at end of file diff --git a/1.py b/1.py index d9485f2..5729ffb 100644 --- a/1.py +++ b/1.py @@ -9,6 +9,7 @@ from __future__ import annotations import random import sys import time + from pathlib import Path # 保证从项目根目录运行时可导入 worker 包 @@ -17,11 +18,11 @@ if str(_ROOT) not in sys.path: sys.path.insert(0, str(_ROOT)) # ---------- 选择控制对象 ---------- -USE_LOCAL_CHROME = True # True=本地谷歌 Chrome,False=比特浏览器 +USE_LOCAL_CHROME = True # True=本地谷歌 Chrome,False=比特浏览器 # 本地谷歌 Chrome 配置(仅当 USE_LOCAL_CHROME=True 时生效) CHROME_DEBUG_PORT = 9222 # 调试端口;若为 None 则由脚本自动启动 Chrome -CHROME_PATH = None # 例如 r"C:\Program Files\Google\Chrome\Application\chrome.exe",None 用系统默认 +CHROME_PATH = None # 例如 r"C:\Program Files\Google\Chrome\Application\chrome.exe",None 用系统默认 # 比特浏览器配置(仅当 USE_LOCAL_CHROME=False 时生效) BIT_API_BASE = "http://127.0.0.1:54345" @@ -65,7 +66,7 @@ def _connect_bit_browser(): return ChromiumPage(addr_or_opts=co) -def main(): +def main(filters): from DrissionPage.errors import NoRectError if USE_LOCAL_CHROME: @@ -73,25 +74,33 @@ def main(): else: page = _connect_bit_browser() + # 先启动监听再执行动作,否则拿不到数据包(见 DP 文档) page.listen.start('wapi/zpjob/rec/geek/list') - # 示例:打开一个页面(可选) - page.get("https://www.zhipin.com/web/chat/recommend") - res = page.listen.wait() + if filters: + main2(page, filters) + # 有筛选时:page.get 会触发第 1 个 geek/list,点「确定」触发第 2 个;取最后一个才是筛选后的结果 + packets = page.listen.wait(count=2, timeout=30) + res = packets[-1] if packets else None + else: + page.get("https://www.zhipin.com/web/chat/recommend") + res = page.listen.wait(timeout=30) + + if not res: + raise RuntimeError("未捕获到目标请求 wapi/zpjob/rec/geek/list") for i in res.response.body["zpData"]["geekList"]: print(i) - geekName = i["geekCard"]["geekName"] # 姓名 + geekName = i["geekCard"]["geekName"] # 姓名 geekDegree = i["geekCard"]["geekDegree"] # 学历 - expectPositionName = i["geekCard"]["expectPositionName"] #期待职位 + expectPositionName = i["geekCard"]["expectPositionName"] # 期待职位 expectLocationName = i["geekCard"]["expectLocationName"] # 地区 applyStatusDesc = i["geekCard"]["applyStatusDesc"] # 当前状态离职0随时到岗之类的 ageDesc = i["geekCard"]["ageDesc"] # 年龄 lowSalary = i["geekCard"]["lowSalary"] # 最低要求工资 highSalary = i["geekCard"]["highSalary"] # 最高要求工资 - """三个动作:1. 找到姓名 2. 滚动到那里 3. 点击打招呼""" try: container = page.get_frame("recommendFrame") @@ -99,7 +108,7 @@ def main(): container = page # 1. 找到这个姓名 - name_ele = container.ele(f'x://span[contains(text(),"{geekName}")]', timeout=10) + name_ele = container.ele(f'x://span[contains(text(),"{geekName}")]', timeout=5) if not name_ele: name_ele = container.ele(f'x://span[text()="{geekName}"]', timeout=2) if not name_ele: @@ -115,17 +124,65 @@ def main(): for _ in range(8): if not parent: break - greet_btn = parent.ele('x://span[text()="打招呼"]', timeout=0.5) or parent.ele('x://*[contains(text(),"打招呼")]', timeout=0.5) + greet_btn = parent.ele('x://span[text()="打招呼"]', timeout=0.5) or parent.ele( + 'x://*[contains(text(),"打招呼")]', timeout=0.5) if greet_btn: break parent = parent.parent() if not greet_btn: - greet_btn = container.ele('x://span[text()="打招呼"]', timeout=2) or container.ele('x://*[contains(text(),"打招呼")]', timeout=1) + greet_btn = container.ele('x://span[text()="打招呼"]', timeout=2) or container.ele( + 'x://*[contains(text(),"打招呼")]', timeout=1) if not greet_btn: raise Exception("未找到「打招呼」按钮") greet_btn.click(by_js=True) +def main1(): + if USE_LOCAL_CHROME: + page = _connect_local_chrome() + else: + page = _connect_bit_browser() + + page.listen.start('wapi/zpblock/recommend/filters') + + # 示例:打开一个页面(可选) + page.get("https://www.zhipin.com/web/chat/recommend") + res = page.listen.wait() + + filters = {} + for i in res.response.body["zpData"]["vipFilter"]["filters"]: + print(i) + + if i["name"] == "年龄": + print(i["start"]) + print(i["end"]) + + filters[i["name"]] = range(int(i["start"]), int(i["end"]) + 1) + else: + datas = [] + for i1 in i["options"]: + print(i1["name"]) + datas.append(i1["name"]) + + filters[i["name"]] = datas + + print(filters) + + +def main2(page, filters): + """在同一 page 上打开推荐页、点筛选、选条件、点确定;点击确定后会触发 wapi/zpjob/rec/geek/list,由 main() 的 listen 捕获。""" + page.get("https://www.zhipin.com/web/chat/recommend") + + page.ele("x://*[contains(text(),'筛选')]").click() + time.sleep(3) + for i in filters: + page.ele(f"x://*[contains(text(),'{i}')]").click() + time.sleep(random.random() * 2) + + page.ele("x://*[contains(text(),'确定')]").click() + if __name__ == "__main__": - main() + main(filters=["初中及以下", '离职-随时到岗']) + # main1() + # main2() diff --git a/自动化.py b/自动化.py index fe224a1..ca8704d 100644 --- a/自动化.py +++ b/自动化.py @@ -24,6 +24,47 @@ BROWSER_NAME = "测试2" # 例如 "第一个" 或 "主账号" BROWSER_ID = None # 若已知窗口 ID,可直接填 +def do_recommend_filter(page): + """ + 在推荐牛人页面:点开右上角筛选 -> 弹窗内完成筛选操作 -> 点击确认。 + 筛选 UI 在 iframe recommendFrame 内(推荐牛人 / recommend-v2)。 + """ + time.sleep(1.5) # 等待 iframe 加载 + # 获取推荐牛人 iframe(name=recommendFrame) + frame = page.get_frame("@name=recommendFrame") + if not frame: + frame = page.get_frame(1) # fallback:第一个 iframe + if not frame: + print("未找到推荐牛人 iframe,跳过筛选") + return + + # 1. 点击右上角「筛选」,打开弹窗 + filter_btn = frame.ele("x://span[text()='筛选']", timeout=3) or frame.ele( + "x://*[contains(text(),'筛选')]", timeout=2 + ) + if not filter_btn: + print("未找到「筛选」按钮,跳过筛选") + return + filter_btn.click(by_js=True) + time.sleep(0.8) + + # 2. 弹窗内完成筛选(按需在此增加具体筛选项点击,例如学历、经验、期望职位等) + # 若无需改任何条件,可保持默认,直接点确认即可。 + + # 3. 点击弹窗中的「确认」 + confirm = ( + frame.ele("x://span[text()='确认']", timeout=3) + or frame.ele("x://span[text()='确定']", timeout=2) + or frame.ele("x://*[contains(text(),'确认')]", timeout=2) + ) + if not confirm: + print("未找到「确认」按钮") + return + confirm.click(by_js=True) + time.sleep(0.5) + print("推荐牛人筛选已确认") + + def main(): from DrissionPage import ChromiumPage, ChromiumOptions from DrissionPage.errors import NoRectError @@ -46,10 +87,13 @@ def main(): page.listen.start('wapi/zprelation/friend/getBossFriendListV2') - # 示例:打开一个页面(可选) + # 打开推荐牛人/聊天页 page.get("https://www.zhipin.com/web/chat/index") res = page.listen.wait() + # 执行推荐牛人筛选:点开右上角筛选 -> 弹窗内完成筛选 -> 点击确认 + do_recommend_filter(page) + for i in res.response.body["zpData"]["friendList"]: print(i)