爬虫 — Js 逆向案例一英汉互译

news2024/9/28 19:20:48

目标网站:https://fanyi.baidu.com/

需求:实现英汉互译

案例分析

1、分析网站加载方式

动态加载,目标 url:https://fanyi.baidu.com/v2transapi?from=en&to=zh

2、分析请求方式

post(携带 data 参数)

// 英译汉还是汉译英
from: en
to: zh
query: hello // 查询的内容,变化的,可以决定
transtype: realtime // 没有变化
simple_means_flag: 3 // 没有变化
sign: 54706.276099 // 会变化,⼀个单词⼀个数据
token: e1aca5af9de730135e0dba1cea1af143 // 没有变化
domain: common // 没有变化
ts: 1687238388787 // 时间戳

多抓几个包看数据变化

会产生变化并且必不可少的参数:sign 加密字段

3、根据加密字段找和它相关的 js 文件

按 F12 打开开发者工具,找到 Search,点击

在这里插入图片描述

4、在搜索框输入加密参数后,按回车

在这里插入图片描述

5、寻找与加密参数相关的 js 文件

在这里插入图片描述

6、给所有看起来和加密参数相关的都打上断点

在这里插入图片描述

7、加好所有断点后,重新输入内容进行翻译,查看跳转位置的代码是否是需要的代码

在这里插入图片描述

8、找到了 post 需要携带的相关参数后,新建一个 Js 文件,将找到的数据复制进去

// baidu.js
// 定义了一个函数,传递的参数是需要翻译的内容
function b(e){
    // 返回数据
    return {
        from: b.fromLang,
        to: b.toLang,
        query: e,
        transtype: i,
        simple_means_flag: 3,
        sign: w(e),
        token: window.common.token,
        domain: x.getCurDomain(),
        ts: +new Date
    }
}
console.log(b('hello'))

9、运行后报错

        transtype: i,
                   ^

ReferenceError: i is not defined

10、找到浏览器中传递的数据,根据第2步的分析,调整代码

在这里插入图片描述

11、调整后的代码

// baidu.js
// 定义了一个函数,传递的参数是需要翻译的内容
function b(e){
    // 返回数据
    return {
        from: 'en',
        to: 'zh',
        query: e,
        transtype: 'realtime',
        simple_means_flag: 3,
        sign: w(e),
        token: 'e1aca5af9de730135e0dba1cea1af143',
        domain: 'common',
        ts: +new Date
    }
}
console.log(b('hello'))

12、运行后报错

        sign: w(e),
              ^

ReferenceError: w is not defined

13、需要到浏览器中寻找 w 函数

在这里插入图片描述

14、将跳转后的函数代码复制下来

在这里插入图片描述

15、将复制的代码粘贴到 Js 文件中,给函数添加上函数名称

// baidu.js
function w(t) {
    var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
    if (null === i) {
        var a = t.length;
        a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
    } else {
        for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, l = s.length, u = []; c < l; c++)
            "" !== s[c] && u.push.apply(u, function(t) {
                if (Array.isArray(t))
                    return e(t)
            }(o = s[c].split("")) || function(t) {
                if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])
                    return Array.from(t)
            }(o) || function(t, n) {
                if (t) {
                    if ("string" == typeof t)
                        return e(t, n);
                    var r = Object.prototype.toString.call(t).slice(8, -1);
                    return "Object" === r && t.constructor && (r = t.constructor.name),
                    "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
                }
            }(o) || function() {
                throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
            }()),
            c !== l - 1 && u.push(i[c]);
        var p = u.length;
        p > 30 && (t = u.slice(0, 10).join("") + u.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + u.slice(-10).join(""))
    }
    for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = window[d] || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
        var _ = t.charCodeAt(v);
        _ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
        g[y++] = _ >> 18 | 240,
        g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
        g[y++] = _ >> 6 & 63 | 128),
        g[y++] = 63 & _ | 128)
    }
    for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
        b = n(b += g[x], w);
    return b = n(b, k),
    (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
    "".concat((b %= 1e6).toString(), ".").concat(b ^ f)
}
// 定义了一个函数,传递的参数是需要翻译的内容
function b(e){
    // 返回数据
    return {
        from: 'en',
        to: 'zh',
        query: e,
        transtype: 'realtime',
        simple_means_flag: 3,
        sign: w(e),
        token: 'e1aca5af9de730135e0dba1cea1af143',
        domain: 'common',
        ts: +new Date
    }
}
console.log(b('hello'))

