专栏首页小詹同学用Python做一个翻译软件

用Python做一个翻译软件

转载自Ahab杂货铺

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

程序介绍

先上图让大家感受一下

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

具体实现

百度翻译来举例

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

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

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

 1import requests
 2
 3headers={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"}
 4post_data={
 5'query': 'Ahab杂货铺',
 6'from': 'zh',
 7'to': 'en',
 8'sign': '413120.175857',
 9'token':'64d8ce70799b54833f56b43f9d6eb3b4'
10}
11
12post_url="https://fanyi.baidu.com/v2transapi"
13r=requests.post(post_url,data=post_data,headers=headers)
14print(r.content.decode())

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

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

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

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

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

1js = js.replace('\'null !== i ? i : (i = window[l] || "") || ""\'',gtk)

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

关于如何破解sign可以参考这篇博文:https://blog.csdn.net/master_ning/article/details/81002474

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

 1class Demo(QWidget):
 2    def __init__(self, parent=None):
 3        super().__init__()
 4        self.setWindowTitle('翻译软件-公众号: Ahab杂货铺')
 5        self.Label1 = QLabel('原文')
 6        self.Label2 = QLabel('译文')
 7        self.LineEdit1 = QLineEdit()
 8        self.LineEdit2 = QLineEdit()
 9        self.translateButton1 = QPushButton()
10        self.translateButton2 = QPushButton()
11        self.translateButton3 = QPushButton()
12        self.translateButton1.setText('百度翻译')
13        self.translateButton2.setText('有道翻译')
14        self.translateButton3.setText('谷歌翻译')
15        self.grid = QGridLayout()
16        self.grid.setSpacing(12)
17        self.grid.addWidget(self.Label1, 1, 0)
18        self.grid.addWidget(self.LineEdit1, 1, 1)
19        self.grid.addWidget(self.Label2, 2, 0)
20        self.grid.addWidget(self.LineEdit2, 2, 1)
21        self.grid.addWidget(self.translateButton1, 1, 2)
22        self.grid.addWidget(self.translateButton2, 2, 2)
23        self.grid.addWidget(self.translateButton3, 3, 2)
24        self.setLayout(self.grid)
25        self.resize(400, 150)
26        self.translateButton1.clicked.connect(lambda : self.translate(api='baidu'))
27        self.translateButton2.clicked.connect(lambda : self.translate(api='youdao'))
28        self.translateButton3.clicked.connect(lambda : self.translate(api='google'))
29        self.bd_translate = baidu()
30        self.yd_translate = youdao()
31        self.gg_translate = google()
32    def translate(self, api='baidu'):
33        word = self.LineEdit1.text()
34        if not word:
35            return
36        if api == 'baidu':
37            results = self.bd_translate.translate(word)
38        elif api == 'youdao':
39            results = self.yd_translate.translate(word)
40        elif api == 'google':
41            results = self.gg_translate.translate(word)
42        else:
43            raise RuntimeError('Api should be <baidu> or <youdao> or <google>...')
44        for result in results:
45            self.LineEdit2.setText(result)

pyQt5官方文档:https://pypi.org/project/PyQt5/

最后就是打包发布,使用pyinstaller傻瓜式操作即可完成。程序虽小五脏俱全,技术难点还是在爬虫那块的处理。希望这个小程序能给你带来一点帮助。

写在最后

代码已经上传到Github点击阅读原文即可浏览。

为您推荐

吴恩达 deeplearning.ai 经典总结:28 张精炼图+思维导图(附下载链接)

本文分享自微信公众号 - 小詹学Python(xiaoxiaozhantongxue)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何用 Python 打飞机 ?

    前言:python 除了生孩子 ,啥都会 。包括打飞机 !今天小詹的一位读者就来教你如何用 python 打飞机 !

    小小詹同学
  • 520这天,我突然意识到,她根本配不上我这么聪明的男人!

    在这个重大节日---520情人节来临之际,我却是显得更加寂寞无聊。看着那张长图有点不爽(关键是朋友圈狗粮吃得有点多),于是.........就有了下面这张动态图...

    小小詹同学
  • 爬取数据不保存,就是耍流氓 !

    OK,通过前面两篇文章《爬虫利器初体验(1)》《听说你的爬虫又被封了?(2)》,我们初体验也过了,爬虫代码健壮性也升级为 PLUS 了。都分析到这个地步了,是不...

    小小詹同学
  • 三、wss连接B站弹幕

    py3study
  • unslider源码分析

    根据Bootstrap中文网的介绍,Unslider一个超小的 jQuery轮播(slider)插件,参照这个汉化版的介绍页面,这个插件有你需要的优点,但是本...

    用户3579639
  • MJRefresh源码剖析与学习

    建议查看原文:https://www.jianshu.com/p/23c876f8ae39(不定时更新)

    Dwyane
  • PyQt5 动画类--跳舞的火柴人

    PyQt5.QtCore中的 QPropertyAnimation可以实现动画功能。

    用户6021899
  • 福利来啦,送给大家一个小游戏的源码,不要错过哟(复制粘贴运行即可玩)

    从小到大玩过很多的游戏,在我小时候,能玩游戏的地方不多,那时玩游戏都是偷摸玩的,只要是个游戏就觉得非常有趣,比较经典的有魂斗罗,拳皇,超级玛丽,贪吃蛇,俄罗斯方...

    松鼠爱吃饼干
  • 喜欢的歌曲不在一个平台怎么办?你需要一个自己专属的音乐播放器

    网易云音乐,QQ音乐,酷狗音乐,是我们经常会用到的音乐软件,当然有时候我们因为一首歌,需要在各大音乐平台上跳转,那么我们完全可以使用python自己打造一款音乐...

    松鼠爱吃饼干
  • python实现队列

    队列是一种先进先出的数据类型,它的跟踪原理类似于在超市收银处排队,队列里的的第一个人首先接受服务,新的元素通过入队的方式添加到队列的末尾,而出队就是将队列的头元...

    一墨编程学习

扫码关注云+社区

领取腾讯云代金券