2017 最新qq登陸算法

 其實16年後幾個月算法就已經較大幅度改變了,只是無驗證碼狀況下,我上篇文章15年的老算法仍然能夠用,首先說下,我後面提交的某些參數是沒必要要的,尤爲是一些直接寫成常量的參數,抓包直接copy過來的,具體沒篩選。html

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沒作過多測試,反正目前我填幾都木影響,其餘參數木啥好說的。cookie

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,手機我沒測試。session

而後就能夠登陸了,app

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寫不寫隨意。dom

=============================================================================================post

再來講說須要驗證碼的登陸流程,稍微麻煩點:測試

首先仍是check,ui

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引擎拿結果便可。

相關文章
相關標籤/搜索