行者无忌
新手
新手
  • 最后登录2018-04-17
  • 发帖数3
阅读:7910回复:0

基于python做的GUI翻译工具

楼主#
更多 发布于:2017-12-22 16:34
 

图片:QQ截图20171222162043.jpg

图片:QQ截图20171222161956.jpg


    基于python做了一个GUI翻译工具。主要用到requestsTK这两个库

    原理:其实就是利用
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()
游客


返回顶部

公众号

公众号