技术声明:本文内容仅用于技术研究和学习交流。任何数据请求行为都应遵循目标网站的robots.txt协议及服务条款。
Part 1: 协议逆向分析
1. 问题背景
在开发光遇每日任务推送插件时,遇到了一个棘手的问题:原有方案依赖用户手动填写微博Cookie(SUB和XSRF-TOKEN),这带来了两个痛点:
- 用户体验差:普通用户不知道如何从浏览器中提取Cookie
- 维护成本高:Cookie有效期较短,需要频繁更新
直接请求微博API(如/api/container/getIndex)会返回 432,这表明即使是"访客"状态,服务端也有严格的会话管理机制。
技术目标:逆向微博H5访客鉴权协议,实现自动化获取临时访客凭证,让插件无需用户提供Cookie即可访问微博数据。
2. 协议分析:三阶段鉴权链路
通过Edge DevTools抓包分析,清除Cookie前后对比,确认了微博H5的访客鉴权是一个跨域交互的三阶段闭环。
2.1 鉴权架构图
2.2 阶段一:身份凭证颁发
Endpoint: POST https://visitor.passport.weibo.cn/visitor/genvisitor2
关键参数:
技术难点:
- JSONP响应解析:返回格式为
visitor_gray_callback({...})而非标准JSON,需要正则提取 - 手动Cookie注入:服务器不通过Set-Cookie下发SUB,需要从响应payload中提取并手动写入CookieJar
核心代码:
2.3 阶段二:会话初始化
Endpoint: GET https://m.weibo.cn/
功能:携带SUB访问主站,激活会话并获取XSRF-TOKEN
关键点:
- 必须携带阶段一获取的SUB Cookie
- 服务器通过Set-Cookie响应头下发XSRF-TOKEN
- XSRF-TOKEN是会话级别的短期令牌
2.4 阶段三:受保护资源访问
安全机制:Double Submit Cookie模式防御CSRF
客户端要求:
- Cookie层面:携带SUB和XSRF-TOKEN
- Header层面:将XSRF-TOKEN的值写入
x-xsrf-token请求头
服务端校验:
3. PoC实现
完整的概念验证代码:
Part 2: 工程实践 - 集成到AstrBot插件
4. 实战挑战
将PoC集成到生产环境时,面临以下挑战:
- API差异:移动端API与PC端API响应格式不同
- 性能优化:避免重复认证,复用session
- 错误处理:网络异常、认证失效的fallback机制
- 数据适配:HTML标签清理、换行符保留
5. 架构设计
5.1 双方案架构
设计了一个智能fallback机制:
工作流程:
- 优先使用用户配置的Cookie(PC端API)
- 如果Cookie未配置或失效,自动切换到无Cookie方案(移动端API)
5.2 Spider类重构
6. 关键技术点
6.1 API响应差异适配
PC端API (/ajax/statuses/mymblog):
移动端API (/api/container/getIndex):
适配方案:
6.2 长文本获取优化
移动端API返回的文本会被截断,需要调用长文本API:
6.3 性能优化:Session复用
问题:每个数据源都需要访客认证,导致请求次数过多
优化前(2个数据源):
- 数据源1:认证1次 + 列表1次 + 长文本认证1次 + 长文本1次 = 4次
- 数据源2:认证1次 + 列表1次 + 长文本认证1次 + 长文本1次 = 4次
- 总计:8次请求,4次认证
优化方案:
优化后(2个数据源):
- 数据源1:认证1次 + 列表1次 + 长文本1次(复用client)= 3次
- 数据源2:认证1次 + 列表1次 + 长文本1次(复用client)= 3次
- 总计:6次请求,2次认证
6.4 正则表达式适配
问题:移动端API清理HTML后,超话标签格式变化导致正则匹配失败
原始HTML:
清理后:
解决方案:修改正则表达式,从依赖特定格式改为关键词匹配
7. 配置设计
工作逻辑:
cookies.enabled = true且填写了cookie → 使用PC端APIcookies.enabled = false或cookie为空 → 自动使用无Cookie方案
8. 错误处理
9. 实战效果
优化前:
- 用户需要手动填写Cookie
- Cookie过期后插件失效
- 只支持PC端API
优化后:
- 零配置即可使用
- 自动获取临时访客凭证
- 双方案自动切换
- 性能提升25%(减少2次认证请求)
日志示例:
总结
关键要点
- JSONP响应处理:使用正则提取JSON,手动注入Cookie
- Double Submit CSRF:从Cookie读取token并写入Header
- Session复用:避免重复认证,减少网络请求
- HTML清理:保留换行符,提升文本可读性
- 错误处理:实现重试机制和graceful degradation
适用场景
本方案适用于:
- 需要访问微博公开数据的自动化工具
- 不希望用户手动提供Cookie的应用
- 需要长期稳定运行的爬虫服务
注意事项
- 遵守协议:严格遵守robots.txt和服务条款
- 频率控制:避免高频请求触发风控
- User-Agent:使用真实浏览器指纹
- 错误处理:做好异常捕获和降级方案
参考资料
项目地址:GitHub - Sky Daily Plugin
本文完整代码已开源,欢迎Star和PR。如有问题,请提Issue讨论。