破解geetest offline的尝试
最近由于有须要对爬取的非上市公司进行一个验证,而绝大多数的非上市公司又都是小微企业,比起爬企业征信系统来讲,仍是小微企业名录更方便一点node
基于node.js axios全程破解 无需下载图片 无需模拟轨迹,offline模式就是任性python
首先咱们跟着正常获取数据的流程走一遍ios
能够看到大概有这几个请求git
http://xwqy.gsxt.gov.cn/security/verify_ip http://xwqy.gsxt.gov.cn/security/verify_keyword http://xwqy.gsxt.gov.cn/pc-geetest/register?t=1516872325770
查看一下response(固然你熟悉geetest也行)就会发现register就是geetest的初始化请求啦 github
返回值以下npm
challenge:"a1d0c6e83f027327d8461063f4ac58a61c" gt:"6146190e4171da316dbb5bcc076e2607" success:0
其中你能够发现success基本都是0 也就是说离线模式axios
基本就是geetest不参与判断的一个状态,验证部分都在前台和中间服务器完成api
回去看以前系统下载的js 会发现两个geetest提供的js服务器
这几个源文件也提供在项目中了restful
发送了一个新的验证请求
http://xwqy.gsxt.gov.cn/pc-geetest/validate request以下: geetest_challenge:a1d0c6e83f027327d8461063f4ac58a61c geetest_validate:010886ec_0084e_10100077776e geetest_seccode:010886ec_0084e_10100077776e|jordan
既然是offline 那就分析offline.js呗
查看代码就能看到这句
return c >= f - 3 && c <= f + 3 ? { success: !0, message: "success", validate: b.A(c, e.d.challenge) + "_" + b.A(a.b("rand0", e.c), e.d.challenge) + "_" + b.A(a.b("rand1", e.c), e.d.challenge), score: Math.round(d / 200) } : {success: 0, message: "fail"}
这不就是咱们要的么!
validate: b.A(c, e.d.challenge) + "_" + b.A(a.b("rand0", e.c), e.d.challenge) + "_" + b.A(a.b("rand1", e.c), e.d.challenge),
offline.6.0.0.js和offline.5.0.0.js能够看出同样是经过密钥 rand rand1进行加密获取一个值,一半来讲这种方案就是得依靠收集案例倒推,可是咱们是不会重复造轮子的
github关键词一搜就能发现已经有人整理好了'https://github.com/9468305/python-script/blob/master/geetest_offline/util.py'
因此那就用呗
后续就只是涉及到爬虫以及页面跳转的问题了,具体能够看util内的代码
并且在micro_lib内也能够直接搜索 发送验证的地址改成http://xwqy.gsxt.gov.cn/mirco...
并相应修改传入的值便可
organId:100000 textfield:encode后的关键词 fwId:1400 searchOrganId: channelId:99 captcha: geetest_challenge:3ef815416f775098fe977004015c619332 geetest_validate:010886ec_0084e_10100077776e geetest_seccode:010886ec_0084e_10100077776e|jordan
npm install npm run start curl http://127.0.0.1:4001/公司关键词