【 百度翻译】简单逆向入门

方法实现

方法改进

     瑕疵

     参数详解

          1.ts和query

          2.sign

总结

方法实现

我们打开百度翻译的网址,然后输入中文并进行抓包

在这里插入图片描述

通过这个接口我们发现它返回来的数据就是我们输入的下方数据,那接口找对了,我们再看看它的参数

在这里插入图片描述

显然参数kw就是我们要翻译的词,我们用代码实现一下

import requests
url = 'https://fanyi.baidu.com/sug'
word = input()
head = {
'Cookie':'BIDUPSID=271A9A044CAED0F1DDD076103A1AE076; PSTM=1695440468; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1710298000,1710917767; H_WISE_SIDS=60237_60277_60340_60364_60346_60359; H_WISE_SIDS_BFESS=60237_60277_60340_60364_60346_60359; BAIDUID=43E31FDDFEA10C7AF5E202E5DD3ECF01:SL=0:NR=10:FG=1; BAIDUID_BFESS=43E31FDDFEA10C7AF5E202E5DD3ECF01:SL=0:NR=10:FG=1; H_PS_PSSID=60237_60277_60467_60491_60498_60549; delPer=0; PSINO=7; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=2g0l80202lag2101818laha0ahbeut1jagjek1v; ZFY=FdUrKZY2kvCi0l2N0T34D:BDTirQxM59SDOpi7vRwvW0:C; ab_sr=1.0.1_MDJjY2FmNWVhZTVjNDRiMjAwMDU4MDc1M2IyZDU4N2E4ZTk2NzRjMGRmMGEwYjhmMjFlZDA3ZTNkOTFjNGE3ZTlhOTI5MzRmMjI5ZTczZTA2YjlkNWMwZDJjYmUxNWQxY2FkZTU0ZjVhMGE4ZGQyN2I1MjkxYTA5ZGNjZDI0ZTg1ZTRjNDE2NTg0NGE1MzI0ODFkNDI5MGQwM2IwMWI0ZjdkNTM2YTcxY2E4NDc4OTk1NmY2YjU1YTFmYWMyNzJkMzA5N2RjZDJkOWM0ZDY0M2EzMzBmNTJkMjRhNjcwNWM=; RT="z=1&dm=baidu.com&si=a875a4eb-0767-450a-a400-478269bea5e8&ss=lz7sjnj9&sl=4&tt=6bf&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=dy7"',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
}
data = {
    'kw':word
}
res=requests.post(url,headers =head,data= data ).json()
print(res)

方法改进

瑕疵

上述方法其实是有点瑕疵的,我们想要的翻译应该是下图这样的,而且长句翻译它是实现不了的,所以我们需要再抓包看看。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

刚好这个接口返回的数据就事我们想要的,我们再来看看它的参数

在这里插入图片描述

通过比较其他单词翻译的数据来看(这里就不贴图了),我们需要知道以下参数

query
sign
ts

参数详解

1.ts和query

很明显ts就是一个时间戳,我们只需要使用python内置的库time获取即可

import time
re=time.time()
ts = str(re*1000)[0:13]

另外这个query就是我们想要翻译的词。


2.sign

这个参数我们搜索一下,并设置断点方便确定它的准确位置
在这里插入图片描述

我们发现sign是将我们翻译的词通过b函数变换得到的,我们往下走看看它是怎么变换的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

b函数走完一圈发现它是由上述图片中的函数得来,所以我们要想获得sign的值我们可以在将上述图片中的js代码跑一遍即可,但要想能在我们的python代码引用的话还需要做一些小小的变换

function jiema(t) {
        function e(t, e) {
            (null == e || e > t.length) && (e = t.length);
            for (var n = 0, r = new Array(e); n < e; n++)
                r[n] = t[n];
            return r
        }
        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
        }
        var r = null;
        var jm = (function(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, u = s.length, l = []; c < u; c++)
                    "" !== s[c] && l.push.apply(l, 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 !== u - 1 && l.push(i[c]);
                var p = l.length;
                p > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + l.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)
        })(t)
     return  jm
    }

到时候就可以通过调用jiema函数来实现变换


总结

三个参数我们都破解了,现在我们来看看完整代码

