# 百家号 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 验证文档