某网站的极验验证码实战
文章目录
字符型验证码
SimGAN-Captcha代码阅读与复现 关于SimGAN-Captcha的扩展实验 全都得死:GAN掉字符验证码
小试牛刀
先尝试模拟,使用 puppteer 稍加计算就能成功绕过极验
请求依次为
- POST https://passport.bilibili.com/x/passport-login/sms/send 设备信息为 body,返回 recaptcha_url 随即向其发起请求,注意该 url 中的 gt 和 challenge 将用于后续一系列请求
- GET https://www.bilibili.com/h5/project-msg-auth/verify?ct=geetest&recaptcha_token=&gee_gt=&gee_challenge=&hash= 即向之前获得的 recaptcha_url 发送 GET 请求跳转到页面
- GET https://api.geetest.com/gettype.php?gt=&callback=geetest_{13位毫秒时间戳} 返回一些配置参数如静态js文件的位置(即相对路径)
- GET https://api.geetest.com/get.php?gt=&challenge=&lang=zh-cn&pt=3&client_type=web_mobile&w={一长串}&callback= 仍然返回一些配置如验证开始前显示的i18n字符串
- GET https://api.geetest.com/ajax.php?gt=&challenge=&lang=zh-cn&pt=3&client_type=web_mobile&w=&callback= 第一次请求 ajax.php,返回
callback值({"status": "success", "data": {"result": "slide"}})
- GET https://api.geetest.com/get.php 此时刚加载了 slide.js,和第一次请求 get.php 相比多了一些 params 如
is_next=true&type=slide3
,返回结果中有滑块验证时会显示的i18n字符串,以及滑块和图片的位置 - GET https://api.geetest.com/ajax.php?gt=&challenge=&lang=zh-cn&%24_BBF=3&client_type=web_mobile&w=&callback= 最终的请求,返回 success 及 score
工程化探索
将验证码填充作为通用服务运行,让爬虫客户端无感绕过验证码,考虑在客户端和服务端(比如 puppeteer)之间使用 RPC,客户端先调起服务端,服务端进入验证码流程,但将所有请求拦截并通过 RPC 传递给客户端,客户端代为请求,响应结果作为 RPC 的返回值,服务端再强行将其作为响应,继续之后的动作,从而在验证方看来客户端正常完成了验证。
真正开发过程中,很多时间浪费在了数据类型造成的错误中,在 proto 中我把除状态码外的所有字段定为 string,但用 axios 等库发起请求时,header 为 object,且若不在请求时指定 responseType,所获响应默认用 json 解析成 object,否则才是 text。更坑的是图片等二进制数据,获得为文本时已经铸成大错,需要先指定 responseType 为 arraybuffer
(在 Node 中 blob
实际还是以文本返回,因为 blob
是 browser only),然后 res.data.toString('base64')
转成 base64 字符串通过 RPC 传递,接收方再 Buffer.from(str, 'base64')
来转成 buffer。
评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue 。