破解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/公司關鍵詞