Skip to content

Commit 8fc054a

Browse files
committed
feat: initial Python SDK implementation
- brosdk/ffi.py: ctypes C bindings for brosdk.dll/dylib - brosdk/manager.py: high-level BrosdkManager with event callbacks - brosdk/api.py: REST API client (getUserSig, create, page) - brosdk/console.py: optional Windows DLL console output helper - demo.py: interactive CLI demo - README.md, pyproject.toml, requirements.txt, .gitignore
0 parents  commit 8fc054a

10 files changed

Lines changed: 2151 additions & 0 deletions

File tree

.gitignore

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Python
2+
__pycache__/
3+
*.py[cod]
4+
*.pyo
5+
*.pyd
6+
*.egg
7+
*.egg-info/
8+
dist/
9+
build/
10+
.eggs/
11+
*.whl
12+
13+
# 虚拟环境
14+
.venv/
15+
venv/
16+
env/
17+
.env
18+
19+
# IDE
20+
.idea/
21+
.vscode/
22+
*.swp
23+
*.swo
24+
25+
# 原生库二进制(用户自行放置)
26+
libs/*.dll
27+
libs/*.dylib
28+
libs/*.so
29+
30+
# 工具目录
31+
.workbuddy/
32+
33+
# 根目录散落的二进制 / 压缩包
34+
*.dll
35+
*.dylib
36+
*.so
37+
*.h
38+
*.zip
39+

README.md

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
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

brosdk/__init__.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
brosdk-sdk-python
3+
=================
4+
5+
Python 语言绑定库,动态加载平台 DLL/dylib 并暴露安全、符合 Python 惯用法的 API。
6+
7+
快速开始
8+
--------
9+
10+
.. code-block:: python
11+
12+
from brosdk import BrosdkManager
13+
14+
sdk = BrosdkManager()
15+
sdk.load("libs/windows-x64/brosdk.dll")
16+
sdk.init("your_user_sig", "/path/to/work_dir", 8080)
17+
18+
sdk.browser_open('{"envs": [{"envId": "env-001"}]}')
19+
sdk.browser_close("env-001")
20+
sdk.shutdown()
21+
"""
22+
23+
from .manager import BrosdkManager, SdkEvent
24+
from .ffi import BrosdkLib
25+
26+
__version__ = "1.0.0"
27+
__all__ = [
28+
"BrosdkManager", "SdkEvent", "BrosdkLib",
29+
]

0 commit comments

Comments
 (0)