阅读:8499回复:0
基于python做的GUI翻译工具图片:QQ截图20171222162043.jpg 图片:QQ截图20171222161956.jpg 基于python做了一个GUI翻译工具。主要用到requests和TK这两个库 原理:其实就是利用requests爬取到我们所输入的内容。返回给我们Res,最后用TK写个GUI,最后打包exe 问题:当我们爬取数据的时候我们发现我们Post过去的headers和data数据一直得不到。返回空。难道這就是有道的反爬虫机制。没错。仔细研究了才发现。当我们传送data的时候。salt和sign都是可变的值。输入不同的翻译内容。这两个值都会变化。所以。证明這两个值就是不固定的。 salt:先说這个我们会发现 1513929734443 這是什么。没错。這就是时间戳。2017.12..好了。作为前端這个很容易得到。 sign:這个呢?a401182b12db78305817cb26bc1f2c13 看不懂。。。。纠结了很久。同事告诉我说這就不就是md5算法吗。带了一丝怀疑。去验证了一下果然是。那么這个从那里来呢。当我们在一起看HTTP请求的时候我们会发现,服务器返回给我们的数据找不到這个任何痕迹。那么就证明一条。数据来源于本地。带着猜测去看了看本地。果不其然。找到了本地的fanyi.min.js解压之后我们惊奇的发现了sign变量。没错。就是它。sign = hashlib.md5((u + d + f + c)我们只要找到u d f c不就行了吗。当我们回到python验证我们刚刚描述的,大功告成。 图片:QQ截图20171222161306.jpg 说点废话:至于打包就不多说了。pyinstaller 打包exe图标倒是折腾了一会儿: 使用:png2icon(下载)脚本把它们合成一张icon图标文件 地址:http://www.winterdrache.de/freeware/png2ico/ 使用:下载之后解压 不能直接点击exe cmd: .cd C:\Users\liuhuajun\Downloads\png2ico-win-2002-12-08\png2ico然后:png2ico favicon.ico logo48x48.png logo64x64.png logo128x128.png (图标尺寸必须为png128×128 64×64 48×48 32×32 16×16) 生成facicon.ico然后打包>>成功 以下是具体代码: import random import hashlib import requests import time import json # tkinter GUI from tkinter import Tk,Button,Entry,Label,Text,END # content = input('请输入翻译的内容:') class YoudaoHelper(object): # 初始化 def __init__(self): pass #行为函数 def crawl(self,content): url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=' headers = { 'Host': 'fanyi.youdao.com', 'Cookie': 'P_INFO=mobin-888@163.com|1509500310|2|study|11&15|sic&1509497412&mail_client#sic&510100#10#0#0|159600&0||mobin-888@163.com; JSESSIONID=aaahbeX-WfscFb6iKNI-v; SESSION_FROM_COOKIE=fanyiweb; _ntes_nnid=8a6a44181e7e06dadee817c8826d296c,1511335543471; OUTFOX_SEARCH_USER_ID_NCOO=1092045205.3536856; OUTFOX_SEARCH_USER_ID=1091236179@10.169.0.83; ___rl__test__cookies=1511336020026', 'Referer': 'http://fanyi.youdao.com/', 'Origin': 'http://fanyi.youdao.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } # salt/sign为有道fanyi.js提供的md5算法 可下载js解压混淆之后提取算法 u = 'fanyideskweb' d = content f = str(int(time.time() * 1000) + random.randint(1, 10)) c = 'rY0D^0\'nM0}g5Mm1z%1G4' sign = hashlib.md5((u + d + f + c).encode('utf-8')).hexdigest() form_data = { 'i': content, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': f, 'sign': sign, 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_CLICKBUTTION', 'typoResult': 'false' } req = requests.post(url=url, headers=headers, data=form_data) content_text = req.text json_con = json.loads(content_text) result=json_con['translateResult'][0][0]['tgt'] # print('翻译结果:' + json_con['translateResult'][0][0]['tgt']) return result class Application(object): #__init__初始化 def __init__(self): #初始化类YoudaoHelper self.helper = YoudaoHelper() self.window = Tk() # 获取屏幕的宽度 self.winfo_screenwidth = int((self.window.winfo_screenwidth() - 280) / 2) self.window.geometry(('280x200+%s+300') % self.winfo_screenwidth) # 设置窗口图标 # self.window.iconbitmap('ico/favicon.ico') self.window.title('翻译君') # 输入框 self.entry = Entry(self.window) self.entry.place(x=10, y=10, width=200, height=25) # 按钮 self.submit = Button(self.window, text='查询', command=self.submit_def) #command命令 self.submit.place(x=220, y=10, width=50, height=25) # label文本标题 self.label_text = Label(self.window, text='翻译结果') self.label_text.place(x=10, y=55) # text self.result_text = Text(self.window, background='#ccc') self.result_text.place(x=10, y=75, width=260, height=100) def submit_def(self): #从输入框获取用户输入的值 content=self.entry.get() #返回输入框内容 #把获取到的值发送到有道服务器 result=self.helper.crawl(content) #返回输入框内容 result翻译结果>>赋值到输入框 #把结果放到GUItext文本 self.result_text.delete(1.0,END) #插入内容之前清除文本框 self.result_text.insert(END,result) #插入内容 def run(self): # 进入消息循环 self.window.mainloop() if "__name == __main__": app=Application() app.run() |
|