候鳥 ApiServer 知識包 (Rules Package)
這是本專欄最核心的部分。通過將以下 Rules 知識包注入 Cursor 或 Antigravity,AI 模型將全量掌握候鳥 ApiServer 的所有接口、錯誤碼、附錄參數,確保在編寫腳本時絕不產生「幻覺」。
IMPORTANT
候鳥自動化核心建議: 在運行自動化腳本時,請務必將候鳥客戶端設置中的運行模式切換為 「本地模式」。
- 性能提升:本地模式會自動跳過網絡數據同步(上傳/下載環境數據),自動化開啟速度與腳本執行效率將提升 數十倍。
- 安全提醒:請養成每日備份本地數據的習慣。您的核心業務數據(環境、指紋、Cookie 等)均存儲在
MBDATA目錄下,請定期對該文件夾進行異地備份。
如何使用
對於 Cursor 用戶
- 在您的候鳥腳本項目根目錄創建一個文件
.cursor/rules/mbbrowser.mdc。 - 將下方「候鳥 ApiServer Rules 知識包」的完整內容複製粘貼進去並保存。
- 重新開啟 Cursor Chat (或開啟一個新對話)。
- AI 會在接下來的每一次對話中自動攜帶這些知識。
對於 Antigravity 用戶
Antigravity (Google 的 Agent 優先 IDE) 有自己的規則體系,使用獨立的 .agent/rules/ 目錄。
操作步驟:
- 在項目根目錄(工作區或 git 根目錄)下創文件夾 .agent/rules/ (如已存在則直接使用)。
- 在該文件夾內創建一個文件 mbbrowser.md (後綴必須是 .md,純 Markdown 格式)。
- 將下方「候鳥 ApiServer Rules 知識包」中的規範、接口詳解和代碼模板複製粘貼進去並保存。
- 重啟 Antigravity 或重新打開項目 -> Agent 將自動加載 .agent/rules/ 下的所有 .md 文件並注入系統提示詞 (在工作區級別生效)。
文件結構示例:
your-project/
└── .agent/
└── rules/
└── mbbrowser.md ← 在這裡粘貼規範內容進階提示:
- 全量同步:如果您同時使用兩款工具,可以維護雙路徑:
.cursor/rules/mbbrowser.mdc(供 Cursor 使用) +.agent/rules/mbbrowser.md(供 Antigravity 使用)。 - 字符限制:規則文件大小上限約為 12,000 字符,如果內容過多,建議拆分為多個 .md 文件。
- 全局生效:如果您希望在所有項目中生效,可以放入
~/.gemini/GEMINI.md。
候鳥 ApiServer Rules 知識包
請複製下方全部內容並替換上述文件中的內容。
markdown
# 候鳥 (MBBrowser) + ApiServer 完整開發規範
## 1. 產品簡介
> [!IMPORTANT]
> **性能秘訣**:在大規模自動化運行前,請確保候鳥客戶端處於 **「本地模式」**。這將跳過雲端數據同步,環境開啟速度提升數十倍。請務必定期手動備份 **`MBDATA`** 業務數據文件夾。
候鳥 (MBBrowser) 是一款專業的防關聯指紋瀏覽器,用於多帳號環境隔離。每個「環境」(Session) 都有獨立的:瀏覽器指紋、代理 IP、Cookie、User-Agent、時區、語言等。
ApiServer (apiserver.exe) 是候鳥在本地開放的 HTTP API 服務,允許腳本通過編程方式控制瀏覽器環境。
## 2. ApiServer 啟動方式
```bash
apiserver.exe --port=8186 \
--account=your_email@qq.com \
--app_id=YOUR_APP_ID \
--app_key=YOUR_APP_KEY \
--hide=off \
--return=on \
--logs=on
```
參數說明:
- port: 監聽端口,默認 8186。
- account: 候鳥登錄帳號 (郵箱)。
- app_id: 從候鳥客戶端「個人中心 -> API 設置」中獲取。
- app_key: 從候鳥客戶端「個人中心 -> API 設置」中獲取。
- hide=off: 有頭模式 (推薦調試使用);hide=on 為無頭後台模式。
- return=on: 在控制台顯示 API 返回數據。
- logs=on: 將 JSON 數據寫入日誌文件。
啟動成功後,API 地址為 http://127.0.0.1:8186。
## 3. 通訊規範
- 所有接口均為 HTTP POST 請求。
- Content-Type: application/json。
- 基礎 URL: http://127.0.0.1:8186。
- code=0 代表成功;code 為負數代表失敗,message 包含錯誤詳情。
標準返回格式:
```json
{
"message": "Success",
"code": 0,
"data": { ... }
}
```
## 4. 帳號認證
### 4.1 帳號登錄 (切換帳號時使用)
POST /login
```json
{
"APP_ID": "7e147176e1d756eb03c0e18e7b640c23",
"APP_KEY": "YOUR_APP_KEY",
"Account": "test01@qq.com",
"return": "on",
"logs": "on",
"hide": "off"
}
```
返回:{"msg": "Login Success", "status": 0, "data": "Login Account: test01@qq.com"}
注意:ApiServer 啟動時已攜帶認證,此接口通常無需調用。
### 4.2 退出 ApiServer
POST /api/v1/quit
無請求參數。成功返回 code: 0 並關閉 ApiServer。
## 5. 核心接口:環境生命週期管理
### 5.1 開啟環境 (最核心接口)
POST /api/v1/browser/start
[最大頻率:不限,建議配合 --interval-seconds 控制]
請求參數:
```json
{
"Session_ID": ["373808cb37bd63f5f7d92415e736e85f"],
"isHeadless": false,
"args": [
"--disable-extensions",
"--blink-settings=imagesEnabled=false",
"--interval-seconds=2"
]
}
```
重點說明:
- Session_ID 為 Array,支持多環境同時啟動。
- isHeadless=false 為有頭模式 (可見視窗),默認為 true。
- --interval-seconds 控制多個環境之間的啟動間隔秒數。
- --blink-settings=imagesEnabled=false 禁用圖片加載 (速度更快)。
- --disable-extensions 禁用瀏覽器插件 (自動化常用)。
啟動成功關鍵返回字段:
```json
{
"message": "Success",
"code": 0,
"data": {
"listid": [{
"Session_Name": "業務環境 01",
"Session_ID": "373808cb37bd63f5f7d92415e736e85f",
"browser_CDP_Port": 46973,
"webdriver": "C:\\Users\\Admin\\houniao\\Driver\\100\\chromedriver.exe",
"status": 0
}],
"total": 1
}
}
```
[極端重要] 各框架正確對接方式:
Python Playwright:
```python
port = env_data["browser_CDP_Port"]
ws_endpoint = f"ws://127.0.0.1:{port}/json/version"
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.connect_over_cdp(ws_endpoint)
context = browser.contexts[0] # 必須取已有 Context!不能用 new_context()
page = context.pages[0] if context.pages else context.new_page()
```
JavaScript Playwright:
```javascript
const { chromium } = require('playwright');
const port = envData.browser_CDP_Port;
const wsEndpoint = `ws://127.0.0.1:${port}/json/version`;
const browser = await chromium.connectOverCDP(wsEndpoint);
const context = browser.contexts()[0]; // 必須取已有 Context!
const page = context.pages()[0] || await context.newPage();
```
Python Selenium:
```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
options = Options()
# debuggerAddress 是 "IP:端口" 格式,不用 ws://
options.add_experimental_option("debuggerAddress", f"127.0.0.1:{env_data['browser_CDP_Port']}")
service = Service(executable_path=env_data['webdriver'])
driver = webdriver.Chrome(service=service, options=options)
```
JavaScript Puppeteer:
```javascript
const puppeteer = require('puppeteer');
const port = envData.browser_CDP_Port;
const wsEndpoint = `ws://127.0.0.1:${port}/json/version`;
const browser = await puppeteer.connect({
browserWSEndpoint: wsEndpoint,
defaultViewport: null
});
```
### 5.2 關閉環境
POST /api/v1/browser/stop
```json
{
"Session_ID": "373808cb37bd63f5f7d92415e736e85f"
}
```
注意:此接口 Session_ID 為 String (不是數組)。
成功:{"message": "Success", "code": 0, "data": {"action": "StopSession_ID", "status": 0}}
### 5.3 強制關閉 (Kill)
POST /api/v1/browser/kill
```json
{
"Session_ID": "373808cb37bd63f5f7d92415e736e85f"
}
```
注意:普通 stop 有時在使用某些擴展後會導致進程殘留,推薦用 kill 強制關閉確保配額回收。
### 5.4 檢查運行狀態
POST /api/v1/browser/status
```json
{
"Session_ID": ["4e6d0dca26ef42be9bc4472779d2550f"],
"Actived_Type": 0
}
```
Actived_Type: 0 為全部,1 為僅運行中,2 為僅未運行。
返回 Session_Actived=1 代表在運行,0 代表未運行。
## 6. 環境查詢接口
### 6.1 獲取環境列表 (多維度篩選)
POST /api/v1/session/listid
過濾參數 (均為可選):
- Session_Name, Session_GroupName, Proxy_Ip, Proxy_Type 等。
- CurrentPage, ListNum (默認 50,最大 500)。
成功:
```json
{
"code": 0,
"data": {
"listid": ["373808...", "705cc..."],
"total": 2
}
}
```
### 6.2 查詢指定 Session_ID 的配置數據
POST /api/v1/session/id_container
```json
{
"Session_ID": ["373808cb37bd63f5f7d92415e736e85f"],
"Session_container_type": 1
}
```
Session_container_type: 1 為全量詳情 (包含 browser_CDP_Port, webdriver, 完整指紋)。
## 7. 創建與更新接口
### 7.1 創建環境
POST /api/v1/session/create
[最大頻率:40 請求/分]
重要參數 `Automatic_Configure`:
- `0` (推薦): 快速創建 (自動從候鳥業務庫匹配指紋,不校驗代理)。
- `1`: 包含 IP 校驗,創建時間較長 (請求超時需設置 > 68s)。
### 7.2 更新基礎信息
POST /api/v1/session/update
包含 Session_Name, Session_Desc, Session_Group, Cookie (JSON 格式字符串) 等。
### 7.3 更新代理
POST /api/v1/session/proxy/update
[最大頻率:50 請求/分]
支持:HTTP, HTTPS, SSH, SOCKS4/5, Oxylabs, Luminati, smartproxy, noproxy。
### 7.4 刪除環境
POST /api/v1/session/delete
`Is_Delete_All: 1` 則全量清空。
## 8. Cookie 管理
### 8.1 導入 Cookie (路徑模式)
POST /api/v1/session/import-cookie
```json
{
"Session_ID": "session_id",
"Cookie_File": "C:\\cookies\\account1.txt"
}
```
支持 .txt (Netscape) 和 .json 格式。
### 8.2 導出 Cookie (到路徑)
POST /api/v1/session/export-cookie
使用 `Export_Cookie_File` 指定路徑。後綴為 .json 則導出為 JSON,否則為 Netscape。
## 9. 插件管理
- POST /api/v1/plugin/list (獲取帳號全量插件)
- POST /api/v1/session/id_plugin_list (獲取環境內插件)
- POST /api/v1/session/plugin_install (安裝插件)
- POST /api/v1/session/plugin_delete (刪除插件)
## 10. 自動化腳本管理
- POST /api/v1/session/id_script_list (查看環境腳本)
- POST /api/v1/session/id_script_add (從腳本庫分配)
- POST /api/v1/session/id_script_active (激活腳本)
---
## 11. 完整錯誤碼表
### CODE (請求層面)
0 成功;-1 登錄失敗;-105 代理校驗失敗;-106 時區異常;-108 分辨率錯誤。
### Status (開啟環境返回的狀態字段)
0 成功;-7 已在運行中;-22 Session_ID 未找到。
## 12. 附錄:合法值列表
### 12.1 SystemOS
Windows | iPhone | iPad | MacIntel | Android | Linux x86_64 等。
### 12.2 LanguageCode
zh-CN;zh;q=0.9 | en-US;en;q=0.9 | ja;q=0.9 | fr-FR;fr;q=0.9 等。
### 12.3 Session_Resolution
1920x1080 | 1440x900 | 1366x768 | 2560x1440 | 375x812 (iPhone X) 等。
## 13. 開發注意事項
1. **Session_ID 類型**:/start and /id_container 用 Array;/stop, /update, /proxy/update 用 String。
2. **Playwright context**:必須始終操作 `browser.contexts[0]`,不要使用 `new_context()`。
3. **Selenium**:使用 `debuggerAddress` ("IP:PORT"),不要使用 ws。
4. **併發**:單批次建議不超過 20 個環境。
5. **狀態檢查**:/start 後務必校驗 `data.listid[0].status`。
6. **代理校驗**:使用 /start 返回的 `Public_ip` 來驗證代理是否生效。
7. **合法值**:分辨率/語言/時區必須使用附錄中的合法值,否則會觸發 -106/-107/-108/-110 等錯誤。
## 14. 完整 Python 腳本模板
```python
"""
候鳥瀏覽器 + Playwright Python 自動化模板
"""
import requests, threading
from playwright.sync_api import sync_playwright
def start_env(session_id: str):
resp = requests.post("http://127.0.0.1:8186/api/v1/browser/start",
json={"Session_ID": [session_id]}).json()
return resp["data"]["listid"][0] if resp["code"] == 0 else None
def do_task(session_id):
env_data = start_env(session_id)
if not env_data: return
with sync_playwright().start() as pw:
# 通過 CDP 連接
browser = pw.chromium.connect_over_cdp(f"ws://127.0.0.1:{env_data['browser_CDP_Port']}/json/version")
context = browser.contexts[0] # 核心:取已有上下文
page = context.pages[0] if context.pages else context.new_page()
page.goto("https://example.com")
print(f"[{session_id}] 標題: {page.title()}")
browser.close()
requests.post("http://127.0.0.1:8186/api/v1/browser/stop", json={"Session_ID": session_id})
if __name__ == "__main__":
sids = ["yoursid1", "yoursid2"]
threads = [threading.Thread(target=do_task, args=(sid,)) for sid in sids]
for t in threads: t.start()
for t in threads: t.join()
```配置生效驗證
配置完成後,在 Chat 中輸入:
請用 Python + 候鳥 ApiServer,實現獲取分組「測試組」下的所有 ID,
並併發啟動 (最大 10 個),在每個環境中使用 Playwright 訪問 https://example.com,
截圖後關閉環境。要求包含完整的異常處理。若 AI 能正確做到以下幾點,則說明配置成功:
- ✅ 正確使用了
POST /api/v1/session/listid。 - ✅ /start 中
Session_ID使用了 Array。 - ✅ 正確使用了
browser.contexts[0]。 - ✅ /stop 中
Session_ID使用了 String。
