相关思路及步骤:
1. 导入所需的库:hashlib(用于MD5加密)、json(用于处理返回的JSON数据)、random(用于生成随机数)、time(用于获取时间戳)、requests(用于发送HTTP请求)和tkinter(用于创建GUI界面)。如果没有下载,可使用以下指令进行下载:
pip install packagename/包名 # example pip install requests
2. 定义一个名为Translate的类,其中包含一个构造函数、一个清空输入框的函数、一个清空输出框的函数和一个翻译函数。
3. 在构造函数中,创建一个名为window的tkinter窗口,设置窗口标题为“英汉互译”,禁止调整窗口大小,创建一个输入框、一个文本展示框和三个按钮。
4. 定义一个名为gui_arrang的函数,用于完成页面元素布局,设置各部件的位置。
5. 定义一个名为fanyi的函数,用于实现翻译功能。首先获取输入框中的文本,然后获取时间戳和随机数,将它们组合成一个字符串作为salt。对输入的文本进行MD5加密,得到sign。然后发送POST请求到翻译接口,获取返回的JSON数据,解析后得到翻译结果。最后将翻译结果添加到输出框中。
6. 定义一个名为cle的函数,用于清空输出框的内容。
7. 定义一个名为cle_e的函数,用于清空输入框的内容。
8. 在主函数main中,创建一个Translate对象,调用gui_arrang函数,进入tkinter的主循环。
代码如下:
import hashlib
import json
import random
import time
import requests
from requests.exceptions import RequestException
import tkinter as tk
class Translate:
def __init__(self):
# 创建window窗口
self.window = tk.Tk()
# 定义窗口名称
self.window.title("英汉互译")
# 禁止调整窗口大小
self.window.resizable(0, 0)
# 创建一个输入框,并设置尺寸
self.input = tk.Entry(self.window, width=80, font='楷体')
# 创建一个文本展示框,并设置尺寸
self.info = tk.Text(self.window, height=10, font='楷体')
# 添加一个按钮,
self.t_button = tk.Button(self.window, text="翻译", width=10, height=1, font='楷体', command=self.fanyi)
# 添加一个按钮,
self.c_button1 = tk.Button(self.window, text="清空输入", width=10, height=1, font='楷体', command=self.cle_e)
# 添加一个按钮,
self.c_button2 = tk.Button(self.window, text="清空输出", width=10, height=1, font='楷体', command=self.cle)
def gui_arrang(self):
"""完成页面元素布局,设置各部件的位置"""
self.input.grid(row=0, sticky="W", padx=1)
self.info.grid(row=1)
self.t_button.grid(row=2, column=0, padx=2)
self.c_button1.grid(row=3, column=0, padx=2)
self.c_button2.grid(row=4, column=0, padx=2)
def fanyi(self):
words = self.input.get()
# 获取时间戳
lts = str(int(time.time() * 1000))
# 获取一个0~10的随机整数,并转化为字符类型
num = str(random.randint(0, 10))
salt = lts + num
# md5加密
sign = hashlib.md5(("fanyideskweb" + words + salt + "Ygy_4c=r#e#4EX^NUGUc5")
.encode()).hexdigest()
# 请求网址参数,作为翻译的数据传入请求接口
data = {
"i": words,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": salt,
"sign": sign,
"lts": lts,
"bv": "37dd3c60883fcf3fdfbbfa8fa2c4565d",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
# 请求网址
# 请求头,模拟浏览器发送请求
url = ' https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
header = {
"Referer": 'https://fanyi.youdao.com/',
"cookie": 'OUTFOX_SEARCH_USER_ID=-508254706@10.110.96.160; '
'OUTFOX_SEARCH_USER_ID_NCOO=355848745.519305; ___rl__test__cookies=1668344926319',
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.42'
}
try:
# 向浏览器发送请求
res = requests.post(url, data=data, headers=header)
# 返回json数据解析
res_dic = json.loads(res.text)
# print(res_dic)
word = res_dic["translateResult"][0][0]["tgt"]
# 输出翻译内容前,先清空输出框的内容
self.info.delete(1.0, "end")
# 将翻译结果添加到输出框中
try:
# 获取到res_dic列表中["smartResult"]["entries"]下的所有内容
words_list = res_dic["smartResult"]["entries"][1:]
word_list = [word.strip() for word in words_list]
# print(word_list)
for i in range(0, len(word_list)):
self.info.insert('end', word_list[i])
self.info.insert('end', '\n')
except:
self.info.insert('end', word)
except RequestException:
self.info.insert('end', "发生错误")
def cle(self):
"""定义一个函数,用于清空输出框的内容"""
self.info.delete(1.0, "end") # 从第一行清除到最后一行
def cle_e(self):
"""定义一个函数,用于清空输入框的内容"""
self.input.delete(0, "end")
# 测试函数
def main():
t = Translate()
t.gui_arrang()
tk.mainloop()
# 调试
if __name__ == '__main__':
main()
效果展示: