This release is a pre-release and may not be stable for production use.
brosdk-playwright
English | 简体中文
brosdk-playwright 是 BroSDK 指纹浏览器与 Playwright 自动化的一键式集成方案。
BroSDK 负责"造环境"(指纹 / 代理 / 会话持久化),Playwright 负责"干活"(页面自动化),两者通过 CDP(Chrome DevTools Protocol)桥接。
只需把 import 路径从 playwright.sync_api 换成 brosdk_playwright,即可在不改变任何 Playwright 使用习惯的前提下,获得多版本指纹内核、独立代理 IP、Cookie/Storage 会话持久化能力。
import brosdk_playwright as bp
bp.configure(api_key="your-api-key", work_dir="./.brosdk")
from brosdk_playwright import sync_playwright # 与原生签名完全一致
with sync_playwright() as p:
browser = p.chromium.launch(env={ # per-browser 环境配置
"env_id": "2070365861541056512", # 复用已有环境,自动恢复登录态
"kernel_version": "134",
"proxy": "socks5://user:pass@host:1080",
})
page = browser.new_page()
page.goto("https://example.com")
browser.close() # 断开 CDP + 关闭浏览器(自动持久化 cookie)
bp.shutdown()
核心能力
- 零切换成本:
sync_playwright()与 Playwright 官方签名完全一致;所有 Playwright API(new_page/goto/click/screenshot/…)原样可用。 - 指纹环境管理:自动创建/复用 BroSDK 浏览器环境(独立指纹、独立代理)。
- 会话持久化:通过
env_id复用已有环境,同一环境自动恢复上次的 Cookie/Storage/登录态。 - CDP 自动桥接:内部把 BroSDK 异步启动事件(
browser-open-success)桥接成同步的launch(),自动获取 CDP 端口并连接 Playwright。 - 多环境并发:每个环境自动分配独立 CDP 端口,规避端口冲突。
- 混合用法:
p.chromium.launch()(无env)走原生 Playwright;p.firefox/p.webkit透传给原生 Playwright。
工作原理
用户代码 (Playwright API, 不变)
│
▼
brosdk-playwright 包装层
┌─────────────────────────────────────────┐
│ _BroBrowserType.launch(env=...) │
│ 1. resolve_env → 创建/复用环境 │
│ 2. launch_browser → sdk.browser_open │
│ (异步事件 20111 → 同步等待 CDP 端口) │
│ 3. connect_over_cdp → Playwright 连接 │
└─────────────────────────────────────────┘
│
▼
BroSDK 原生 SDK (brosdk.dll/.dylib/.so)
指纹内核 · 代理 · Cookie/Storage 持久化
关键技术点:sdk_browser_open 是异步的——CDP 端口不在返回值里,而是在事件回调 eventId=20111(browser-open-success)的 data.remoteDebuggingPort 字段中送达。本包用 threading.Event 把这个异步事件桥接成同步的 launch(),这是本项目的核心价值(BroSDK 官方各语言 Demo 都只是 sleep 等待,从未提取过该端口)。
安装
pip install brosdk-playwright
从源码安装:
git clone https://github.com/browsersdk/brosdk-playwright-python.git
cd brosdk-playwright-python
pip install .
还需要:
| 项目 | 要求 |
|---|---|
| Python | 3.8+ |
| 原生库 | BroSDK 动态库(brosdk.dll / brosdk.dylib / libbrosdk.so)。brosdk PyPI 包不含原生库,但 brosdk-playwright 会在首次使用时自动从 GitHub Releases 下载(见下文"原生库自动下载") |
| 认证 | BroSDK API Key(或直接提供 userSig) |
Playwright 浏览器二进制仅在 不走 BroSDK(launch() 不传 env,或用 firefox/webkit)时才需要 playwright install;走 BroSDK 时浏览器内核由 BroSDK 管理。
原生库自动下载
brosdk PyPI 包是纯 Python 包,不附带原生动态库。brosdk-playwright 在以下情况会自动从 GitHub Releases 下载并解压当前平台的动态库到工作目录的 libs/ 下:
- 未指定
lib_path,且本地(brosdk 包目录或工作目录)找不到动态库时; - 默认开启,无需任何配置。
如需关闭自动下载(例如离线环境),传入 auto_download=False,并手动通过 lib_path= 指定已下载的库路径:
bp.configure(api_key="...", lib_path="/path/to/brosdk.dll", auto_download=False)
也可指定下载特定版本:bp.configure(api_key="...", lib_version="1.0.0.5")。
快速开始
1. 配置 SDK(进程级,只需一次)
import brosdk_playwright as bp
bp.configure(
api_key="your-api-key", # 或设置环境变量 BROSDK_API_KEY
work_dir="./.brosdk", # SDK 工作目录
# lib_path="...", # 可选:指定动态库路径(缺省时自动查找/下载)
# auto_download=True, # 可选:找不到库时自动从 GitHub Releases 下载(默认开启)
# lib_version="1.0.1.1", # 可选:指定下载的库版本(默认 latest)
# stealth=True, # 可选:反检测模式(见下文),默认 False
# port=0, # 可选:0=自动分配端口(默认)
# customer_id="default", # 可选
)
反检测模式(Stealth)
BroSDK 已经管理指纹和 Chromium 启动参数(如 --disable-blink-features=AutomationControlled),
但 Playwright 通过 CDP 连接时仍会暴露自动化特征(Runtime.enable / Console.enable 泄漏等)。
开启 stealth=True 后,CDP 连接客户端从 Playwright 切换为 patchright
(undetected playwright fork),在 BroSDK 管理的浏览器之上叠加 driver 级反检测补丁,
可过 Cloudflare / Datadome / Akamai / CreepJS / Sannysoft 等检测。
bp.configure(api_key="your-api-key", stealth=True)
需先安装可选依赖:
pip install brosdk-playwright[stealth]
也可用环境变量 BROSDK_STEALTH=1 开启。注意 patchright 仅支持 Chromium 内核
(与本项目的 BroSDK 流程一致,firefox/webkit 透传不受影响)。
也支持纯环境变量配置(无需 configure):
export BROSDK_API_KEY=your-api-key
export BROSDK_WORK_DIR=./.brosdk
2. 像 Playwright 一样写代码
from brosdk_playwright import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(env={"kernel_version": "134"})
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()
运行 Demo
python examples/demo.py --api-key YOUR_API_KEY # 交互式
python examples/demo.py --quick --api-key YOUR_API_KEY # 快速演示
env 配置参考
p.chromium.launch(env={...}) 的 env 字典支持以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
env_id |
string | 直接指定 BroSDK 环境 ID,复用已有环境(自动恢复登录态)。省略则创建新环境 |
kernel_version |
string | Chrome 内核版本,如 "134"/"131"/"127",默认 "134" |
proxy |
string | 代理地址,如 socks5://user:pass@host:1080 |
region |
string | 国家代号(无法获取代理时生成对应区域 IP) |
system |
string | 操作系统,如 "Windows 11" |
finger |
dict | 完整指纹配置(整体覆盖,详见 BroSDK 文档) |
env_name |
string | 环境名称(默认自动生成) |
args |
list | 追加的 Chromium 启动参数 |
urls |
list | 启动后自动打开的 URL 列表 |
cookies |
list | 启动时注入的 Cookie(WebExtension API 格式) |
extensions |
list | 加载的扩展列表 |
forward |
string | 本次启动使用的前置跳板 |
launch_timeout |
float | 启动超时(秒),默认 60 |
会话复用:记住
browser.brosdk_env_id,下次launch(env={"env_id": ...})传入即可—— BroSDK 环境本身持久化 cookie/storage,同一 envId 再次启动自动恢复登录态。 省略env_id时创建新环境。
API 概览
模块级
| 名称 | 说明 |
|---|---|
configure(api_key=..., ...) |
配置 SDK 认证与工作目录(进程级) |
sync_playwright() |
与 Playwright 同名上下文管理器,返回包装后的 Playwright |
BroSDKError |
本包抛出的所有错误的基类 |
list_envs() |
返回当前账号下的环境列表 |
destroy_env(env_id) |
销毁环境(删除环境及其所有持久化数据) |
shutdown() |
关闭 BroSDK,释放原生资源 |
get_config() |
读取当前配置 |
browser 增强字段
走 BroSDK 启动的 browser 对象额外暴露:
| 字段 | 说明 |
|---|---|
browser.brosdk_env_id |
关联的 BroSDK 环境 ID |
browser.cdp_port |
浏览器 CDP 调试端口 |
适用场景
- 多账号运营 SaaS:每个账号用独立
env_id隔离环境,独立指纹/代理/cookie。 - 自动化测试:现有 Playwright 测试套件零改动获得指纹和代理能力。
- AI Agent 浏览器任务:在 LangChain/AutoGPT 工具链中为 Playwright 注入指纹环境。
- ERP/CRM 集成:企业 Playwright 脚本复用,带会话持久化。
项目结构
brosdk-playwright-python/
├── brosdk_playwright/
│ ├── __init__.py # 公共 API 导出
│ ├── _config.py # 全局配置 + 认证(configure / get_config)
│ ├── _sdk.py # 环境管理 + 异步事件→同步 launch/close 桥接
│ ├── _downloader.py # 原生库自动下载(GitHub Releases)
│ ├── _playwright.py # Playwright API 包装层
│ └── sync_api.py # sync_playwright() 上下文管理器
├── examples/ # 使用示例 + 交互式 CLI Demo (demo.py)
├── config/ # E2E 测试配置(e2e.config.json,含密钥,已 gitignore)
├── tests/ # 单元测试 + e2e/ 子目录(无需真实 SDK/浏览器)
└── pyproject.toml
开发
pip install -e ".[dev]"
pytest
测试不依赖真实 SDK、浏览器或 API Key——通过伪 BrosdkManager 注入验证核心的异步→同步桥接逻辑。
与 BroSDK 生态的关系
| 仓库 | 说明 |
|---|---|
| brosdk | 原生 C/C++ SDK |
| brosdk-python | Python 语言绑定(本包依赖) |
| brosdk-docs | 官方文档和 API 参考 |
| brosdk-typescript | TypeScript 语言绑定 |
License
MIT
Release files for brosdk-playwright 0.1.0a2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| brosdk_playwright-0.1.0a2.tar.gz | 34.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| brosdk_playwright-0.1.0a2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 61.3 kB
Release files / brosdk_playwright-0.1.0a2.tar.gz
| Download URL | brosdk_playwright-0.1.0a2.tar.gz |
|---|---|
| Size | 34.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9d1a7aa8dc20419e248a33e926f7b3d40b8bd0d1039fd14fe569c2265d5a1c27
|
|
BLAKE2b-256 checksum How to use checksums |
b519c8e0437b6120cd03f8e7be9e0f30c47e86e134634f70cb54d540aec25255
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 30, 2026.
Transparency logRelease files / brosdk_playwright-0.1.0a2-py3-none-any.whl
| Download URL | brosdk_playwright-0.1.0a2-py3-none-any.whl |
|---|---|
| Size | 26.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
670ee858c4bbf45063fcfb4981dbeea6e984b361cd37f1732684416aa1697c4a
|
|
BLAKE2b-256 checksum How to use checksums |
e70a64ddec473a0bb66c366a966c27deaa36316af948417028c4df2be77d91eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 30, 2026.
Transparency log