腾讯QQ空间g_tk算法
在百度搜索g_tk,只得到幾個可憐而且不完整的答案,因此,我首次在源始時代公開一下QQ空間的g_tk算法。其實(shí)g_tk只是QQ空間對日志進(jìn)行操作的時候,所采取的一套安全機(jī)制,如果g_tk字符串的值不對的話,請求是沒有辦法提交的,因此,很多剛剛涉及HTTP協(xié)議技術(shù)的人想對QQ空間這尊大佛動手腳的話,只能望而卻步。下面我以VB為例,在這里詳解一下g_tk的計(jì)算方法。
其實(shí)g_tk校驗(yàn)是通過skey值來算出來的,弄過QQ登錄的人可能都知道,在登錄成功之后,cookies里都會返回skey值,通常是以@開頭,并且?guī)в幸淮此茻o規(guī)則的大小寫字母混合,總共10位。下面我們先來抓包看看,g_tk到底用在了哪里,我們以轉(zhuǎn)載日志為例來抓包,上圖:
完整數(shù)據(jù)包內(nèi)容如下:
POST /cgi-bin/blognew/blog_quote HTTP/1.1Accept: */*Accept-Language: zh-cnReferer: http://b.qzone.qq.com/proxy.htmlIf-Modified-Since: 0Content-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)Host: b.qzone.qq.comContent-Length: 65Connection: Keep-AliveCache-Control: no-cacheCookie: pt2gguin=o0138001655; ptcz=0b25a27219dd08bcfe38fc85365593dadb1a2a99cac9f1abfd5fb31a7052f89b; pvid=6724688319; flv=10.0; adid=138001655; adSP=GHTsOtSHTIJdDIr9+GXVoaFY59pet/LONpbU1rA0yPY=_837_326830_1290874683_; adVer=3121; ac=1,030,006; ptui_qstatus=2; uin=o0138001655; skey=@sZmfEEBdt; ptisp=ctc; ssid=s8226120880; login_time=B46BD5B3A93F9EC5226847DB4AE9A71589641475FCCEBBC9; __Q_w_s__appDataSeed=1; randomSeed=220115
uin=138001655&fromuin=715746717&blogid=1286714133&g_tk=1423927145
我們可以看到,數(shù)據(jù)包主體部分最后一個參數(shù)就是g_tk值,一般是一串?dāng)?shù)字。那這個值到底怎么算出來的呢?
因?yàn)槲覀冊诰W(wǎng)頁登錄QQ的時候,騰訊都會通過cookies里的skey值來計(jì)算,用js來算。既然在運(yùn)算的時候執(zhí)行了js腳本,那么我們就可以在抓包中獲得。那g_tk是通過什么算法算出來的?其實(shí)很簡單,當(dāng)我們得到skey后,循環(huán)取單字符的二進(jìn)制并取左值.累加之后就得到后面的g_tk值了,這聽上去很復(fù)雜,不過算法不用我們自己寫,我們只需要執(zhí)行在騰訊網(wǎng)頁登錄的時候所執(zhí)行的那個js腳本就可以了。當(dāng)然,js不能直接調(diào)用,不過既然我寫了這篇文章,就已經(jīng)是有備而來的,js算法我已經(jīng)整理并寫了一個最簡單的,代碼如下:
function getGTK(str){
var hash = 5381;
for(var i = 0, len = str.length; i < len; ++i)
{
hash += (hash << 5) + str.charAt(i).charCodeAt();
}
return hash & 0x7fffffff;
}
那么我們現(xiàn)在還有兩個問題沒有解決:
1.如何獲取登錄后的cookies?
2.如何在VB中執(zhí)行js代碼并得到返回值?
上面兩個問題其實(shí)到了你們手里,我相信也不會是問題了,下面我再通過代碼以及講解,來剖析并解決這兩個所謂的問題。對于HTTP數(shù)據(jù)包POST/GET,相信看這篇文章的人應(yīng)該都懂得吧,否則你看了也沒用,那么我們可以設(shè)計(jì)一個登錄程序,并在登錄之后獲取cookies中的skey值,并計(jì)算出g_tk。下面設(shè)計(jì)個登錄界面:
以下是源碼,請移步到原帖地址(帶源碼下載):
http://www.codeages.com/forum.php?mod=viewthread&tid=43004&extra=page%3D1
作者:水木
出處:http://www.hechunbo.com/
總結(jié)
以上是生活随笔為你收集整理的腾讯QQ空间g_tk算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AngularJS 详解Directiv
- 下一篇: angularjs directive