薅Doubao羊毛技術(shù)交流
發(fā)布日期:2026/2/28 5:51:57 瀏覽量:
# 豆包集成原理與測(cè)試指南
## 一、豆包方案原理
### 1. 兩種方案對(duì)比(優(yōu)先使用 doubao-proxy)
| 方案 | 推薦度 | 說(shuō)明 |
|------|--------|------|
| **doubao-proxy** | ★ 推薦 | 使用 [doubao-free-api](https://github.com/linuxhsj/doubao-free-api) 本地代理,對(duì)外提供 OpenAI 兼容接口,更穩(wěn)定、易調(diào)試 |
| **doubao-web** | 直連備選 | 直接請(qǐng)求豆包網(wǎng)頁(yè) API,無(wú)額外依賴,但 SSE 格式易變,需維護(hù)解析邏輯 |
**doubao-proxy 使用方式**:本地運(yùn)行 doubao-free-api 代理(默認(rèn) `http://127.0.0.1:8000`),OpenClaw 通過(guò) `Authorization: Bearer` 調(diào)用其 OpenAI 兼容的 `/v1/chat/completions` 接口。
### 2. 總體架構(gòu)
豆包集成使用**網(wǎng)頁(yè)端 Cookie 認(rèn)證**,不依賴官方 API Key。原理是:
```
瀏覽器登錄豆包 → 捕獲 Cookie(sessionid、ttwid 等)→
doubao-proxy:傳給本地代理,代理內(nèi)部用 Cookie 調(diào)用豆包 API
doubao-web:直接用 Cookie 冒充網(wǎng)頁(yè)請(qǐng)求 → 調(diào)用豆包內(nèi)部 API
```
### 3. 技術(shù)細(xì)節(jié)
| 環(huán)節(jié) | doubao-proxy | doubao-web |
|------|--------------|------------|
| **API 端點(diǎn)** | 本地代理 `/v1/chat/completions`(OpenAI 兼容) | `https://www.doubao.com/samantha/chat/completion` |
| **認(rèn)證方式** | Bearer Token(sessionid) | Cookie(sessionid、ttwid) |
| **請(qǐng)求/響應(yīng)** | 標(biāo)準(zhǔn) OpenAI 格式 | 豆包自定義 SSE(`event_type` 2001/2003 等) |
### 4. 數(shù)據(jù)流(Web UI 發(fā)消息時(shí))
**doubao-proxy 流程**:
```
Web UI → chat.send → runEmbeddedAttempt → authStorage.getApiKey("doubao-proxy")
→ OpenAI 兼容 fetch(baseUrl/v1/chat/completions, Bearer sessionid)
→ 本地代理轉(zhuǎn)發(fā)到豆包 API → 標(biāo)準(zhǔn) SSE 流 → Web UI
```
**doubao-web 流程**:
```
Web UI → chat.send → runEmbeddedAttempt → authStorage.getApiKey("doubao-web")
→ createDoubaoWebStreamFn(cookie) → DoubaoWebClient.chatCompletions(stream: true)
→ fetch 豆包 API → 解析自定義 SSE → 推 text_delta → Web UI
```
### 5. 關(guān)鍵路徑
- **認(rèn)證存儲(chǔ)**:`~/.openclaw/agents//auth-profiles.json` 中 `doubao-proxy:default` 或 `doubao-web:default`
- **配置**:`openclaw.json` 中 `agents.defaults.model.primary` 為 `doubao-proxy/doubao` 或 `doubao-web/doubao-seed-2.0`
- **狀態(tài)目錄**:默認(rèn) `~/.openclaw`;若項(xiàng)目?jī)?nèi)有 `.openclaw-state`,則用項(xiàng)目?jī)?nèi)目錄
---
## 二、使用當(dāng)前項(xiàng)目(非系統(tǒng) openclaw)
### 方式 A:項(xiàng)目?jī)?nèi)獨(dú)立狀態(tài)(推薦)
在項(xiàng)目根目錄創(chuàng)建 `.openclaw-state`,之后用 `pnpm run openclaw` 時(shí)會(huì)自動(dòng)使用該目錄:
```bash
cd /path/to/openclawWeComzh # 替換為實(shí)際項(xiàng)目路徑
# 1. 創(chuàng)建項(xiàng)目本地狀態(tài)目錄
mkdir -p .openclaw-state
# 2. 之后 pnpm run openclaw 會(huì)自動(dòng)使用 .openclaw-state(run-node.mjs 會(huì)檢測(cè))
```
### 方式 B:顯式指定環(huán)境變量
```bash
cd /path/to/openclawWeComzh # 替換為實(shí)際項(xiàng)目路徑
# 使用項(xiàng)目目錄下的狀態(tài)
export OPENCLAW_STATE_DIR="$(pwd)/.openclaw-state"
pnpm run openclaw onboard
```
---
## 三、分步測(cè)試流程
### 步驟 0:準(zhǔn)備環(huán)境
```bash
cd /path/to/openclawWeComzh # 替換為實(shí)際項(xiàng)目路徑
# 確保依賴已安裝
pnpm install
# 確保已構(gòu)建(首次或改代碼后)
pnpm build
```
### 步驟 1:創(chuàng)建項(xiàng)目本地狀態(tài)目錄
```bash
mkdir -p .openclaw-state
```
(可選:想完全隔離時(shí),可清空 `rm -rf .openclaw-state/*`)
### 步驟 2:運(yùn)行 onboard,配置豆包
```bash
pnpm run openclaw onboard
```
在交互中:
1. 選擇 **模型提供者** → 選 **豆包 (Doubao)**
2. 選擇 **豆包方案**:
- **doubao-proxy**(推薦):需本地運(yùn)行 [doubao-free-api](https://github.com/linuxhsj/doubao-free-api),然后輸入代理 baseUrl(默認(rèn) `http://127.0.0.1:8000`)和 sessionid
- **doubao-web**:直連豆包網(wǎng)頁(yè) API
**若選 doubao-proxy**:
- 先啟動(dòng) doubao-free-api 代理(Docker: `linuxhsj/doubao-free-api:latest`,或見(jiàn) [linuxhsj/doubao-free-api](https://github.com/linuxhsj/doubao-free-api) README)
- 在 onboard 中填寫 baseUrl(如 `http://127.0.0.1:8000`)和 sessionid
- 認(rèn)證存為 `DOUBAO_PROXY_SESSIONID` 或 `auth-profiles.json` 中 `doubao-proxy:default`
**若選 doubao-web**:
- **自動(dòng)登錄**:會(huì)啟動(dòng) Chrome,打開豆包頁(yè)面,掃碼登錄后腳本自動(dòng)捕獲 Cookie
- **使用現(xiàn)有 Chrome**:需先以調(diào)試模式啟動(dòng) Chrome:
```bash
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
```
然后在 Chrome 中登錄 https://www.doubao.com/chat/,再在 onboard 中選「使用現(xiàn)有 Chrome」
- **手動(dòng)粘貼**:在瀏覽器 DevTools → Application → Cookies 中復(fù)制 `sessionid` 和 `ttwid` 粘貼進(jìn)去
### 步驟 3:驗(yàn)證認(rèn)證是否寫入
```bash
# 查看 auth-profiles(路徑取決于你的 agentId,通常為 main)
cat .openclaw-state/agents/main/agent/auth-profiles.json | head -80
```
應(yīng)能看到 `doubao-proxy:default` 或 `doubao-web:default` 以及對(duì)應(yīng)的 credential。
### 步驟 4:確認(rèn)默認(rèn)模型為豆包
```bash
cat .openclaw-state/openclaw.json
```
檢查 `agents.defaults.model.primary`:
- doubao-proxy:應(yīng)為 `doubao-proxy/doubao`
- doubao-web:應(yīng)為 `doubao-web/doubao-seed-2.0`
### 步驟 5:?jiǎn)为?dú)測(cè)試豆包 API(繞過(guò) OpenClaw 流程)
**doubao-proxy**:用 curl 測(cè)試代理是否正常:
```bash
curl -N -X POST "http://127.0.0.1:8000/v1/chat/completions" \
-H "Authorization: Bearer <你的sessionid>" \
-H "Content-Type: application/json" \
-d ’{"model":"doubao","messages":[{"role":"user","content":"你好"}],"stream":true}’
```
**doubao-web**:修改 `test-doubao-integration.js` 中的 `TEST_AUTH`,填入 sessionid 等,然后:
```bash
node test-doubao-integration.js
```
若能正常返回流式內(nèi)容,說(shuō)明 API 與認(rèn)證沒(méi)問(wèn)題,問(wèn)題在 OpenClaw 內(nèi)部流程。
### 步驟 6:?jiǎn)?dòng) Gateway 和 Web UI
```bash
pnpm run gateway:dev
```
控制臺(tái)會(huì)打印端口(通常 19001),在瀏覽器打開對(duì)應(yīng)地址(如 `http://localhost:19001`)。
### 步驟 7:在 Web UI 中測(cè)試
1. 新建或選擇一個(gè) session
2. 確認(rèn)當(dāng)前模型為豆包(模型選擇器中選擇 Doubao-Seed 2.0 等)
3. 發(fā)送一條簡(jiǎn)單消息,如「你好」
### 步驟 8:查看日志排查問(wèn)題
發(fā)消息時(shí)觀察運(yùn)行 `gateway:dev` 的終端輸出,關(guān)注:
- `[DoubaoWebStream] Auth options keys: ...` —— 是否有 `sessionid` 等
- `[DoubaoWebClient] 發(fā)送請(qǐng)求到: ...` —— 請(qǐng)求是否發(fā)出
- `[DoubaoWebClient] 收到 N 個(gè) SSE 事件但未解析出文本` —— 若出現(xiàn),說(shuō)明豆包返回格式與解析邏輯不匹配
- 任何 `Error` 或 `?` —— 具體錯(cuò)誤信息
---
## 四、常見(jiàn)失敗原因
| 現(xiàn)象 | 可能原因 | 處理建議 |
|------|----------|----------|
| Web UI 無(wú)任何回復(fù) | 1. 認(rèn)證未配置或 sessionid 失效
2. 模型未選豆包
3. doubao-proxy:代理未啟動(dòng)或 baseUrl 錯(cuò)誤 | 重新 onboard、確認(rèn)模型、檢查 doubao-proxy 是否運(yùn)行 |
2. 模型未選豆包
3. doubao-proxy:代理未啟動(dòng)或 baseUrl 錯(cuò)誤 | 重新 onboard、確認(rèn)模型、檢查 doubao-proxy 是否運(yùn)行 |
| `No API key found for doubao-web` / `doubao-proxy` | auth-profiles 中無(wú)豆包配置 | 重新運(yùn)行 onboard 并選對(duì)應(yīng)方案 |
| doubao-proxy 連接失敗 | 代理未啟動(dòng)或 baseUrl 配置錯(cuò)誤 | 確認(rèn) doubao-free-api 在運(yùn)行,檢查 `openclaw.json` 中 baseUrl |
| `收到 N 個(gè) SSE 事件但未解析出文本` | 僅 doubao-web:豆包 SSE 格式與解析邏輯不符 | 需更新 `doubao-web-client.ts`;或改用 doubao-proxy |
| `710022004` 或 rate limit | 豆包限流 | 等待 1–2 小時(shí)后再試 |
| 運(yùn)行的是系統(tǒng) openclaw | 使用了全局安裝的 openclaw | 用 `pnpm run openclaw` 且確保有 `.openclaw-state` 或設(shè)置 `OPENCLAW_STATE_DIR` |
---
## 五、狀態(tài)目錄說(shuō)明
- **默認(rèn)**:`~/.openclaw`(與系統(tǒng)全局 openclaw 共用)
- **項(xiàng)目?jī)?nèi)**:項(xiàng)目根目錄有 `.openclaw-state` 時(shí),`run-node.mjs` 會(huì)設(shè)置 `OPENCLAW_STATE_DIR`,此時(shí)配置和會(huì)話都保存在 `.openclaw-state/` 下
如果你之前用系統(tǒng) openclaw 配過(guò)豆包,而當(dāng)前用項(xiàng)目運(yùn)行,需要:
- 要么在項(xiàng)目?jī)?nèi)重新 onboard(使用 `.openclaw-state`)
- 要么把 `~/.openclaw/agents/main/agent/auth-profiles.json` 中豆包相關(guān)條目復(fù)制到 `.openclaw-state/agents/main/agent/auth-profiles.json`
僅限技術(shù)交流,如有侵權(quán)請(qǐng)聯(lián)系刪除
馬上咨詢: 如果您有業(yè)務(wù)方面的問(wèn)題或者需求,歡迎您咨詢!我們帶來(lái)的不僅僅是技術(shù),還有行業(yè)經(jīng)驗(yàn)積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生