QQ空间g_tk算法的JS脚本的获取和分析

首先我们需要获取g_tk是如何计算的,由于Firefox自带的控制台功能不够用, 这里用Firefox+Firebug来做,其它浏览器应该也有对于的插件

Firebug分析

F12打开Firebug控制台,刷新QQ空间登录后的界面,然后点击“脚本”


下面我们需要在index.js中查找g_tk

先点击所有旁边的xxx.js旁的下三角

输入index.js

选择viewer2的那个js

然后在右边的搜索框中输入gtk=

可能要搜好多次才能出结果,楼主这里投机取巧了,直接给出答案:"g_tk="+QZONE.FP.getACSRFToken()


多搜几次,直接右键复制函数

JS函数是这样定义的

function (a){
    a=QZFL.util.URI(a);
    var b;
    a&&(a.host&&0<a.host.indexOf("qzone.qq.com")?b=QZFL.cookie.get("p_skey"):
a.host&&0<a.host.indexOf("qq.com")&&(b=QZFL.cookie.get("skey")));
    b||(b=QZFL.cookie.get("skey")||QZFL.cookie.get("rv2"));
    a=5381;
    for(var c=0,d=b.length;c<d;++c)
        a+=(a<<5)+b.charAt(c).charCodeAt();
    return a&2147483647
}

函数所在的JS链接:点这里

<span style="display: none; width: 0px; height: 0px;" id="transmark"></span>
    QZONE.FrontPage.getACSRFToken = function (a) {
        a = QZFL.util.URI(a);
        var b;
        a && (a.host && 0 < a.host.indexOf('qzone.qq.com') ? b = QZFL.cookie.get('p_skey')  :
        a.host && 0 < a.host.indexOf('qq.com') && (b = QZFL.cookie.get('skey')));
        b || (b = QZFL.cookie.get('skey') || QZFL.cookie.get('rv2'));
        a = 5381;
        for (var c = 0, d = b.length; c < d; ++c) a += (a << 5) + b.charAt(c).charCodeAt();
        return a & 2147483647
    };


网上很多分析抄来抄去,也不仔细看源码,这个函数主要是通过cookie的三个参数p_skey、skey、rv2算出g_tk的值

首先对这三个字符串做或运算,得到一个新的字符串,然后对每个字符取ascii码加上a左移5位的值。

网上很多文章只通过skey来算,目前服务器也能正确响应,可能是原来就只用这一个值算,后面QQ空间要升级的话也可能会出现错误。

Python在计算左移和加法的时候int会自动转long,所以代码不得不特殊处理了

Python2.7代码:

# -*- coding: UTF-8 -*-
import sys
import re


def LongToInt(value):  # 由于int+int超出范围后自动转为long型,通过这个转回来
    if isinstance(value, int):
        return int(value)
    else:
        return int(value & sys.maxint)
def LeftShiftInt(number, step):  # 由于左移可能自动转为long型,通过这个转回来
    if isinstance((number << step), long):
        return int((number << step) - 0x200000000L)
    else:
        return int(number << step)
def getOldGTK(skey):
    a = 5381
    for i in range(0, len(skey)):
        a = a + LeftShiftInt(a, 5) + ord(skey[i])
        a = LongToInt(a)
    return a & 0x7fffffff
def getNewGTK(p_skey, skey, rv2):
    b = p_skey or skey or rv2
    a = 5381
    for i in range(0, len(b)):
        a = a + LeftShiftInt(a, 5) + ord(b[i])
        a = LongToInt(a)
    return a & 0x7fffffff


# @1h4BB3B54 804BF877775DC07D0B313E9BC345C0C10A8DC211948584EB47 1081244980
cookieStr = 'QZ_FE_WEBP_SUPPORT=0; cpu_performance_v8=52; __Q_w_s__QZN_TodoMsgCnt=1; qq_photo_key=3f5a61d2ec8b845c82cb6495b013a161; __Q_w_s_hat_seed=1; uin=o0123456789; skey=@eGUumR6t0; ptisp=cnc; qzone_check=123456789_1441331282; Loading=Yes; p_skey=dArOKuu1XrAD2eXy5WQUcc3yltbmOcl0a2R-s1SZ3ZI_; pt4_token=IrI7MG3O6TmZNggm2el42g__; qqmusic_uin=; qqmusic_key=; qqmusic_fromtag=; qzmusicplayer=qzone_player_123456789_1441331284945; pgv_info=ssid=s1620079896; p_uin=o0123456789; rv2=804BF877775DC07D0B313E9BC345C0C10A8DC211948584EB47; property20=09473DB192D9C42A2785F37178883082E9A5283893BE41ECFA493E95E6F20E27385E24C933D47B5B; '

if re.search(r'p_skey=(?P<p_skey>[^;]*)', cookieStr):
    p_skey = re.search(r'p_skey=(?P<p_skey>[^;]*)', cookieStr).group('p_skey')
else:
    p_skey = None
if re.search(r'skey=(?P<skey>[^;]*)', cookieStr):
    skey = re.search(r'skey=(?P<skey>[^;]*)', cookieStr).group('skey')
else:
    skey = None
if re.search(r'rv2=(?P<rv2>[^;]*)', cookieStr):
    rv2 = re.search(r'rv2=(?P<rv2>[^;]*)', cookieStr).group('rv2')
else:
    rv2 = None

print p_skey
print skey
print rv2
print getOldGTK(skey)
print getNewGTK(p_skey, skey, rv2)





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值