(原创)添加QQ好友日期爬虫04——根据js加密原理,得到g_tk

本文深入探讨了QQ空间中用于安全验证的g_tk算法,详细解析了从cookie中获取skey、p_skey或rv2值的过程,并通过Python代码实现了g_tk的计算方法,包括对hash值的处理及控制其在int范围内的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

再提一下之前看到得到g_tk的JavaScript函数:

getACSRFToken:function(url) {
    url = QZFL.util.URI(url);
    var skey;
    if (url) {
      if (url.host && url.host.indexOf("qzone.qq.com") > 0) {
        try {
          skey = QZONE.FP._t.QZFL.cookie.get("p_skey");
        } catch (err) {
          skey = QZFL.cookie.get("p_skey");
        }
      } else {
        if (url.host && url.host.indexOf("qq.com") > 0) {
          skey = QZFL.cookie.get("skey");
        }
      }
    }
    if (!skey) {
      skey = QZFL.cookie.get("p_skey") || (QZFL.cookie.get("skey") || (QZFL.cookie.get("rv2") || ""));
    }
    var hash = 5381;
    for (var i = 0, len = skey.length;i < len;++i) {
      hash += (hash << 5) + skey.charCodeAt(i);
    }
    return hash & 2147483647;

可以看出

skey = p_skey or skey or rv2

然后对hash每一位左移5位,加上skey的i位字符码,叠加hash

最后对hash & 2147483647 控制hash在int范围内

这里代码借鉴了其他博客的改了改

get_gtk.py

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 number>0x200000000:
        return int((number << step) - 0x200000000)
    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
 

def getGTK(cookieStr):
	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
	return getNewGTK(p_skey, skey, rv2)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值