其實16年后幾個月算法就已經較大幅度改變了,只是無驗證碼情況下,我上篇文章15年的老算法仍然可以用,首先說下,我后面提交的某些參數是不必要的,尤其是一些直接寫成常量的參數,抓包直接copy過來的,具體沒篩選。
http://xui.ptlogin2.qq.com/cgi-bin/xlogin。。。
訪問這個地址能從cookies里取得pt_login_sig,后面check時會有一個參數與之對應,這個login_sig早就有了,有無皆可,至少我一直沒用到過,
進入正題,先說無需驗證碼的,老規矩從check開始,
URL_CHECK = 'http://check.ptlogin2.qq.com/check' +\ '?regmaster=' +\ '&pt_tea=2' +\ '&pt_vcode=1' +\ '&uin=%s' % UID +\ '&appid=%s' % APPID +\ '&js_ver=10188' +\ '&js_type=1' +\ '&login_sig=%s' % login_sig +\ '&r=0.14723663520999253' +\ 'u1=http://qzs.qq.com/qzone/v5/loginsucc.html?para=izone' +\ 'pt_uistyle=40';
采用新算法時pt_tea必須為2,pt_vcode沒做過多測試,反正目前我填幾都木影響,其他參數木啥好說的。
ptui_checkVC('0','!TPX','\x39\x37\x35\x10\x4a\x1f\x20\x2d','6f5d1367563ef5429b0585cb305087bcbb176cddf9b51dfafe8c3e3bc0f15ffc466996e04ccd6e1f14f2809ad3d5cbda78f697de2876156e','3');
字段一pt_vcode_v1,0代表不需要驗證碼,1代表需要,字段二就是驗證碼,字段三是pt_uin,密碼加密時需要,第四個字段是pt_verifysession_v1,登錄時要用,最后字段是pt_randsalt,用qq號登錄時是2,用郵箱是3,手機我沒測試。
然后就可以登錄了,
URL_LOGIN = 'http://ptlogin2.qq.com/login' +\ '?u=%s' % UID +\ '&verifycode=%s' % VCODE +\ '&pt_vcode_v1=%s' % PT_VCODE_V1 +\ '&pt_verifysession_v1=%s' % PT_VERIFYSESSION_V1 +\ '&p=%s' % P +\ '&pt_randsalt=%s' % PT_RANDSALT+\ '&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone' +\ '&ptredirect=0' +\ '&h=1' +\ '&t=1' +\ '&g=1' +\ '&from_ui=1' +\ '&ptlang=2052' +\ '&action=3-21-1482653919209' +\ '&js_ver=10188' +\ '&js_type=1' +\ '&login_sig=%s' % LOGIN_SIG +\ '&pt_uistyle=40' +\ '&aid=549000912' +\ '&daid=5';
VCODE就是之前返回的驗證碼,其他都懂的,login_sig寫不寫隨意。
=============================================================================================
再來說說需要驗證碼的登錄流程,稍微麻煩點:
首先還是check,
ptui_checkVC('1','5JoPkMMc6KxpJ8H0jkMhKHJ9_IJNzqQCOuTJ7oAYNh7l4KruqQswfQ**','\x00\x00\x00\x00\x4f\xa7\xac\x11','','2');
這次需要驗證碼才能登錄,所以pt_vcode_v1變成1,字段二不同了哦,它叫cap_cd,后面獲取驗證碼時要用到,字段三還是pt_uin不變,字段四pt_verifysession_v1這次為空,后面才能得到,pt_randsalt意義相同。
之后我們先要取得vsig參數:
URL = 'http://captcha.qq.com/cap_union_new_show' +\ '?aid=%s' % APPID +\ '&asig=&captype=&protocol=http&clientype=2&disturblevel=&apptype=2&curenv=inner&noBorder=noborder&showtype=embed' +\ '&uid=%s' % UID +\ '&cap_cd=%s' % CAP_CD +\ '&lang=2052';
APPID都知道吧,亂寫也行,UID無須解釋,CAP_CD就是之前check時返回的,之后會返回一個html,里面會有一大串字符,非常顯眼,
類似gRSMPwMX2Qhy9U03oFBkR23PLvQ_fGVKhXb80RWDhKHDQJCC2J7JZJh9YHAAkDSDKdDnJJiIon3-ny3JmmTfRqOSBHx62pVx4LlBhH1AIN52Jr9Ev8C57TA**,直接摳出來就行了。
有了cap_cd和vsig就能取回驗證碼了。
URL = 'http://captcha.qq.com/cap_union_new_getcapbysig?' +\ 'aid=%s' % APPID +\ '&asig=&captype=&protocol=http&clientype=2&disturblevel=&apptype=2&curenv=inner&noBorder=noborder&showtype=embed' +\ '&uid=%s' % UID +\ '&cap_cd=%s' % CAP_CD +\ '&lang=2052&rnd=7440&rand=0.8917365573600687' +\ '&vsig=%s' % VSIG +\ '&ischartype=1';
一目了然,但返回的圖片里的驗證碼並不是最后登錄時提交的驗證碼,正式登錄前還需要一個步驟取得必要的數據,
URL_VERIFY = 'http://captcha.qq.com/cap_union_new_verify?random=1482310265526'; postdata = { 'aid': APPID, 'asig': '', 'captype': '', 'protocol': 'http', 'clientype': 2, 'disturblevel': '', 'apptype': 2, 'curenv': 'inner', 'noBorder': 'noborder', 'showtype': 'embed', 'uid': UID, 'cap_cd': checkinfo['cap_cd'], 'lang': 2052, 'subcapclass': 0, 'collect' : '', 'vsig': VSIG, 'cdata': 0, 'ans': USER_VCODE, };
checkinfo['cap_cd']就是之前我們一直在說的cap_cd, VSIG是剛剛摳出來的那一串,collect的生成很復雜,但在這里並不重要,可以為空,USER_VCODE就是我們剛才得到的圖片里的驗證碼,值得注意的是新的算法在這一步需要post數據,而不是get。
其后服務器將返回如下數據:
enter: {'ticket': 't02D-rmFY2NgRig_BIingh0O8bDJMDyEwbmE8uv7s7ZzBBDaqLf5XAy_J8_HGP3Nb4oB99Z6MJuPVdwGmEthEyXUlZzzPEDFxx37r8X98CbAAC*', 'errorCode': '0', 'randstr': '@57S', 'errMessage': 'OK' }
其中randstr就是后面登陸時提交給服務器的驗證碼,還記的我們最初check時pt_verifysession_v1為空么,沒錯,就是這里的ticket.
一切就緒,可以登錄了:
URL_LOGIN = 'http://ptlogin2.qq.com/login' +\ '?u=%s' % UID +\ '&verifycode=%s' % VCODE +\ '&pt_vcode_v1=%s' % PT_VCODE_V1 +\ '&pt_verifysession_v1=%s' % PT_VERIFYSESSION_V1 +\ '&p=%s' % P +\ '&pt_randsalt=%s' % PT_RANDSALT+\ '&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone' +\ '&ptredirect=0' +\ '&h=1' +\ '&t=1' +\ '&g=1' +\ '&from_ui=1' +\ '&ptlang=2052' +\ '&action=3-21-1482653919209' +\ '&js_ver=10188' +\ '&js_type=1' +\ '&login_sig=%s' % LOGIN_SIG +\ '&pt_uistyle=40' +\ '&aid=549000912' +\ '&daid=5';
所有參數之前都解釋過了,唯獨p,p的加密算法也變了,都在c_login_2.js這個文件里,文件很長,亂糟糟,所以繼續發揚拿來主義吧,隨便改改用本地js引擎拿結果即可。