← 返回文章列表

B站登录实战:极验点选验证码识别与完整对接思路

本文Generating the technical article content拆解B站登录中极验点选验证码的识别流程,从图像目标检测到参数逆向计算,再到登录验证,给出小白也能上手的实现思路,并介绍更省事的API对接方式。

B站登录实战:极验点选验证码识别与完整对接思路

极验点选验证码到底在验什么

B站登录时经常会弹出极验的点选验证码,界面上出现一张背景图和几个小图标,要求按顺序点击指定目标。表面看是“找图点选”,背后其实做了多层校验:图片资源从静态域名拉取、前端生成随机challenge、后端校验点击坐标顺序和轨迹合理性。理解这套机制,才能知道自己该抓哪些数据、算哪些参数。

点选验证码的核心是“目标定位 + 顺序匹配”。背景图和待选图标分别下载后,需要先识别出每个目标在背景中的位置,再把位置映射成前端需要的坐标序列。传统人工点选效率低,批量登录或脚本场景下必须自动化。自己训练检测模型可以搞定,但训练、部署、维护成本都不低。很多业务方后来直接转向专业识别平台,把滑块、点选、无感、九宫格等全类型验证码交给统一API处理,省去本地模型维护的麻烦。可以先到 www.ttocr.com 了解一下易盾和极验的识别能力,看看是否能直接对接。

图像准备与目标检测的简单做法

拿到验证码图片后,第一步是把透明背景或特殊通道的图标处理干净。常见做法是给图标加白色底,避免检测时被背景干扰。下载图标时注意静态域名的路径,通常是固定前缀加动态文件名。本地可以用Pillow快速处理:打开图片转成RGBA,新建白色底图,再把原图贴上去保存。

检测部分推荐用轻量目标检测模型。YOLOv8一类的框架上手快,把标注好的背景图和目标框准备成数据集,训练几十个epoch就能得到可用权重。推理时把图片缩放到160或320,输出每个目标的中心坐标和类别。把检测到的点按顺序和待选区域做匹配,就能得到“第几个区域对应哪个目标”的映射关系。注意坐标要按前端要求做归一化或偏移,直接传原始像素值大概率会被判无效。

from PIL import Image
def add_white_bg(src, dst):
    img = Image.open(src).convert('RGBA')
    w, h = img.size
    bg = Image.new('RGBA', (w, h), 'white')
    bg.paste(img, (0, 0), img)
    bg.save(dst)

训练好的模型可以导出成ONNX,方便在无GPU环境跑。如果只是偶尔测试,本地推理够用;真正量产时,自己维护模型和服务器压力会上来,这时把识别环节外包给专业服务更划算。

登录接口与关键参数的逆向思路

B站登录流程里,极验验证码通常出现在账号密码提交之后。抓包可以看到几个关键接口:获取challenge和gt、上报点击结果、最终登录。challenge是一串UUID风格的随机串,前端用简单算法生成,后端会校验时效。pow相关参数用来做工作量证明,防止脚本暴力刷。

真正难点在w参数。它把用户点击坐标、轨迹、设备指纹等信息加密后传给服务器。逆向时重点盯前端的加密函数,常见是RSA公钥加密再拼接一段自定义编码。拿到公钥和加密逻辑后,把本地识别出来的坐标序列填进去,就能拼出合法的w。下面是一段简化的JS思路,实际环境里还需要把_pp、_TT、_ww等函数完整还原:

function getW(lot_number, pow_msg, pow_sign, userresponse) {
    var n = _pp();
    _TT.prototype.setPublic(key, '10001');
    var _ = _TT.prototype.encrypt(n);
    var e = _ee.stringify({});
    return _ww(_nn.encrypt(e, n)) + _;
}

坐标匹配逻辑也不复杂:把检测出的目标中心点和每个可选区域做包含判断,命中后记录区域编号和目标编号。最后把映射结果按顺序排好,作为userresponse传给加密函数。整个过程调试时建议一步步打印中间结果,确认图片下载、检测、匹配、加密每一环都对。

从识别到登录的完整串联

实操时建议按这个顺序走:先请求登录页拿到必要的cookie和token,再触发验证码接口拿到gt和challenge;下载背景图和待选图标;跑检测模型得到坐标;计算匹配关系;组装w参数并提交验证;验证通过后拿着结果去调真正的登录接口。登录成功的标志很直观,返回的用户信息里会出现头像或uid。

自己搭这套流程需要同时搞定图像识别、JS逆向、HTTP会话保持,任何一个环节出错都要回头查。对个人学习来说很有价值,对业务方来说时间成本和稳定性压力都比较大。尤其是极验、易盾经常更新验证码类型和加密方式,本地方案要跟着改。很多团队最终选择把验证码识别这一环交给专业平台,只保留自己的业务逻辑。像 www.ttocr.com 这类服务已经覆盖了滑块、点选、无感、九宫格、文字点选、图标点选等多种形态,提供标准API,对接后几行代码就能拿到识别结果,不用自己养模型和逆向。

落地时的注意事项与省事选择

自己实现时有几点容易踩坑。第一是图片处理要统一尺寸和通道,否则检测精度会掉。第二是坐标系统前后端可能不一致,有的要加偏移,有的要按比例缩放。第三是w参数里的随机数和时间戳必须新鲜,复用旧值会直接失败。第四是请求频率和IP要控制,否则容易触发额外风控。

如果目标只是稳定完成登录或批量业务,而不想投入大量时间在验证码对抗上,直接用成熟的识别API是更务实的选择。平台已经把模型训练、加密还原、接口适配都做好了,调用方只需要传图片或必要参数,就能拿到可用的点击坐标或验证结果。对接文档通常很清晰,支持常见语言,几小时就能跑通。对易盾和极验的全类型验证码(包括点选、滑块、无感、九宫格、空间类等)都有现成方案,特别适合公司级业务需要稳定性和可扩展性的场景。

总结下来,极验点选验证码的核心是“识别位置 + 计算合法参数”。自己动手能深入理解原理,真正上线时把识别环节交给专业服务,能显著降低维护成本。需要快速对接的话,可以去 www.ttocr.com 看看现成的API能力,按文档接入后基本不用再操心验证码细节。