16、运行后报错

    for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = window[d] || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
                                                                                                                            ^

ReferenceError: r is not defined

17、分析 r 为一个值,可以给 r 赋值为 null

// baidu.js
var r = null

18、运行后报错

    for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = window[d] || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
                                                                                                                                                   ^

ReferenceError: window is not defined

19、到浏览器中查看 window 是什么

在这里插入图片描述

20、获取到 window[d] 的值后,多次重新输入翻译内容,再运行确定值是否是固定的

方式一:

鼠标悬停显示

在这里插入图片描述

方式二:

在控制台打印

在这里插入图片描述

21、确定 window[d] 为固定值后,将 Js 代码中的 window[d] 直接替换为固定值

// baidu.js
var r = null
function w(t) {
    var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
    if (null === i) {
        var a = t.length;
        a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
    } else {
        for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, l = s.length, u = []; c < l; c++)
            "" !== s[c] && u.push.apply(u, function(t) {
                if (Array.isArray(t))
                    return e(t)
            }(o = s[c].split("")) || function(t) {
                if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])
                    return Array.from(t)
            }(o) || function(t, n) {
                if (t) {
                    if ("string" == typeof t)
                        return e(t, n);
                    var r = Object.prototype.toString.call(t).slice(8, -1);
                    return "Object" === r && t.constructor && (r = t.constructor.name),
                    "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
                }
            }(o) || function() {
                throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
            }()),
            c !== l - 1 && u.push(i[c]);
        var p = u.length;
        p > 30 && (t = u.slice(0, 10).join("") + u.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + u.slice(-10).join(""))
    }
    for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = '320305.131321201' || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
        var _ = t.charCodeAt(v);
        _ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
        g[y++] = _ >> 18 | 240,
        g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
        g[y++] = _ >> 6 & 63 | 128),
        g[y++] = 63 & _ | 128)
    }
    for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
        b = n(b += g[x], w);
    return b = n(b, k),
    (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
    "".concat((b %= 1e6).toString(), ".").concat(b ^ f)
}
// 定义了一个函数,传递的参数是需要翻译的内容
function b(e){
    // 返回数据
    return {
        from: 'en',
        to: 'zh',
        query: e,
        transtype: 'realtime',
        simple_means_flag: 3,
        sign: w(e),
        token: 'e1aca5af9de730135e0dba1cea1af143',
        domain: 'common',
        ts: +new Date
    }
}
console.log(b('hello'))

22、运行后报错

        b = n(b += g[x], w);
        ^

ReferenceError: n is not defined

23、找到函数 n 的来源

在这里插入图片描述

24、复制函数 n 的代码

在这里插入图片描述

25、将复制的代码粘贴到 Js 文件中

