用Python制作mini翻译器的实现示例
1.实例描述
在平时编程的过程中,会经常在网上翻译一些单词,本文使用Python制作一款翻译小工具,不仅可以自己用,还可以嵌入到程序当中。运行程序,效果如下图所示,在文本框输入英文或中文,单击翻译按钮即可翻译,并将翻译内容显示在下面的文本框中。单击保存按钮将输入内容和翻译内容保存到文本文件中以便日后复习。单击清空按钮,将清除文本框中的内容。
2.技术要点
利用requests模块获取有道词典web页面的post信息,获取需要的内容,通过tkinter模块生成窗口界面,使用文件读写方法将内容保存到文本文件中。
2.1有道词典这样的JS混淆加密应该怎么破
嘿嘿嘿,本文需要说说一些爬虫过程中需要斗智斗勇的事情了,这次咱们就来说说关于一些JS混淆加密的事。所谓JS,就是JavaScript,一种前端的脚本语言,一般情况下每个网站都需要JS来做一些数据交互,页面渲染等一些异步操作。当然,对于反爬的人来说,JS的用处还可以用来对一些数据进行加密。
今天咱们就以有道词典这个在线翻译的网站为例,看看他们是如何加密请求数据的,以及笔者是如何通过Python模拟请求从而获得关键数据的。
点击此处打开有道翻译的网站:
输入中文然后点击翻译按钮就会翻译出来英文,比如:
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
点击XHR/fetchBreakPoints右边的+号,然后把链接复制进去:
这时候再点击翻译按钮,突然,你的屏幕一灰,表示好事将近,我们成功打上了断点,也就是说,现在我们可以在请求之前做一些骚操作。
这时候我们将右边的CallStack展开,点t.translate进去:
这些,就是我们在点击翻译按钮之后,会调用到js里面的方法,从这里下手,来寻找参数是被如何加密的,
3.代码实现
用Python制作mini翻译器的具体步骤如下:
首先安装requests模块。使用pip命令安装,命令如下:
pipinstall--user-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.comrequests
导入相关模块,代码如下。
importtkinterastk importrequests importtime importhashlib importrandom
定义翻译函数,代码如下。
defget_ts():
"""
获取时间戳
:return:时间
"""
returnstr(int(time.time()*1000))
defget_bv():
"""
获取app版本并通过md5加密
:return:加密后的字符串
"""
navigator_appVersion='Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3'\
'904.108Safari/537.36'
m=hashlib.md5()
m.update(navigator_appVersion.encode('utf-8'))
returnm.hexdigest()
defget_salt(ts):
returnstr(ts)+str(int(random.random()*10))
defget_sign(salt):
str1=text1.get()#定义一个变量,用来接收输入文本框的值
str_data='fanyideskweb'+str1+salt+']BjuETDhU)zqSxf-=B#7m'
m=hashlib.md5()
m.update(str_data.encode('utf-8'))
returnm.hexdigest()
defget_form_data():
str1=text1.get()#定义一个变量,用来接收输入文本框的值
ts=get_ts()
salt=get_salt(ts)
form_data={
'i':str1,
'from':'AUTO',
'to':'AUTO',
'smartresult':'dict',
'client':'fanyideskweb',
'salt':str(salt),
'sign':get_sign(salt),
'ts':ts,
'bv':get_bv(),
'doctype':'json',
'version':'2.1',
'keyfrom':'fanyi.web',
'action':'FY_BY_CLICKBUTTION',
}
returnform_data
#定义翻译函数
deftranslate():
url="http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36',
'Referer':'http://fanyi.youdao.com/',
'Cookie':'OUTFOX_SEARCH_USER_ID_NCOO=173326173.72226533;OUTFOX_SEARCH_USER_ID="-1202396372@10.108.160.18";DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|;JSESSIONID=abcAjF-mxbKFQ_48uyLpx;__guid=204659719.1682486053682624500.1597281254731.5474;monitor_count=2;___rl__test__cookies=1597285713766'
}
response=requests.post(url=url,data=get_form_data(),headers=headers)
ifresponse.status_code==200:
result=response.json()
translate_result=result['translateResult'][0][0]['tgt']
text2.delete(1.0,"end")#清空输出文本框
text2.insert('end',translate_result)#将翻译结果添加到输出文本框中
定义写入文本txt的函数,代码如下。
#定义写入文本txt的函数
defwrite():
f1=open('translate.txt','a+')
f1.write(text1.get()+','+text2.get(0.0,tk.END))
定义清空文本框的函数,代码如下。
#定义清空文本框的函数 defdelete(): text1.delete(0,"end")#从第一行清除到最后一行 text2.delete(1.0,"end")
窗口界面设计,代码如下。
if__name__=='__main__':
window=tk.Tk()#创建window窗口
window.wm_attributes("-topmost",1)#置顶
window.title("AmoXiangmini翻译器")#定义窗口名称
window.resizable(width=False,height=False)#决定框体大小是否能够调整
text1=tk.Entry(window,width=80,bg='whitesmoke')#在窗体上添加一个输入文本框,并设置尺寸和颜色
text2=tk.Text(window,height=18,bg='lightgrey')#在窗体上添加一个输出文本框,并设置尺寸和颜色
text1.grid(row=0,sticky="W",padx=1)
text2.grid(row=1)
#添加一个按钮,用于触发翻译功能
t_button=tk.Button(window,text='翻译',relief=tk.RAISED,width=8,height=1,font='宋体',bg='red',fg='white',
command=translate)
#添加一个按钮,用于触发清空输入文本框
button1=tk.Button(window,text='保存',font='宋体',relief=tk.RAISED,width=8,height=1,command=write)
#添加一个按钮,用于触发清空输出文本框
button2=tk.Button(window,text='清空',font='宋体',relief=tk.RAISED,width=8,height=1,command=delete)
#添加背景图片
image_file=tk.PhotoImage(file='amo.gif')
label=tk.Label(window,image=image_file)
#完成界面布局,设置各个控件的位置
t_button.grid(row=0,column=1,padx=2)
button1.grid(row=0,column=2,padx=2)
button2.grid(row=0,column=3,padx=2)
label.grid(row=1,column=1,columnspan=3)
tk.mainloop()
到此这篇关于用Python制作mini翻译器的实现示例的文章就介绍到这了,更多相关Pythonmini翻译器内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。