# 百家号 Python 后端 API 实现

## 概述

将百家号 Python 后端从浏览器自动化改为直接 HTTP API 调用，提升性能和可靠性。

## 修改内容

### 文件：`server/python/platforms/baijiahao.py`

#### 1. `get_account_info` 方法 - 获取账号信息

**修改前**：使用 Playwright 浏览器访问后台页面，通过 JavaScript 调用 API

**修改后**：使用 `aiohttp` 直接调用 HTTP API

**API 调用顺序**：
1. `https://baijiahao.baidu.com/builder/app/appinfo` - 获取账号基本信息
   - 账号名称、ID、头像、状态
2. `https://baijiahao.baidu.com/cms-ui/rights/growth/get_info` - 获取粉丝数（非关键）
3. `https://baijiahao.baidu.com/pcui/article/lists?start=0&count=1` - 获取作品总数（非关键）

**错误处理**：
- `errno === 0` 且有用户数据 = 成功
- `errno === 110` = 未登录，Cookie 失效
- `errno !== 0` = 其他错误，Cookie 可能失效

**性能提升**：
- 从 10-30 秒降低到 1-3 秒
- 不需要启动浏览器，节省内存

#### 2. `get_works` 方法 - 获取作品列表

**修改前**：使用 Playwright 浏览器访问内容管理页面，通过 JavaScript 调用 API

**修改后**：使用 `aiohttp` 直接调用 HTTP API

**API**：
- `https://baijiahao.baidu.com/pcui/article/lists?start={start}&count={page_size}&article_type=video`

**参数**：
- `start`: 起始位置（page * page_size）
- `count`: 每页数量
- `article_type=video`: 只获取视频类型

**返回数据**：
- 作品列表（标题、封面、发布时间、播放量、点赞数、评论数等）
- 总数（total）
- 是否有更多（has_more）

#### 3. `check_login_status` 方法 - 检查登录状态（新增）

**功能**：覆盖基类的浏览器检查方法，使用 API 检查

**API**：
- `https://baijiahao.baidu.com/builder/app/appinfo`

**判断逻辑**：
- `errno === 0` 且有用户数据且状态正常 = 登录有效
- `errno === 110` = 未登录
- `errno !== 0` = Cookie 失效

**返回格式**：
```python
{
    "success": True,
    "valid": True/False,      # Cookie 是否有效
    "need_login": False/True, # 是否需要重新登录
    "message": "状态描述"
}
```

## 技术细节

### 依赖库
- `aiohttp` - 异步 HTTP 客户端

### Cookie 处理
```python
# 解析 cookies
cookie_list = self.parse_cookies(cookies)
cookie_str = '; '.join([f"{c['name']}={c['value']}" for c in cookie_list])
```

### HTTP 请求头
```python
headers = {
    'Accept': 'application/json, text/plain, */*',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Cookie': cookie_str,
    'Referer': 'https://baijiahao.baidu.com/builder/rc/home'
}
```

### URL 处理
- 头像 URL 如果以 `//` 开头，需要添加 `https:` 前缀
- 封面 URL 同样需要处理

## 调用流程

### Node.js 后端刷新账号
1. `AccountService.refreshAccount()` 
2. 检查 `platformsSkipAI` 包含 `baijiahao`，跳过 AI 刷新
3. 调用 `HeadlessBrowserService.checkCookieValid()`
4. Python 服务可用时，调用 Python 的 `/check_login` 接口
5. Python 调用 `BaijiahaoPublisher.check_login_status()` - **使用 API**
6. 如果 Cookie 有效，调用 `HeadlessBrowserService.fetchAccountInfo()`
7. 检测到 `platform === 'baijiahao'`，调用 `fetchBaijiahaoAccountInfoDirectApi()` - **使用 API**

### Python 后端获取账号信息
1. 客户端调用 `/account_info` 接口
2. Python 调用 `BaijiahaoPublisher.get_account_info()` - **使用 API**
3. 返回账号信息

### Python 后端获取作品列表
1. 客户端调用 `/works` 接口
2. Python 调用 `BaijiahaoPublisher.get_works()` - **使用 API**
3. 返回作品列表

## 测试验证

### 1. 测试 Python 服务
```bash
# 启动 Python 服务
cd server/python
python app.py
```

### 2. 测试账号信息获取
```bash
curl -X POST http://localhost:5001/account_info \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "baijiahao",
    "cookie": "你的cookie字符串"
  }'
```

### 3. 测试作品列表获取
```bash
curl -X POST http://localhost:5001/works \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "baijiahao",
    "cookie": "你的cookie字符串",
    "page": 0,
    "page_size": 20
  }'
```

### 4. 测试登录状态检查
```bash
curl -X POST http://localhost:5001/check_login \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "baijiahao",
    "cookie": "你的cookie字符串"
  }'
```

### 5. 在客户端测试刷新
1. 打开账号管理页面
2. 找到百家号账号
3. 点击"刷新"按钮
4. 查看终端日志，应该看到：
   ```
   [refreshAccount] Platform: baijiahao, shouldUseAI: false
   [checkCookieValid] Checking cookie for baijiahao
   [baijiahao] 检查登录状态 (使用 API)
   [baijiahao] 调用 appinfo API 检查登录状态...
   [baijiahao] ✓ 登录状态有效: 账号名称
   [fetchAccountInfo] Using direct API for baijiahao
   [Baijiahao API] Fetching account info via direct API...
   [Baijiahao API] [1/3] 调用 appinfo API...
   [Baijiahao API] [2/3] 调用 growth/get_info API 获取粉丝数...
   [Baijiahao API] [3/3] 调用 article/lists API 获取作品数...
   [Baijiahao API] ✓ 获取成功: 账号名称 (粉丝: X, 作品: Y)
   ```

## 优势对比

| 特性 | 浏览器方式 | API 方式 |
|------|-----------|---------|
| 速度 | 10-30 秒 | 1-3 秒 |
| 内存占用 | 高（浏览器） | 低（HTTP 请求） |
| 可靠性 | 依赖页面结构 | 稳定的 API |
| 错误处理 | 复杂（截图分析） | 简单（errno 判断） |
| 维护成本 | 高（页面变化需更新） | 低（API 稳定） |

## 注意事项

1. **Cookie 格式**：支持 JSON 数组和字符串格式
2. **超时设置**：API 请求超时 30 秒（主要 API）、10 秒（非关键 API）
3. **错误处理**：非关键 API（粉丝数、作品数）失败不影响整体流程
4. **日志输出**：详细的步骤日志便于调试

## 相关文件

- `server/python/platforms/baijiahao.py` - Python 百家号实现
- `server/src/services/HeadlessBrowserService.ts` - Node.js 百家号 API 实现
- `server/src/services/AccountService.ts` - 账号刷新服务
- `docs/baijiahao-refresh-api.md` - Node.js API 实现文档
- `docs/baijiahao-cookie-validation.md` - Cookie 验证文档