// baidu.js
var r = null
function n(t, e) {
    for (var n = 0; n < e.length - 2; n += 3) {
        var r = e.charAt(n + 2);
        r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r),
        r = "+" === e.charAt(n + 1) ? t >>> r : t << r,
        t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r
    }
    return t
}
function w(t) {
    var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
    if (null === i) {
        var a = t.length;
        a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
    } else {
        for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, l = s.length, u = []; c < l; c++)
            "" !== s[c] && u.push.apply(u, function(t) {
                if (Array.isArray(t))
                    return e(t)
            }(o = s[c].split("")) || function(t) {
                if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])
                    return Array.from(t)
            }(o) || function(t, n) {
                if (t) {
                    if ("string" == typeof t)
                        return e(t, n);
                    var r = Object.prototype.toString.call(t).slice(8, -1);
                    return "Object" === r && t.constructor && (r = t.constructor.name),
                    "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
                }
            }(o) || function() {
                throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
            }()),
            c !== l - 1 && u.push(i[c]);
        var p = u.length;
        p > 30 && (t = u.slice(0, 10).join("") + u.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + u.slice(-10).join(""))
    }
    for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = '320305.131321201' || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
        var _ = t.charCodeAt(v);
        _ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
        g[y++] = _ >> 18 | 240,
        g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
        g[y++] = _ >> 6 & 63 | 128),
        g[y++] = 63 & _ | 128)
    }
    for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
        b = n(b += g[x], w);
    return b = n(b, k),
    (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
    "".concat((b %= 1e6).toString(), ".").concat(b ^ f)
}
// 定义了一个函数,传递的参数是需要翻译的内容
function b(e){
    // 返回数据
    return {
        from: 'en',
        to: 'zh',
        query: e,
        transtype: 'realtime',
        simple_means_flag: 3,
        sign: w(e),
        token: 'e1aca5af9de730135e0dba1cea1af143',
        domain: 'common',
        ts: +new Date
    }
}
console.log(b('hello'))

26、运行后返回结果

{
  from: 'en',
  to: 'zh',
  query: 'hello',
  transtype: 'realtime',
  simple_means_flag: 3,
  sign: '54706.276099',
  token: 'e1aca5af9de730135e0dba1cea1af143',
  domain: 'common',
  ts: 1687239404824
}

27、编写 Python 代码

# 百度翻译.py
# 导入 requests 库,用于发送 HTTP 请求和处理 HTTP 响应
import requests
# 导入自定义模块,用于获取 JavaScript 代码生成的字典
from JsReverse import get_js # JsReverse 为文件名,get_js 为函数名

# 输入需要翻译的内容
trs = input('请输入需要翻译的内容')
# 调用 get_js 函数,传入 JavaScript 文件名'baidu.js'、函数名'b'和翻译内容 trs,获取生成的字典
dic = get_js('baidu.js', 'b', trs)
# 判断输入的是中文还是英文
length = len(trs[0].encode('utf-8')) # 第一个字符长度,一个字母长度是为1,汉字是为3
# 英文
if length == 1:
    dic['from'] = 'en'
    dic['to'] = 'zh'
# 中文
elif length == 3:
    dic['from'] = 'zh'
    dic['to'] = 'en'
