不可行——因滑动拼图验证需真实浏览器环境完成人机交互,requests等http客户端无法触发或通过验证;必须用playwright/selenium模拟浏览器登录并人工/自动过验,再复用有效cookie调用弹幕接口。

直接抓取需要滑动拼图验证的 Bilibili 弹幕数据,在 Python3 中不可行——因为滑动拼图(如极验 Geetest)是服务端主动发起的交互式人机挑战,requests 或 httpx 这类无头 HTTP 客户端无法完成验证,更无法绕过。
为什么不能用 requests + 解析接口的方式直接拿弹幕?
Bilibili 的弹幕接口(如 https://api.bilibili.com/x/v1/dm/list.so?oid=xxx)本身不校验滑动拼图,但前提是:你得先拿到合法的 cookie,且该 cookie 必须通过登录+人机验证(包括滑动拼图)后生成。未通过验证的登录态,请求弹幕接口会返回 412 Precondition Failed 或 {"code":-111,"message":"csrf" 类错误;即使伪造了部分 cookie,也会被服务端用行为指纹(如 buvid3、SESSDATA 有效期、设备特征)拦截。
真实可行的路径只有 Puppeteer / Playwright / Selenium + 手动/自动过验
必须模拟真实浏览器环境,触发并完成滑动拼图流程,才能拿到带有效凭证的页面上下文。注意:目前没有稳定、通用、免维护的 Python 自动识别滑动拼图方案(OpenCV 匹配缺口位置在新版极验中极易失效;深度模型需持续更新样本且部署成本高)。实际操作中建议:
- 优先使用
playwright(比 Selenium 更轻、兼容性更好),启动 Chromium 并启用headless=False人工辅助过验一次,后续复用登录态 - 过验成功后,从浏览器上下文中提取
document.cookie或直接用context.cookies()获取完整 cookie 字典 - 将该 cookie 注入到
requests请求中,再调用弹幕接口:https://api.bilibili.com/x/v1/dm/list.so?oid=123456789 - 注意
SESSDATA有效期通常为 30 天,但若检测到异常行为(如频繁换 IP、无鼠标轨迹),可能提前失效
绕过验证的常见失败尝试及原因
很多人试图跳过浏览器自动化,改走“逆向接口+伪造参数”路线,结果几乎全部失败。典型误区:
- 以为只要带上
Cookie: SESSDATA=xxx就能调通弹幕接口 —— 实际还需bili_jct(用于 CSRF)、buvid3(设备指纹),三者缺一不可 - 用 Fiddler/Charles 抓包得到的请求,复制到 Python 中执行失败 —— 因为抓包时浏览器已内置了 WebCrypto API 签名、时间戳动态参数(如
ts)、以及sign字段,这些在 Python 中需完整复现 JS 逻辑(Bilibili 使用自研加密,非标准 HmacSHA256) - 用
selenium启动 Chrome 但未禁用自动化特征(如webdriver属性、navigator.permissions检测)—— 页面 JS 会立即返回412或跳转验证页
真正稳定的方案永远依赖真实浏览器上下文;所谓“全自动过验”在 Bilibili 当前反爬强度下,不是不可做,而是维护成本远高于人工过验一次+长期复用 cookie。别在缺口识别上死磕 OpenCV,先确保你能拿到一个干净、带完整凭证的 Playwright context。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











