Loading...  原贴是精易论坛发的 这个样子 > python调用指纹浏览器例子 > https://bbs.ijingyi.com/forum.php?mod=viewthread&tid=14864295 > (出处: 精易论坛) 刚好我前阵子帮一个客户写指纹浏览器相关的工具 也是用的火狐 遇到过这个问题 , 就顺手给他写了一个python demo ```python import asyncio import time import websockets import json from bit_api import openBrowser async def run_cdp(): res = openBrowser("8dc0d9ae41212fcba9123066953923e2") WS_URL = res['data']['ws'] async with websockets.connect(WS_URL) as websocket: msg_id = 0 session_id = None async def send_cmd(method, params=None): nonlocal msg_id, session_id msg_id += 1 cmd = {"id": msg_id, "method": method, "params": params or {}} if session_id and not method.startswith("Target."): cmd["sessionId"] = session_id await websocket.send(json.dumps(cmd)) while True: resp_raw = await websocket.recv() resp = json.loads(resp_raw) if resp.get("id") == msg_id: return resp if resp.get("method") == "Target.receivedMessageFromTarget": inner = json.loads(resp["params"]["message"]) if inner.get("id") == msg_id: return inner # 1. 新建页面 resp = await send_cmd("Target.createTarget", {"url": "about:blank"}) target_id = resp["result"]["targetId"] # 2. attach await websocket.send(json.dumps({ "id": 999, "method": "Target.attachToTarget", "params": {"targetId": target_id, "flatten": True} })) while True: evt = json.loads(await websocket.recv()) if evt.get("method") == "Target.attachedToTarget": session_id = evt["params"]["sessionId"] print("Got session_id:", session_id) break # 3. 启用 await send_cmd("Page.enable") await send_cmd("Runtime.enable") # 4. 跳转百du await send_cmd("Page.navigate", {"url": "https://www.baidu.com"}) # 等 loadEventFired while True: evt = json.loads(await websocket.recv()) if evt.get("method") == "Target.receivedMessageFromTarget": inner = json.loads(evt["params"]["message"]) if inner.get("method") == "Page.loadEventFired": print("Page fully loaded") break # 5. 用 JS 操作 DOM await send_cmd("Runtime.evaluate", { "expression": "document.querySelector('.s_ipt').value='哥们我很需要你的500精币谢谢';" }) await send_cmd("Runtime.evaluate", { "expression": "document.querySelector('.s_btn').click();" }) # 等 1 秒 await asyncio.sleep(1) print("哥们我很需要你的500精币谢谢") # end print("搜索已触发!") # 运行 asyncio.run(run_cdp()) ``` 因为这个调用的BitBrowser 所以问题总结为 * **Chrome** :你可以通过 `ws` 地址,Selenium 或 Puppeteer 之类库都能直接复用浏览器。 * **Firefox** :你必须用 `geckodriver`(Selenium 官方路径)或者 Mozilla 提供的 RDP 客户端, **不能直接用 Chrome 的那套 CDP ws 地址** 。 因为 * **Chrome/Edge 这类 Chromium 内核浏览器** → 天生支持 **CDP (Chrome DevTools Protocol)** ,BitBrowser 给的那个 `ws://.../devtools/browser/...` 地址可以直接拿来用,很多库(Selenium 4 自带的 `devtools`、`pychrome`、Playwright、Puppeteer)都能连上。 * **Firefox** → 并不支持 CDP。 * Firefox 有自己的一套 **Remote Debugging Protocol (RDP)** ,而不是 CDP。 * Selenium 驱动 Firefox 时,是通过 **geckodriver** → **Marionette 协议** 来控制浏览器的。 * 所以你拿 `ws://.../devtools/browser/...` 这种 CDP 地址去连 Firefox,肯定不行。 这也就是为什么他用默认的比特浏览器的demo没办法拉起来火狐浏览器 最后修改:2025 年 09 月 18 日 © 允许规范转载 打赏 赞赏作者 微信 赞 0 如果觉得我的文章对你有用,请随意赞赏
此处评论已关闭