基于百度通用翻译API的一个翻译小工具

时间:2024-03-02 10:20:15

前几天写了一个简单的翻译小工具,是基于有道翻译的,不过那个翻译接口有访问限制,超过一定次数后会提示访问过于频繁,偶然发现百度翻译API如果月翻译字符少于200万是不收取费用的,所以就注册了一个百度开发者账号,把当前翻译接口替换为百度翻译接口。

1.首先注册一个百度个人开发者账号

http://api.fanyi.baidu.com/api/trans/product/index

注册完成后会得到一个APP ID和密钥

2.打开“文档与支持/通用翻译API技术文档”

这里面介绍了如何调用百度翻译接口

下面是完整的代码

第59行写明如何调用百度翻译API以及参数的构造方法,同时相对之前的版本,修改了下页面按钮的布局

  1 # -*- coding:utf-8 -*-
  2 
  3 import requests
  4 from requests.exceptions import RequestException
  5 import tkinter as tk
  6 from tkinter import ttk
  7 import hashlib
  8 import random
  9 
 10 class Translate():
 11     def __init__(self):
 12         self.window = tk.Tk()  #创建window窗口
 13         self.window.title("简易翻译器")  # 定义窗口名称
 14         # self.window.resizable(0,0)  # 禁止调整窗口大小
 15         self.menu = ttk.Combobox(self.window,width=6)
 16         self.input = tk.Entry(self.window, width=80)  # 创建一个输入框,并设置尺寸
 17         self.info = tk.Text(self.window, height=20)   # 创建一个文本展示框,并设置尺寸
 18 
 19         self.menu[\'value\'] = (\'转成繁体中文\',\'转成英文\', \'转成日文\', \'转成韩文\', \'转成阿拉伯文\')
 20         self.menu.current(0)
 21 
 22         # 添加一个按钮,用于触发翻译功能
 23         self.t_button = tk.Button(self.window, text=\'翻译\', relief=tk.RAISED, width=8, height=1, command=self.fanyi)
 24         # 添加一个按钮,用于触发清空输入框功能
 25         self.c_button1 = tk.Button(self.window, text=\'清空输入\', relief=tk.RAISED, width=8, height=1, command=self.cle_e)
 26         # 添加一个按钮,用于触发清空输出框功能
 27         self.c_button2 = tk.Button(self.window, text=\'清空输出\', relief=tk.RAISED,width=8, height=1, command=self.cle)
 28         # 添加一张图标
 29         self.image_file = tk.PhotoImage(file=\'py128.png\')
 30         self.label_image = tk.Label(self.window, image=self.image_file)
 31 
 32     def gui_arrang(self):
 33         """完成页面元素布局,设置各部件的位置"""
 34         self.input.grid(row=0,column=0,padx=5,pady=5)
 35         self.info.grid(row=1,rowspan=2,column=0,padx=5,pady=5)
 36 
 37         self.t_button.grid(row=0,column=1,padx=5,pady=5,sticky=tk.W)
 38         self.c_button1.grid(row=0,column=2,padx=0,pady=5,sticky=tk.W)
 39         self.c_button2.grid(row=0,column=3,padx=5,pady=5,sticky=tk.W)
 40 
 41         self.menu.grid(row=1, column=1, padx=5, pady=5, rowspan=2, sticky=tk.NW)
 42 
 43         self.label_image.grid(row=2, column=1,columnspan=3,sticky=tk.N)
 44 
 45     def tran_type(self):
 46         type = None
 47         if self.menu.get() == "转成繁体中文":
 48             type = "cht"
 49         if self.menu.get() == "转成英文":
 50             type = "en"
 51         elif self.menu.get() == "转成日文":
 52             type = "jp"
 53         elif self.menu.get() == "转成韩文":
 54             type = "kor"
 55         elif self.menu.get() == "转成阿拉伯文":
 56             type = "ara"
 57         return type
 58 
 59     def fanyi(self):
 60         """定义一个函数,完成翻译功能"""
 61 
 62         original_str = self.input.get()  # 定义一个变量,用来接收输入框输入的值
 63         appid = \'XXXX\'  # 你的appid
 64         secretKey = \'XXXX\'  # 你的密钥
 65 
 66         salt = random.randint(32768, 65536)   # 生成一个随机数
 67         sign = appid + original_str + str(salt) + secretKey  # 将appid和要翻译的字符、随机数、密钥组合成一个原始签名
 68         m = hashlib.new("md5")  
 69         m.update(sign.encode(encoding="utf-8"))  # 注意使用utf-8编码
 70         msign = m.hexdigest() # 得到原始签名的MD5值
 71 
 72         data = {
 73             "q": original_str,   
 74             "from": "auto",
 75             "to": self.tran_type(),
 76             "appid": appid,
 77             "salt": salt,
 78             "sign": msign
 79         }
 80         url = "http://api.fanyi.baidu.com/api/trans/vip/translate"
 81         try:
 82             r = requests.get(url, params=data)
 83             if r.status_code == 200:
 84                 result = r.json()
 85                 translate_result = result["trans_result"][0]["dst"]
 86                 self.info.delete(1.0, "end")  # 输出翻译内容前,先清空输出框的内容
 87                 self.info.insert(\'end\',translate_result)  # 将翻译结果添加到输出框中
 88         except RequestException:
 89             self.info.insert(\'end\', "发生错误")
 90     def cle(self):
 91         """定义一个函数,用于清空输出框的内容"""
 92         self.info.delete(1.0,"end")  # 从第一行清除到最后一行
 93 
 94     def cle_e(self):
 95         """定义一个函数,用于清空输入框的内容"""
 96         self.input.delete(0,"end")
 97 
 98 def main():
 99     t = Translate()
100     t.gui_arrang()
101     tk.mainloop()
102 
103 if __name__ == \'__main__\':
104     main()

最终效果如下

ps.下面是通用翻译API服务的使用详情,每天都会统计