# 打印字典
# print(dic)
# 设置翻译请求的 url
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
# 请求头
headers = {
    'Acs-Token': '1687238994011_1687238994248_sKfCKQnOqNJPstsgIsKUPaqAYGqQnIFYiRYGiFYQlIQ+uev26ckgDP84N0sc9iBWm9m8CkW2nyiEwf2Nkr+8bGpHXAxRIArLKohyWWLDQsf6T3mPhsnt8wAI2EGbiEU21zkMCz4WHc49JrKS39GQphWRFrR6Rxu32HgHkqnebW3T7XKVJoRr3x55dGur43olklcdMSq7TOpNx9FDNL4i4dYpDyyjBJohySeR1BWbSHqJWo+IdOOFpNNz2ICr2jA3ngsBPByzUlk0Nr2zDVRfGfGeiZaMPd6BQbMLHVrU0cs8PX452MbNggwOVkN8cYPHGaXQOokzUAy13RMZtRRSqREFq+6oAk0evXXiHPAiGRRADoUYiwpYfKmw5k2nTISu5EpqTXOw/RlicgaHqgP+ubTc8EJ4QzCnBLMWDop+04+P0Ntzy0ngGRfdibhJ3ChIHbQQx+Ner2JCsrTlglUYfIT2Cw4VMvdc2ItaV3MAC2dt0cn7NK2ZLK933nMOwspa',
    'Cookie': 'BIDUPSID=B7CB7F26DDDA7D98FF29C3EEC2AFEE2E; PSTM=1682489485; BAIDUID=B7CB7F26DDDA7D988547B56FBC007491:FG=1; BAIDUID_BFESS=B7CB7F26DDDA7D988547B56FBC007491:FG=1; ZFY=YlAwfOaBfcP52N:AR2NYPavFtVsbTy8X5ubtZIMWNoqM:C; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1686816274,1686912230,1687238103; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1687238991; ab_sr=1.0.1_ZjFiNjI5YWYyMzkzMjkyNzA1YjkzY2Q0NDdjYjc5MGU3Mzg1NTExNzczODA1YzliOWJlMjhhMzE0NjM0MTY0YjVmNGMxOWM3MTRkYmRjMDBiZGFmZTgwNTNhZGI5OTdlNzFiN2M2ZWIxOTEyZWY2NWEwM2ZiZGE5NzA3YzVmOTYzYjZjNTc4ZWNhZGJmMTA0NDFlNjc5MTJiMzkxMTg0OQ==',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
# 发送 post 请求,传递数据字典 dic
res = requests.post(url, data=dic, headers=headers)
# 输出结果
print(res.json()['trans_result']['data'][0]['dst'])
# JsReverse.py
# 安装方法:pip install PyExecJs -i https://pypi.tuna.tsinghua.edu.cn/simple
import execjs # 用于执行 JavaScript 代码的库

# 定义函数
def get_js(js_path, fuc_name, func_args):
    '''
    :param js_path:  js代码的文件路径
    :param fuc_name: 调用的js函数名称
    :param func_args: 传入的参数
    :return:
    '''
    # 1. 读取 js 代码
    with open(js_path, 'r', encoding='utf-8') as f:
        js_code = f.read()

    # 2. 编译 js 代码
    cjs = execjs.compile(js_code)

    # 3. 执行 js 代码,函数后面跟上一个参数
    # print(fuc_name, func_args)
    return cjs.call(fuc_name, func_args)

注意

*func_args 和 func_args

*func_args:可变长度参数,接收的数据类型是元组,return cjs.call(fuc_name, func_args) 返回值时需要拆解,循环遍历取值

func_args:只有一个参数时不用加 *

// baidu.js
var r = null
function n(t, e) {
    for (var n = 0; n < e.length - 2; n += 3) {
        var r = e.charAt(n + 2);
        r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r),
        r = "+" === e.charAt(n + 1) ? t >>> r : t << r,
        t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r
    }
    return t
}
function w(t) {
    var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
    if (null === i) {
        var a = t.length;
        a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
    } else {
        for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, l = s.length, u = []; c < l; c++)
            "" !== s[c] && u.push.apply(u, function(t) {
                if (Array.isArray(t))
                    return e(t)
            }(o = s[c].split("")) || function(t) {
                if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])
                    return Array.from(t)
            }(o) || function(t, n) {
                if (t) {
                    if ("string" == typeof t)
                        return e(t, n);
                    var r = Object.prototype.toString.call(t).slice(8, -1);
                    return "Object" === r && t.constructor && (r = t.constructor.name),
                    "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
                }
            }(o) || function() {
                throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
            }()),
            c !== l - 1 && u.push(i[c]);
        var p = u.length;
        p > 30 && (t = u.slice(0, 10).join("") + u.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + u.slice(-10).join(""))
    }
    for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = '320305.131321201' || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
        var _ = t.charCodeAt(v);
        _ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
        g[y++] = _ >> 18 | 240,
        g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
        g[y++] = _ >> 6 & 63 | 128),
        g[y++] = 63 & _ | 128)
    }
    for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
        b = n(b += g[x], w);
    return b = n(b, k),
    (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
    "".concat((b %= 1e6).toString(), ".").concat(b ^ f)
}
// 定义了一个函数,传递的参数是需要翻译的内容
function b(e){
    // 返回数据
    return {
        from: 'en',
        to: 'zh',
        query: e,
        transtype: 'realtime',
        simple_means_flag: 3,
        sign: w(e),
        token: 'e1aca5af9de730135e0dba1cea1af143',
        domain: 'common',
        ts: +new Date
    }
}
console.log(b('hello'))

