用Python做一個翻譯軟體
來源 | Ahab雜貨鋪(ID:PythonLearningCamp)
前兩天吃了平哥的一波狗糧,他給女朋友寫了一個翻譯軟體,自己真真切切的感受到了程序員的浪漫。在學習requests請求的時候做過類似的Demo,給百度翻譯發送一個post請求可以實現任意片語的翻譯,利用周六周日將那段代碼進行了進一步優化加了一個交互界面,有了今天的翻譯軟體。
程序介紹
先上圖讓大家感受一下
程序的功能很簡單,可以從三個主流翻譯器中選擇任意的翻譯器進行單詞和句子的翻譯,使用 PyQt5 模塊實現人機交互,用requests模塊發送請求,並將翻譯結果返回給用戶。
具體實現
用百度翻譯來舉例
任意的進行翻譯來查看頁面信息。
從圖片中可以發現這是一個post請求,請求頭的數據在的圖片中也有較清楚的顯示。
我們需要在添加上面的數據,其中 simple_means_flag 為固定量,query 代表待翻譯的詞,根據這些信息我們寫個簡單的代碼測試一下。
1importrequests
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 的值,這個值在翻譯首頁獲取一下就可以。
js = js.replace(""null !== i ? i : (i = window[l] ||"") ||"""",gtk)
上邊的步驟完成以後我們就可以愉快的進行翻譯了。
關於如何破解 sign 可以參考這篇博文:
https://blog.csdn.net/master_ning/article/details/81002474
圖形化界面用的是 pyQt5 這個模塊,實現起來不難。
1classDemo(QWidget):
2def__init__(self, parent=None):
3super().__init__()
4self.setWindowTitle("翻譯軟體-公眾號: Ahab雜貨鋪")
5self.Label1 = QLabel("原文")
6self.Label2 = QLabel("譯文")
7self.LineEdit1 = QLineEdit()
8self.LineEdit2 = QLineEdit()
9self.translateButton1 = QPushButton()
10self.translateButton2 = QPushButton()
11self.translateButton3 = QPushButton()
12self.translateButton1.setText("百度翻譯")
13self.translateButton2.setText("有道翻譯")
14self.translateButton3.setText("谷歌翻譯")
15self.grid = QGridLayout()
16self.grid.setSpacing(12)
17self.grid.addWidget(self.Label1,1,)
18self.grid.addWidget(self.LineEdit1,1,1)
19self.grid.addWidget(self.Label2,2,)
20self.grid.addWidget(self.LineEdit2,2,1)
21self.grid.addWidget(self.translateButton1,1,2)
22self.grid.addWidget(self.translateButton2,2,2)
23self.grid.addWidget(self.translateButton3,3,2)
24self.setLayout(self.grid)
25self.resize(400,150)
26self.translateButton1.clicked.connect(lambda :self.translate(api="baidu"))
27self.translateButton2.clicked.connect(lambda :self.translate(api="youdao"))
28self.translateButton3.clicked.connect(lambda :self.translate(api="google"))
29self.bd_translate = baidu()
30self.yd_translate = youdao()
31self.gg_translate = google()
32deftranslate(self, api="baidu"):
33word =self.LineEdit1.text()
34ifnotword:
35return
36ifapi =="baidu":
37results =self.bd_translate.translate(word)
38elif api =="youdao":
39results =self.yd_translate.translate(word)
40elif api =="google":
41results =self.gg_translate.translate(word)
42else:
43raise RuntimeError("Api should be or or ...")
44forresultinresults:
45self.LineEdit2.setText(result)
pyQt5官方文檔:
https://pypi.org/project/PyQt5/
最後就是打包發布,使用pyinstaller傻瓜式操作即可完成。程序雖小五臟俱全,技術難點還是在爬蟲那塊的處理。希望這個小程序能給你帶來一點幫助。
(本文為AI科技大本營轉載文章,轉載請聯繫作者。)
徵稿
※20分鐘教你搞懂Git!
※Windows 7時代即將終結!
TAG:AI科技大本營 |