【JS逆向百题斩】百度翻译参数接口逆向

百度翻译逆向爬虫

网站链接

https://fanyi.baidu.com/?aldtype=16047#auto/zh

接口链接

https://fanyi.baidu.com/v2transapi?from=zh&to=en

接口参数

sign,token

1.爬取步骤

  • 抓包查找值

  • 查找关键值,定位关键代码

    • 搜索查找

      • 小技巧:

        • 直接搜索参数

        • pwd=

        • pwd =

        • pwd:

        • pwd :

        • 密码框地方右键 检查 查看 id name type

    • xhr断点查找

    • DOM断点查找(不经常使用)

  • 定位到关键代码之后,定位到关键函数

  • 扣取代码或代码解密后用python语言复现

  • 输出加密结果

2.实际操作

  • 抓包查找值

    • token值:经过翻译不同的中文后,我们发现token值为固定写死的,或者我们也可以直接从HTML源码中提取token值,故而该值不需要逆向获取

    • sign值:经过翻译不同的中文后,我们发现sign值是动态变化的,所以我们需要进入js代码。

      • 首先,经过调试我们可以发现,翻译请求时,网页地址不发生变化,断定改请求为ajax请求。

      • 通过分析xhr请求页,发现接口链接为https://fanyi.baidu.com/v2transapi?from=zh&to=en

        1.png

          参数列表:
2.png
  • 查找关键值,定位关键代码

    • 搜索查找

      • 查找sign:缩小范围,定位到js文件为index_5bbbfa0.js,关键参数位置
        关键参数

        ,此时我们进入L(e)函数,可以看到函数内容
        函数内容
  • 扣取关键代码

    function e(r) {
    function n(r, o) {
    for (var t = 0; t < o.length - 2; t += 3) {
    var a = o.charAt(t + 2);
    a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
    a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
    r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
    }
    return r
    }
    var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
    if (null === o) {
    var t = r.length;
    t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
    } else {
    for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++) "" !== e[C] && f.push.apply(f, a(e[C].split(""))),
    C !== h - 1 && f.push(o[C]);
    var g = f.length;
    g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join(""))
    }
    var u = void 0,
    l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
    var i = '320305.131321201';
    u = null !== i ? i : (i = window[l] || "") || "";
    for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
    var A = r.charCodeAt(v);
    128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
    S[c++] = A >> 18 | 240,
    S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
    S[c++] = A >> 6 & 63 | 128),
    S[c++] = 63 & A | 128)
    }
    for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
    p += S[b],
    p = n(p, F);
    return p = n(p, D),
    p ^= s,
    0 > p && (p = (2147483647 & p) + 2147483648),
    p %= 1e6,
    p.toString() + "." + (p ^ m)
    }

  • 使用execjs这个python包调用js代码,实现sign值的动态生成

你可能感兴趣的:(【JS逆向百题斩】百度翻译参数接口逆向)