导语
下班回到家,看到对象在做饭,小姨子好像在学习,小姨子就是我对象的妹妹!现在上高一,长大之后估计是个没人胚子.听我对象讲,就现在在学校都蛮多男生追她了!吃饭的时候,对象给我下达了一项任务,就是教小姨子学英语!那玩意我早忘记了,现在就记得一些普遍的单词和代码用到的词语!
但是为了显示我这个做姐夫的是博学多才,这点小事肯定不能推脱撒!主要是不想洗碗,那我就先随便敲几行打码写个翻译工具出来先,让小姨子好好崇拜崇拜她的这个姐夫!
开始,如果阅读量高,我决定让你们见识一下什么是纯情的小妹妹!哈哈哈
用到的编程语言当然是Python啦 ,不管怎么说它是世界上最好的语言,毋庸置疑嘛!
原理
百度翻译和有道翻译的原理就不再赘述了(前面讲过了的,需要视频或者源代码的童鞋记得拉到文末),这里就简单讲讲谷歌翻译的爬取原理。
简单测试一下,发现翻译结果是请求了下图这个链接返回的:
该请求需要添加的参数很多,但只有:
sl,tl,tk,q
这四个参数是不固定的。其中q代表待翻译的词,sl代表翻译的源语种,可设为auto(即自动检测),tl代表翻译的目标语种,为方便起见,这里只支持中译英(此时tl为en)和英译中(此时tl为zh-CN)。实现的逻辑为若待翻译词汇中含中文,则tl为en,否则为zh-CN。
最后再来说说tk,tk的是由一段js代码生成的,和百度翻译类似,q值决定了tk值,相关的js代码在一个名为desktop_module_main.js的js文件中:
然后我偷懒直接从参考文献中copy了修改后的js代码来生成所需的tk值,最后实现谷歌翻译内容爬取的源代码如下图所示:
然后将谷歌、有道、百度翻译整合起来:
大功告成~
是不是非常简单,简直巴适客滴博!
效果
接下来就是见证奇迹的时候:
附源码
'''
Function:
翻译软件V0.1.2,支持:
--百度翻译
--有道翻译
--谷歌翻译
'''
import re
import js
import sys
import time
import js2py
import random
import hashlib
import requests
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
'''百度翻译类'''
class baidu():
def __init__(self):
self.session = requests.Session()
self.session.cookies.set('BAIDUID', '19288887A223954909730262637D1DEB:FG=1;')
self.session.cookies.set('PSTM', '%d;' % int(time.time()))
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
self.data = {
'from': '',
'to': '',
'query': '',
'transtype': 'translang',
'simple_means_flag': '3',
'sign': '',
'token': '',
'domain': 'common'
}
self.url = 'https://fanyi.baidu.com/v2transapi'
self.langdetect_url = 'https://fanyi.baidu.com/langdetect'
def translate(self, word):
self.data['from'] = self.detectLanguage(word)
self.data['to'] = 'en' if self.data['from'] == 'zh' else 'zh'
self.data['query'] = word
self.data['token'], gtk = self.getTokenGtk()
self.data['token'] = '6482f137ca44f07742b2677f5ffd39e1'
self.data['sign'] = self.getSign(gtk, word)
res = self.session.post(self.url, data=self.data)
return [res.json()['trans_result']['data'][0]['result'][0][1]]
def getTokenGtk(self):
url = 'https://fanyi.baidu.com/'
res = requests.get(url, headers=self.headers)
token = re.findall(r"token: '(.*?)'", res.text)[0]
gtk = re.findall(r";window.gtk = ('.*?');", res.text)[0]
return token, gtk
def getSign(self, gtk, word):
evaljs = js2py.EvalJs()
js_code = js.bd_js_code
js_code = js_code.replace('null !== i ? i : (i = window[l] || "") || ""', gtk)
evaljs.execute(js_code)
sign = evaljs.e(word)
return sign
def detectLanguage(self, word):
data = {
'query': word
}
res = self.session.post(self.langdetect_url, headers=self.headers, data=data)
return res.json()['lan']
'''有道翻译类'''
class youdao():
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
'Referer': 'http://fanyi.youdao.com/',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-481680322@10.169.0.83;'
}
self.data = {
'i': None,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': None,
'sign': None,
'ts': None,
'bv': None,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
self.url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
def translate(self, word):
ts = str(int(time.time()*10000))
salt = ts + str(int(random.random()*10))
sign = 'fanyideskweb' + word + salt + '97_3(jkMYg@T[KZQmqjTK'
sign = hashlib.md5(sign.encode('utf-8')).hexdigest()
bv = '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
bv = hashlib.md5(bv.encode('utf-8')).hexdigest()
self.data['i'] = word
self.data['salt'] = salt
self.data['sign'] = sign
self.data['ts'] = ts
self.data['bv'] = bv
res = requests.post(self.url, headers=self.headers, data=self.data)
return [res.json()['translateResult'][0][0].get('tgt')]
'''Google翻译类'''
class google():
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
self.url = 'https://translate.google.cn/translate_a/single?client=t&sl=auto&tl={}&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&tk={}&q={}'
def translate(self, word):
if len(word) > 4891:
raise RuntimeError('The length of word should be less than 4891...')
languages = ['zh-CN', 'en']
if not self.isChinese(word):
target_language = languages[0]
else:
target_language = languages[1]
res = requests.get(self.url.format(target_language, self.getTk(word), word), headers=self.headers)
return [res.json()[0][0][0]]
def getTk(self, word):
evaljs = js2py.EvalJs()
js_code = js.gg_js_code
evaljs.execute(js_code)
tk = evaljs.TL(word)
return tk
def isChinese(self, word):
for w in word:
if '\u4e00' <= w <= '\u9fa5':
return True
return False
'''简单的Demo'''
class Translator(QWidget):
def __init__(self, parent=None, **kwargs):
super(Translator, self).__init__(parent)
self.setWindowTitle('翻译软件-编程女码农')
self.setWindowIcon(QIcon('data/icon.jpg'))
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()
self.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>...')
self.LineEdit2.setText(';'.join(results))
'''run'''
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Translator()
demo.show()
sys.exit(app.exec_())j
完美!破费特!哈哈哈
如果你用得到的话可以直接拿走,点击领取。不方便点链接的加群:948351247