28、通过 Python 调用 Js代码的结果时,会出现如下错误

在这里插入图片描述

解决方案

找到 Python 的安装目录下的 Lib 里的 subprocess.py 文件,将 encoding=None 改为 encoding=‘utf-8’

在这里插入图片描述

在这里插入图片描述

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

功率放大器的特点是什么

功率放大器是电子系统中常见的一种设备&#xff0c;其主要功能是将低功率输入信号放大为高功率的信号输出。功率放大器具有多种特点&#xff0c;下面西安安泰电子将详细介绍功率放大器的几个主要特点。 功率放大器的一个主要特点是高功率输出。与信号放大器相比&#xff0c;功率…

Pytorch 深度学习实践 day01(背景)

准备 线性代数&#xff0c;概率论与数理统计&#xff0c;Python理解随机变量和分布之间的关系 人类智能和人工智能 人类智能分为推理和预测 推理&#xff1a;通过外界信息的输入&#xff0c;来进行的推测 预测&#xff1a;例如&#xff0c;看到一个真实世界的实体&#xff…

windows 电脑改成安卓桌面

windows电脑改造为类安卓的操作逻辑&#xff0c;适用于触摸屏windows系统。主要操作逻辑见下面图片列表&#xff1a; 桌面主页面 侧边工具栏 工具栏里有一些常用小工具 打开首页的应用&#xff08;edge浏览器&#xff09; 查看我的所有应用

2023年9月20日

画个钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimerEvent> #include <QTime> #include <QDateTime> #include <…

ChatGLM 大模型炼丹手册-理论篇

序言一)大还丹的崛起 在修真界,人们一直渴望拥有一种神奇的「万能型丹药」,可包治百病。 但遗憾的是,在很长的一段时间里,炼丹师们只能对症炼药。每一枚丹药,都是特效药,专治一种病。这样就导致,每遇到一个新的问题,都需要针对性的炼制,炼丹师们苦不堪言,修真者们吐…

渗透测试——formatworld(1)

文章目录 一、环境二、获取flag11、扫描局域网内存活主机1.1 查看kali的IP地址1.2 扫描存活主机 2、粗略扫描靶机端口&#xff08;服务&#xff09;3、寻找ftp服务漏洞4、扫描端口详细信息5、匿名登录ftp 一、环境 攻击机&#xff1a;kali 靶机&#xff1a;formatworld 二、获…

transformer系列1---Attention Is All You Need全文详细翻译

论文链接&#xff1a;Attention Is All You Need. 代码链接&#xff1a;Transformer. Transformer 0 Abstract 摘要1 Introduction 引言2 background 背景3 Model Architecture模型架构3.2 Attention注意力3.2.1 Scaled Dot-Product Attention缩放点积注意力3.2.2 Multi-Head …

idea设置gradle

1、不选中 2、下面选specified location 指定gradle目录

IDEA 启动 java web 老项目

背景&#xff1a;一套 java web 老代码&#xff0c;使用 eclipse 工具开发。内网&#xff0c;无 eclipse 开发工具&#xff0c;只有 IDEA。 代码目录结构如下&#xff1a; demo/.settings/* demo/src/com/demo/controller/* demo/webapp/js/* demo/webapp/jsp/* demo/webapp/M…

realloc

