Hi,大家好,我是半亩花海。本项目旨在利用 Python 语言实现一个简单的有道翻译工具。有道翻译是一款常用的在线翻译服务,能够实现多种语言的互译,提供高质量的翻译结果。
目录
一、项目功能
二、注意事项
三、代码解析
1. 导入必要的库
2. 设置请求头部信息
3. 获取用户输入
4. 生成加密所需的时间戳和盐值
5. 计算签名
6. 构造请求数据
7. 发送 POST 请求
8. 解析响应并输出结果
四、结果展示
五、完整代码
一、项目功能
- 用户输入要翻译的单词或短语。
- 程序通过 HTTP 请求向有道翻译服务发送请求,获取翻译结果。
- 解析服务器返回的 JSON 数据,提取翻译结果并显示给用户。
二、注意事项
- 需要在代码中填写有效的 Cookie 信息,否则请求可能被拒绝。
- 需要确保网络连接畅通,否则无法发送请求和接收响应。
三、代码解析
1. 导入必要的库
导入了需要使用的库,包括发送 HTTP 请求的 requests 库,生成时间戳的 time 库,生成随机数的 random 库以及进行 MD5 加密的 hashlib 库中的 md5 函数。
import requests # 用于发送 HTTP 请求和接收响应
import time # 用于生成时间戳
import random # 用于生成随机数
from hashlib import md5 # 用于进行 MD5 加密
2. 设置请求头部信息
定义了请求头部信息的字典,包括 Cookie、Host、Origin、Referer 和 User-Agent 等字段,用于模拟浏览器发送请求。
headers = {
'Cookie': 'OUTFOX_SEARCH_USER_ID=-690213934@10.108.162.139; OUTFOX_SEARCH_USER_ID_NCOO=1273672853.5782404; fanyi-ad-id=308216; fanyi-ad-closed=1; ___rl__test__cookies=1659506664755',
'Host': 'fanyi.youdao.com',
'Origin': 'https://fanyi.youdao.com',
'Referer': 'https://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
3. 获取用户输入
通过 input()
函数获取用户输入的要翻译的单词或短语,并将其存储在名为 key
的变量中。
key = input("请输入你要翻译的单词:")
4. 生成加密所需的时间戳和盐值
使用 time.time()
获取当前时间戳,乘以 100 并转换为字符串,生成时间戳 lts
;然后使用 random.randint()
生成一个随机数,并与时间戳拼接成盐值 salt
。
lts = str(int(time.time() * 100))
salt = lts + str(random.randint(0, 9))
5. 计算签名
根据有道翻译的签名算法,构造签名所需的字符串 sign_data
,包括固定字符串、待翻译的单词、盐值和固定字符串。然后使用 md5()
函数对 sign_data
进行加密,并将结果转换为十六进制字符串,得到签名 sign
。
sign_data = 'fanyideskweb' + key + salt +'Ygy_4c=r#e#4EX^NUGUc5'
sign = md5(sign_data.encode()).hexdigest()
6. 构造请求数据
构造了一个包含翻译所需参数的字典 data
,包括翻译文本 i
、源语言 from
、目标语言 to
、smartresult、client、salt、sign、lts、bv、doctype、version、keyfrom 和 action 等信息。
data = {
'i': key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': lts,
'bv': 'f0819a82107e6150005e75ef5fddcc3b',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
7. 发送 POST 请求
使用 requests.post()
方法发送 POST 请求,参数包括请求地址 url
、请求头部信息 headers
和请求数据 data
,并将响应保存在 response
变量中。
url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
response = requests.post(url, headers=headers, data=data)
8. 解析响应并输出结果
输出了服务器返回的 JSON 格式的数据,其中包含翻译结果。
print(response.text)
四、结果展示
五、完整代码
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import requests
import time
import random
from hashlib import md5
headers = {
'Cookie': 'OUTFOX_SEARCH_USER_ID=-690213934@10.108.162.139; OUTFOX_SEARCH_USER_ID_NCOO=1273672853.5782404; fanyi-ad-id=308216; fanyi-ad-closed=1; ___rl__test__cookies=1659506664755',
'Host': 'fanyi.youdao.com',
'Origin': 'https://fanyi.youdao.com',
'Referer': 'https://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
key = input("请输入你要翻译的单词:")
lts = str(int(time.time() * 100))
salt = lts + str(random.randint(0, 9))
sign_data = 'fanyideskweb' + key + salt +'Ygy_4c=r#e#4EX^NUGUc5'
sign = md5(sign_data.encode()).hexdigest()
data = {
'i': key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
# 时间戳 1970 秒
'salt':salt,
# 加密
'sign': sign,
# 时间戳
'lts': lts,
# 加密的数据
'bv': 'f0819a82107e6150005e75ef5fddcc3b',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
# 获取到资源地址
url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
response = requests.post(url, headers=headers, data=data)
print(response.text)