QQ空间很多地方需要使用token作为url参数才能成功获取数据,那么如何计算token(g_tk、bkn)就成了必须要解决的问题

1、查找token加密文件

浏览器访问QQ空间,并用开发者工具抓包数据,先通过token字符串全局搜索token可能出现在的文件或者js,然后通过详细查看获知getACSFToken函数是生成token的关键,并打开具体的js文件,interface_mini.js和qzfl_v8_2.1.65.js都有该加密算法。

466-1.png

2、分析加密机制

从该文件中找到了加密代码,那么改造成PHP代码就很简单了。以下是JS代码:

    QZONE.FrontPage.getACSRFToken = function(e) {
        var t;
        if ((e = QZFL.util.URI(e)) && (e.host && 0 < e.host.indexOf("qzone.qq.com") ? t = QZFL.cookie.get("p_skey") : e.host && 0 < e.host.indexOf("qq.com") && (t = QZFL.cookie.get("skey"))),
        !t)
            try {
                t = parent.QZFL.cookie.get("p_skey") || ""
            } catch (e) {
                t = QZFL.cookie.get("p_skey") || ""
            }
        for (var n = 5381, o = 0, i = (t = t || (QZFL.cookie.get("skey") || QZFL.cookie.get("rv2"))).length; o < i; ++o)
            n += (n << 5) + t.charAt(o).charCodeAt();
        return 2147483647 & n
    }

3、PHP重写加密机制

function getbkn($skey) {
    $n = 5381;
    $len = strlen($skey);
    for($i=0;$i<$len;$i++){
        $n += ($n<<5) + ord($skey[$i]);
    }
    return 2147483647 & $n;
}

PHP位运算说明

1、$a<<$b:Shift left(左移),表示将$a中的位向左移动$b次(每一次移动都表示“乘以2”)

2、$a&$b:And(按位与),表示 将把$a和$b中都为1的位设为1。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。