當前位置:
首頁 > 科技 > 用Python做一個翻譯軟體

用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科技大本營轉載文章,轉載請聯繫作者。)

徵稿


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI科技大本營 的精彩文章:

20分鐘教你搞懂Git!
Windows 7時代即將終結!

TAG:AI科技大本營 |