|
| 1 | +# brosdk-sdk-python |
| 2 | + |
| 3 | +Python 语言绑定库 + 交互式命令行 Demo。 |
| 4 | + |
| 5 | +通过 `ctypes` 动态加载平台 DLL/dylib,暴露安全、符合 Python 惯用法的 API。 |
| 6 | + |
| 7 | +## 项目结构 |
| 8 | + |
| 9 | +``` |
| 10 | +brosdk-sdk-python/ |
| 11 | +├── brosdk/ |
| 12 | +│ ├── __init__.py # 公共 API 导出 |
| 13 | +│ ├── ffi.py # 原始 C ctypes 绑定 |
| 14 | +│ ├── manager.py # 高级安全封装 + 事件回调 |
| 15 | +│ └── api.py # REST API 客户端 |
| 16 | +├── libs/ |
| 17 | +│ ├── brosdk.dll # Windows x64 原生库 |
| 18 | +│ └── brosdk.dylib # macOS arm64 原生库 |
| 19 | +├── demo.py # 交互式命令行 Demo |
| 20 | +├── pyproject.toml # 项目配置 |
| 21 | +├── requirements.txt # 可选依赖 |
| 22 | +└── README.md |
| 23 | +``` |
| 24 | + |
| 25 | +## 环境要求 |
| 26 | + |
| 27 | +- Python 3.8+ |
| 28 | +- 从 [github.com/browsersdk/brosdk-sdk/releases](https://github.com/browsersdk/brosdk-sdk/releases) 下载原生库并放置到 `libs/` 目录 |
| 29 | + |
| 30 | +## 快速开始 |
| 31 | + |
| 32 | +### 安装依赖(可选) |
| 33 | + |
| 34 | +```bash |
| 35 | +pip install -r requirements.txt |
| 36 | +``` |
| 37 | + |
| 38 | +> 不安装也能运行,`requests` 会降级到内置 `urllib`,`colorama` 会降级为无色输出。 |
| 39 | +
|
| 40 | +### 运行 Demo |
| 41 | + |
| 42 | +```bash |
| 43 | +# 交互式菜单 |
| 44 | +python demo.py |
| 45 | + |
| 46 | +# 预填 API Key 直接进入 |
| 47 | +python demo.py --api-key YOUR_API_KEY |
| 48 | + |
| 49 | +# 快速演示(自动执行所有步骤) |
| 50 | +python demo.py --quick --api-key YOUR_API_KEY |
| 51 | + |
| 52 | +# 使用已有环境跳过创建步骤 |
| 53 | +python demo.py --quick --api-key YOUR_API_KEY --env-id ENV_ID |
| 54 | + |
| 55 | +# 开启详细日志 |
| 56 | +python demo.py --verbose |
| 57 | +``` |
| 58 | + |
| 59 | +### Demo 使用流程 |
| 60 | + |
| 61 | +1. **选择 `1`** → 输入 API Key → 自动获取 userSig → 初始化 SDK |
| 62 | +2. **选择 `2`** → 查看环境列表(SDK 接口或 REST API) |
| 63 | +3. **选择 `3`** → 选择内核版本(可选代理)→ 创建新环境 |
| 64 | +4. **选择 `4`** → 启动浏览器环境(异步,等待 SDK 事件回调) |
| 65 | +5. **选择 `5`** → 关闭浏览器环境 |
| 66 | + |
| 67 | +## 库使用方式 |
| 68 | + |
| 69 | +### 基础用法 |
| 70 | + |
| 71 | +```python |
| 72 | +from brosdk import BrosdkManager |
| 73 | + |
| 74 | +def on_event(event): |
| 75 | + print(f"SDK 事件: code={event.code}, data={event.data}") |
| 76 | + |
| 77 | +sdk = BrosdkManager() |
| 78 | +sdk.on_event(on_event) |
| 79 | + |
| 80 | +# 加载原生库 |
| 81 | +sdk.load("libs/brosdk.dll") # Windows |
| 82 | +# sdk.load("libs/brosdk.dylib") # macOS |
| 83 | + |
| 84 | +# 初始化(user_sig 通过 REST API 获取) |
| 85 | +sdk.init("your_user_sig", "/tmp/.brosdk", port=8080) |
| 86 | + |
| 87 | +# 启动环境 |
| 88 | +import json |
| 89 | +sdk.browser_open(json.dumps({ |
| 90 | + "envs": [{"envId": "env-001", "args": ["--no-first-run"]}] |
| 91 | +})) |
| 92 | + |
| 93 | +# 关闭环境 |
| 94 | +sdk.browser_close("env-001") |
| 95 | + |
| 96 | +sdk.shutdown() |
| 97 | +``` |
| 98 | + |
| 99 | +### 使用上下文管理器 |
| 100 | + |
| 101 | +```python |
| 102 | +from brosdk import BrosdkManager |
| 103 | + |
| 104 | +with BrosdkManager("libs/brosdk.dll") as sdk: |
| 105 | + sdk.init("user_sig", "/tmp/.brosdk") |
| 106 | + sdk.browser_open('{"envs": [{"envId": "env-001"}]}') |
| 107 | + # SDK 会在 with 块结束时自动 shutdown |
| 108 | +``` |
| 109 | + |
| 110 | +### REST API 客户端 |
| 111 | + |
| 112 | +```python |
| 113 | +from brosdk.api import BrosdkApiClient |
| 114 | + |
| 115 | +client = BrosdkApiClient(api_key="your-api-key") |
| 116 | + |
| 117 | +# 获取 userSig |
| 118 | +user_sig = client.get_user_sig() |
| 119 | + |
| 120 | +# 创建环境 |
| 121 | +env = client.create_env(kernel_version="127", proxy="http://127.0.0.1:8080") |
| 122 | +print(f"创建成功: {env.env_id}") |
| 123 | + |
| 124 | +# 查询环境列表 |
| 125 | +result = client.page_env(page=1, page_size=20) |
| 126 | +for e in result.list: |
| 127 | + print(f"{e.env_id}: {e.env_name} ({e.kernel_version})") |
| 128 | + |
| 129 | +# 获取所有环境(自动翻页) |
| 130 | +all_envs = client.list_all_envs() |
| 131 | +``` |
| 132 | + |
| 133 | +### 监听 SDK 事件 |
| 134 | + |
| 135 | +```python |
| 136 | +from brosdk import BrosdkManager, SdkEvent |
| 137 | + |
| 138 | +sdk = BrosdkManager() |
| 139 | + |
| 140 | +@sdk.on_event |
| 141 | +def handle_event(event: SdkEvent): |
| 142 | + if event.is_ok(): |
| 143 | + print(f"成功: {event.data}") |
| 144 | + else: |
| 145 | + data = event.data_json() # 自动解析 JSON |
| 146 | + print(f"事件 code={event.code}: {data}") |
| 147 | +``` |
| 148 | + |
| 149 | +> **注意**:`browser_open` 是异步操作,结果通过事件回调返回,不阻塞主线程。 |
| 150 | +
|
| 151 | +## API 参考 |
| 152 | + |
| 153 | +### `BrosdkManager` |
| 154 | + |
| 155 | +| 方法 | 说明 | |
| 156 | +|------|------| |
| 157 | +| `load(lib_path)` | 加载原生库,注册回调 | |
| 158 | +| `init(user_sig, work_dir, port)` | 用凭据初始化 SDK | |
| 159 | +| `sdk_info()` | 查询 SDK 运行时信息 | |
| 160 | +| `browser_open(json_str)` | 启动浏览器环境(异步) | |
| 161 | +| `browser_close(env_id)` | 关闭浏览器环境 | |
| 162 | +| `token_update(token_json)` | 刷新访问令牌 | |
| 163 | +| `env_create(config)` | 创建新环境 | |
| 164 | +| `env_page(page, page_size)` | 分页查询环境列表 | |
| 165 | +| `env_update(config)` | 更新环境配置 | |
| 166 | +| `env_destroy(env_id)` | 销毁环境 | |
| 167 | +| `shutdown()` | 优雅关闭 | |
| 168 | +| `on_event(callback)` | 注册事件监听器 | |
| 169 | +| `off_event(callback)` | 移除事件监听器 | |
| 170 | + |
| 171 | +### `BrosdkApiClient` |
| 172 | + |
| 173 | +| 方法 | 说明 | |
| 174 | +|------|------| |
| 175 | +| `get_user_sig(duration)` | API Key → userSig | |
| 176 | +| `create_env(kernel_version, ...)` | 创建环境 | |
| 177 | +| `page_env(page, page_size)` | 分页查询环境 | |
| 178 | +| `list_all_envs(page_size)` | 获取所有环境(自动翻页) | |
| 179 | + |
| 180 | +### `SdkEvent` |
| 181 | + |
| 182 | +```python |
| 183 | +@dataclass |
| 184 | +class SdkEvent: |
| 185 | + code: int # SDK 状态码 |
| 186 | + data: str # JSON 数据字符串 |
| 187 | + |
| 188 | + def is_ok(self) -> bool: ... # 是否成功 |
| 189 | + def data_json(self) -> Any: ... # 解析 data 为 Python 对象 |
| 190 | +``` |
| 191 | + |
| 192 | +## 构建 |
| 193 | + |
| 194 | +```bash |
| 195 | +# 安装开发依赖 |
| 196 | +pip install -e ".[dev]" |
| 197 | + |
| 198 | +# 运行测试 |
| 199 | +pytest |
| 200 | + |
| 201 | +# 构建发布包 |
| 202 | +python -m build |
| 203 | +``` |
| 204 | + |
| 205 | +## 协议 |
| 206 | + |
| 207 | +MIT |
0 commit comments