import execjs
import requests
import time
re=time.time()
ts = str(re*1000)[0:13]
fp = open('1.js', 'r', encoding='utf-8')
fp = fp.read()
a=execjs.compile(fp)
word  = input('你要翻译的内容:')
b = a.call('jiema',word)
url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
'Referer':'https://fanyi.baidu.com/pcnewcollection?req=check',
'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie':'BAIDUID=11538CEAA935A13CEC3D1693EEF28AB1:FG=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BDUSS=VNdlFhc0JiUVJadkNvRDVjcHRJY0k0Q0RURzRZVW5yV35FY35WZ3hZTk15dGhsRVFBQUFBJCQAAAAAAQAAAAEAAABllIp45Py52DY5NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEw9sWVMPbFlan; BDUSS_BFESS=VNdlFhc0JiUVJadkNvRDVjcHRJY0k0Q0RURzRZVW5yV35FY35WZ3hZTk15dGhsRVFBQUFBJCQAAAAAAQAAAAEAAABllIp45Py52DY5NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEw9sWVMPbFlan; newlogin=1; APPGUIDE_10_6_9=1; MCITY=-222%3A206%3A; H_WISE_SIDS=39662_40207_40211_40217_40249_40256_40294_40290_40287_40286_40317_40080_40364_40351_40369_40379; H_WISE_SIDS_BFESS=39662_40207_40211_40217_40249_40256_40294_40290_40287_40286_40317_40080_40364_40351_40369_40379; H_PS_PSSID=39662_40207_40211_40217_40249_40294_40290_40287_40286_40317_40080_40364_40351_40369_40379_40405_40416; smallFlowVersion=old; APPGUIDE_10_7_0=1; PSTM=1710402169; BIDUPSID=40A9368A79D0747E4DF0ED8960C44D0F; BAIDUID_BFESS=11538CEAA935A13CEC3D1693EEF28AB1:FG=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1710250194,1710340606,1710665122; APPGUIDE_10_7_1=1; BA_HECTOR=a0a02124a5ah2ha18001ak2kb9ghbk1ivdivv1t; ZFY=x654S8xr2ZPWRk5Q9VWpfLb51YVch6MUQUEdk9GjJgI:C; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; PSINO=3; delPer=0; BCLID=10452628027395725607; BCLID_BFESS=10452628027395725607; BDSFRCVID=I1COJexroG3M8lnqn9BEU9pXaSNbUdrTDYrEOwXPsp3LGJLVYE-bEG0Pts1-dEub6j30ogKKQgOTHRPF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; BDSFRCVID_BFESS=I1COJexroG3M8lnqn9BEU9pXaSNbUdrTDYrEOwXPsp3LGJLVYE-bEG0Pts1-dEub6j30ogKKQgOTHRPF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tbC8VCDKJKD3H48k-4QEbbQH-UnLqMFD02OZ04n-ah058Dn1hRQ_efDk3HrjXPogBDrP0Pom3UTKsq76Wh35K5tTQP6rLqc4HCr4KKJxbP8aKJbH5tK-M6JQhUJiBhoMBan7bfJIXKohJh7FM4tW3J0ZyxomtfQxtNRJ0DnjtpChbRO4-TFKjTbQ3H; H_BDCLCKID_SF_BFESS=tbC8VCDKJKD3H48k-4QEbbQH-UnLqMFD02OZ04n-ah058Dn1hRQ_efDk3HrjXPogBDrP0Pom3UTKsq76Wh35K5tTQP6rLqc4HCr4KKJxbP8aKJbH5tK-M6JQhUJiBhoMBan7bfJIXKohJh7FM4tW3J0ZyxomtfQxtNRJ0DnjtpChbRO4-TFKjTbQ3H; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1710680827; ab_sr=1.0.1_ZDNkMmVhZjRkYTc1MDUzMzRjMDFmMzJhYWRhZTJiYjkyZThmOGZjNWFiYzYxMzdmMDlkMjY0MzZjODk4Yzg5MzA1MDc0OGRlM2M3ZWZmZmU4MTQ1MzNhOTJlZDZhYjE0YWRjYzQzYWQ1OTY1NWRlYjk0MzUwZjcyODI5ZGFkMThkMWQ3NjJmNmQwNjJmMTgxNWQzYjhmZGY4ZWJkM2RjZGY5YWIwM2VjNWYzMjczMzE5MGVlMmNiMDZhNzJjZDdj'
}
data ={
'from': 'zh',
'to': 'en',
'query': word,
'transtype': 'realtime',
'simple_means_flag': '3',
'sign': b,
'token': 'f98a39c77614053e127137fbe1e5816c',
'domain': 'common',
'ts': ts
}
res = requests.post(url,headers =header ,data=data)
print(res.json())

最终实现效果
在这里插入图片描述

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值