视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python实现翻译软件
2020-11-27 14:11:04 责编:小采
文档


本篇文章主要讲讲述了用Python实现翻译软件,超级实用,赶紧将代码收藏起来试试吧,希望对你学习Python有所启发哦!

前两天吃了平哥的一波,他给女朋友写了一个翻译软件,自己真真切切的感受到了程序员的浪漫。在学习requests请求的时候做过类似的Demo,给百度翻译发送一个post请求可以实现任意词组的翻译,利用周六周日将那段代码进行了进一步优化加了一个交互界面,有了今天的翻译软件。

程序介绍

先上图让大家感受一下

程序的功能很简单,可以从三个主流翻译器中选择任意的翻译器进行单词和句子的翻译,使用 PyQt5 模块实现人机交互,用requests模块发送请求,并将翻译结果返回给用户。

具体实现

用百度翻译来举例

任意的进行翻译来查看页面信息。

从图片中可以发现这是一个post请求,请求头的数据在的图片中也有较清楚的显示。

我们需要在添加上面的数据,其中 simple_means_flag 为固定量,query 代表待翻译的词,根据这些信息我们写个简单的代码测试一下。

import requests
headers={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win; x) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"}
post_data={
'query': 'Ahab杂货铺',
'from': 'zh',
'to': 'en',
'sign': '413120.175857',
'token':'d8ce70799b54833f56b43f9d6eb3b4'
}

post_url="https://fanyi.baidu.com/v2transapi"
r=requests.post(post_url,data=post_data,headers=headers)
print(r.content.decode())

运行以后输出下面的结果:

出现上面错误的原因就是sign和token这两个参数搞的鬼,先说token,token可以直接在百度翻译主页的源码里找到:

因为时间戳不同步所以直接请求百度翻译的主页获取到的 token 是用不了的,只能人为地把网页当前显示的 token 值复制下来然后赋值给代码里的 token。

sign 参数是根据翻译的内容而在前台生成的,如果发送的请求中,query 内容和 sign 不匹配,则收到的响应是 error。下面要做的就是破解百度翻译 sign。sign 是由一个 js 文件生成的,下图就是生成 sign 的 js 文件。

将这个代码放在格式化工具中重新排版一下,找到 sign 执行函数的代码,再用 execjs,执行这段 js 代码,在计算过程中还需要 gtk 的值,这个值在翻译首页获取一下就可以。

js = js.replace(

上边的步骤完成以后我们就可以愉快的进行翻译了。

图形化界面用的是 pyQt5 这个模块,实现起来不难。

class Demo(QWidget):
def __init__(self, parent=None):
super().__init__()
elf.setWindowTitle('翻译软件-公众号: Ahab杂货铺')
self.Label1 = QLabel('原文')
self.Label2 = QLabel('译文')
self.LineEdit1 = QLineEdit()
self.LineEdit2 = QLineEdit()
self.translateButton1 = QPushButton()
self.translateButton2 = QPushButton()
self.translateButton3 = QPushButton()
self.translateButton1.setText('百度翻译')
self.translateButton2.setText('有道翻译')
self.translateButton3.setText('谷歌翻译')
self.grid = QGridLayout()
self.grid.setSpacing(12)
self.grid.addWidget(self.Label1, 1, 0)
self.grid.addWidget(self.LineEdit1, 1, 1)
self.grid.addWidget(self.Label2, 2, 0)
self.grid.addWidget(self.LineEdit2, 2, 1)
self.grid.addWidget(self.translateButton1, 1, 2)
self.grid.addWidget(self.translateButton2, 2, 2)
self.grid.addWidget(self.translateButton3, 3, 2)
self.setLayout(self.grid)
self.resize(400, 150)
self.translateButton1.clicked.connect(lambda : self.translate(api='baidu'))
self.translateButton2.clicked.connect(lambda : self.translate(api='youdao'))
self.translateButton3.clicked.connect(lambda : self.translate(api='google'))
self.bd_translate = baidu()
elf.yd_translate = youdao()
self.gg_translate = google()
def translate(self, api='baidu'):
word = self.LineEdit1.text()
if not word:
 return
if api == 'baidu':
 results = self.bd_translate.translate(word)
elif api == 'youdao':
 results = self.yd_translate.translate(word)
elif api == 'google':
 results = self.gg_translate.translate(word)
else:
 raise RuntimeError('Api should be <baidu> or <youdao> or <google>...')
for result in results:
 self.LineEdit2.setText(result)

相关教程:Python视频教程

下载本文
显示全文
专题