实现有道翻译的反爬虫的破解

本文介绍了如何实现有道翻译的反爬虫破解,包括获取接口、分析请求头、处理时间戳和盐值(salt)、签名(sign)的生成,以及最终的完整代码实现。

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

1、实现的功能

2、实现步骤

      (1)、获取接口

                  登录有道翻译  ,获取请求地址:Requests url  ,REquest headers,

                    Form data (表单数据)

      (2)、编写程序

            

import  requests
keyword = input("请输入需要翻译的单词:")
data_list={
    'i': keyword,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15562423019590',
    'sign':'66954fe3efeb3ec6df29bbdb5714c7468' ,
    'ts':'1556242301959',
    'bv': '327689fccf65d35fd25955c1807f5d2d',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME'
}
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
response = requests.post(url = url,data = data_dic)
print(response.text)

3、此时服务器会返回一个错误

{"errorCode":50}

说明肯定是有什么地方是不一样的,光加data是不行的,还需要加headers

那该怎么办呢?

解决办法如下:需要加上头请求

4、寻找请求头有什么不同,以job为例,分别输入 j 、jo、 job来进行比较

通过对比,可以发现规律:content-length = 233+要翻译单词的长度

5、修改代码

 

 

import requests
 
 
keyword=input('请输入要翻译的单词:')
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
 
headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Length': str(233+len(keyword)),
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-470656831@10.168.8.76; JSESSIONID=aaaT594x_2P98-gLurxPw; OUTFOX_SEARCH_USER_ID_NCOO=661300740.1028955; ___rl__test__cookies=1556242425186',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}
 
data_dic = {
    'i': keyword,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15562424251945',
    'sign': '8a649f0ce7088b3f64b3ef6c4a63732c',
    'ts': '1556242425194',
    'bv': '5933be86204903bb334bf023bf3eb5ed',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}
response = requests.post(url=url, data=data_dic,headers=headers)
print(response.text)

测试:手动输入需要翻译的单词后,会发现发现只有写好的job单词可以翻译,其他的单词都不能被翻译出来还会出现错误。

经过分析,此时只有输入的内容有些不一样,所以是Form Data哪里有问题,

继续分析表单数据

 

  时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。
 

import time

t = time.time()  # 1556345652.0227659
t = int(t*1000)  # 1556345786259
print(t)

时间戳是随着前端自动变化的,可以实现的就是js,所以我们要找到js文件

7、查找前端的js文件

分析js文件,寻找(salt,ts,sign),经分析比对发现在fanyi.min.js中

为了方便好看,将js文件转换一下,通过现在代码格式化

将代码复制到fanyi,js

在里面查找 salt,


function(e, t) {
    var n = e("./jquery-1.7");
    e("./utils");
    e("./md5");
    var r = function(e) {
        var t = n.md5(navigator.appVersion),
        r = "" + (new Date).getTime(),
        i = r + parseInt(10 * Math.random(), 10);
        return {
            ts: r,
            bv: t,
            salt: i,
            sign: n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE")
        }
    };

(1)ts的值为 r : 获取到当前的时间戳,并把它转换为字符串

(2)bv的值为 t : t是把navigator.appVersion进行md5加密

由于我们不知道navigator.appVersion是啥,在前端的console输出一下

 

每次提交数据都不一样

(3)salt的值为 i : 把字符串 r 和从1 到10里面的随机数拼接产生的字符串

字符串+整型数字=直接拼接成字符串

eg:   'abcd'+2='abcd2'

(4)sign的值为对后面的字符串进行md5加密

e 是需要翻译的单词

8、修改后的完整代码

import requests
import time
import hashlib
import random

# 生成md5 字符串
def getMd5(value):
    md5 = hashlib.md5()
    md5.update(bytes(value,encoding='utf-8'))
    md5_str = md5.hexdigest()
    return md5_str
if __name__ == "__main__":
    keyword = input("请输入你要翻译的单词:")

    # 生成加密盐
    r = str(int(time.time()*1000))
    salt = r + str(int(random.random()*10))

    # 生成 sign
    value = "fanyideskweb" + keyword + salt + "@6f#X3=cCuncYssPsuRUE"
    md5_str = getMd5(value)

    #  生成header
    headers ={
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Content-Length': str(233+len(keyword)),
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=1386570177.4402287; OUTFOX_SEARCH_USER_ID="-950805547@10.168.11.69"; _ga=GA1.2.847256424.1555650976; JSESSIONID=aaaEH212V6-ad4u4_5CPw; YOUDAO_MOBILE_ACCESS_TYPE=0; ___rl__test__cookies=1556340146371',
        'Host': 'fanyi.youdao.com',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Mobile Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
}
    # 生成表单数据
    data_list={
    'i': keyword,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': salt,
    'sign': md5_str,
    'ts':r ,
    'bv': '327689fccf65d35fd25955c1807f5d2d',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME'
}
    # 接口地址
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    # 发起网络请求
    response = requests.post(url=url,data=data_list,headers=headers)
    data = response.json()['translateResult']
    for i in data:
        for j in i:
            print(j['src'],":",j["tgt"])

 

结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值