baijiahao-python-api-implementation.md 6.2 KB

百家号 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 失效

返回格式

{
    "success": True,
    "valid": True/False,      # Cookie 是否有效
    "need_login": False/True, # 是否需要重新登录
    "message": "状态描述"
}

技术细节

依赖库

  • aiohttp - 异步 HTTP 客户端

Cookie 处理

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

HTTP 请求头

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 服务

# 启动 Python 服务
cd server/python
python app.py

2. 测试账号信息获取

curl -X POST http://localhost:5001/account_info \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "baijiahao",
    "cookie": "你的cookie字符串"
  }'

3. 测试作品列表获取

curl -X POST http://localhost:5001/works \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "baijiahao",
    "cookie": "你的cookie字符串",
    "page": 0,
    "page_size": 20
  }'

4. 测试登录状态检查

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 验证文档