目录 前提须知&#xff1a; 函数介绍&#xff1a; 函数原型&#xff1a; 使用realloc&#xff1a; realloc在调整内存空间的是存在两种情况/使用realloc为扩大空间的两种情况 1.是剩下的没有被分配的空间足够 2 .剩下没有被分配的空间不够了 注意事项&#xff1a; rea…

普中51-矩阵按键

矩阵按键 原理图如下&#xff1a; 行列扫描 行列扫描法检测时&#xff0c;先送一列为低电平&#xff0c;其余几列全为高电平(此时我们确 定了列数)&#xff0c;然后立即轮流检测一次各行是否有低电平&#xff0c;若检测到某一行为低电 平(这时我们又确定了行数)&#xff0c;…

巨人互动|Facebook海外户Facebook的特点优势

Facebook作为全球最大的社交媒体平台之一&#xff0c;同时也是最受欢迎的社交网站之一&#xff0c;Facebook具有许多独特的特点和优势。本文小编将说一些关于Facebook的特点及优势。 1、全球化 Facebook拥有数十亿的全球用户&#xff0c;覆盖了几乎所有国家和地区。这使得人们…

Unity用相机实现的镜子效果

首先登场 场景中的元素 mirror是镜子&#xff0c;挂着我们的脚本&#xff0c;Quad是一个面片。Camera是用来生成RenderTexture给面片的。里面的test1是我用来调试位置的球。 镜子size是大小&#xff0c;x是-2&#xff0c;为了反转一下贴图 相机直接可以禁用掉&#xff0c;用…

无需申请专线、无需改动网络,ERP/MES管理系统如何远程访问?

深圳市某模具公司作为一家以设计、制作五金模具、五金冲压、机加工件、加工经营为主的五金企业。为了实现更为高效的生产管理流程&#xff0c;引入了面向钣金/五金行业信息化建设的ERP/MES管理系统及方案&#xff0c;并将其部署在了企业总部的内网服务器。 除了总部访问需求外&…

ThreeJS入门-创建一个正方体

ThreeJs实际上是WebGL的框架&#xff0c;Three.js是在WebGL的api接口基础上&#xff0c;又进行的一层封装。相当于js和JQuery的关系&#xff0c;学习webgl需要图形学知识&#xff0c;而webgl需要通过js和glsl两种语言。如果我们不通过threejs使用webgl势必逃不过底层知识:你必须…

SSRF漏洞(利用file协议读取本地文件)

简介 当利用SSRF漏洞时&#xff0c;攻击者可以通过构造恶意请求来读取本地文件。其中一种方法是使用file协议来读取本地文件。例如&#xff0c;file:///etc/passwd是一个常见的示例&#xff0c;它用于读取Linux系统上的passwd文件。 passwd文件是Linux系统中用于存储用户账户…

Flink——Flink检查点(checkpoint)、保存点(savepoint)的区别与联系

Flink checkpoint Checkpoint是Flink实现容错机制最核心的功能&#xff0c;能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot&#xff0c;从而将这些状态数据定期持久化存储下来&#xff0c;从而将这些状态数据定期持久化存储下来&#xff0c;当Flink程序一…

【C语言】进阶——字符串和内存函数

目录 一&#xff1a;非限制字符串函数 1.strlen &#x1f44a;模拟实现 方法1&#xff1a;计算器法 方法2.指针-指针 方法3.函数调用 2.strcpy &#x1f44a;模拟实现 3.strcat &#x1f44a;模拟实现 4.strcmp &#x1f44a;模拟实现 二&#xff1a;可限制字符串函…

Echarts 旭日图的详细配置过程

文章目录 旭日图 简介配置过程简易示例 旭日图 简介 Echarts旭日图是一种数据可视化图表类型&#xff0c;用于展示层次关系数据的分布情况。旭日图通过不同的环形区域和扇形区域来表示数据的层次和大小关系&#xff0c;从而形成一个太阳的形状&#xff0c;因此得名旭日图。 E…

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…