python 自制搜狗翻译工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37886429/article/details/84938045

一、登陆搜狗翻译页面,分析请求

1、url地址:https://fanyi.sogou.com/
在里面输入中文翻译

在这里插入图片描述
可以看出,请求的地址为 https://fanyi.sogou.com/reventondc/translateV1

2、输入英文翻译
在这里插入图片描述

综合上述分析,当改变里面内容时,Form Data(向后台发送的数据)中to、uuid、s的值在变化,其他几个没有变化

二、找到请求的JS

在这里插入图片描述
主要是 https://dlweb.sogoucdn.com/translate/pc/static/js/vendor.99283d15.js

三、从JS中分析相关内容

在这里插入图片描述

从 uuid的值 “a953132c-77de-4029-95df-d592d4cd9bfa” 可以分析出来,这个大体是 16 进制的格式,于是从下面开始找相应的算法:

在这里插入图片描述
F 的加密算法,主要是下面有一些 md5 的字眼,所有我大致推测应该是做的md5格式的加密

四、构造Form Data 信息

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import math, random, hashlib, re,requests

def translate(content):
    '''
    加密:var F = s("" + L + O + B + "front_9ee4f0a1102eee31d09b55e4d66931fd")
    L:from
    O:to
    B:文本内容
    '''

    # 判断输入是中文还是英文
    zhPattern = re.compile(u'[\u4e00-\u9fa5]+')  # 匹配中文
    match = zhPattern.search(content)  #判断用户输入的是不是中文
    if match:
        O = 'en'
    else:
        O = 'zh-CHS'

    #构建uuid
    M = []
    for i in range(9):
        M.append(hex(math.floor((random.random() + 1) * 65536)).split('0x1')[1])
    uuid = M[0] + M[1] + '-' + M[2] + '-' + M[3] + '-' + M[4] + '-' + ''.join(M[-3:])

    #构建加密算法
    sign = '' + 'auto' + O + content + 'front_9ee4f0a1102eee31d09b55e4d66931fd'
    m = hashlib.md5()
    m.update(sign.encode('utf-8'))

    data = {
        "from": "auto",
        "to": O,
        "client": "pc",
        "fr": "browser_pc",
        "text": content,
        "pid": "sogou-dict-vr",
        "useDetect": "on",
        "useDetectResult": "on",
        "needQc": 1,
        "uuid": uuid,
        "oxford": "on",
        "isReturnSugg": "on",
        "s": m.hexdigest(),
    }

    #发送相关请求
    url = "https://fanyi.sogou.com/reventondc/translateV1"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
    }
    res = requests.post(url=url,headers=headers,data=data).json()
    print(res['data']['translate']['dit'])

# translate('hello world')
translate('我的故乡')

五、利用tkinter组件构建可视化窗口

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from tkinter import *
import math, random, hashlib, re,requests

def translate():
    '''
    加密:var F = s("" + L + O + B + "front_9ee4f0a1102eee31d09b55e4d66931fd")
    L:from
    O:to
    B:文本内容
    '''

    entry1.delete(0, END)
    content = entry.get()

    # 判断输入是中文还是英文
    zhPattern = re.compile(u'[\u4e00-\u9fa5]+')  # 匹配中文
    match = zhPattern.search(content)  #判断用户输入的是不是中文
    if match:
        O = 'en'
    else:
        O = 'zh-CHS'

    #构建uuid
    M = []
    for i in range(9):
        M.append(hex(math.floor((random.random() + 1) * 65536)).split('0x1')[1])
    uuid = M[0] + M[1] + '-' + M[2] + '-' + M[3] + '-' + M[4] + '-' + ''.join(M[-3:])

    #构建加密算法
    sign = '' + 'auto' + O + content + 'front_9ee4f0a1102eee31d09b55e4d66931fd'
    m = hashlib.md5()
    m.update(sign.encode('utf-8'))

    data = {
        "from": "auto",
        "to": O,
        "client": "pc",
        "fr": "browser_pc",
        "text": content,
        "pid": "sogou-dict-vr",
        "useDetect": "on",
        "useDetectResult": "on",
        "needQc": 1,
        "uuid": uuid,
        "oxford": "on",
        "isReturnSugg": "on",
        "s": m.hexdigest(),
    }

    #发送相关请求
    url = "https://fanyi.sogou.com/reventondc/translateV1"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
    }
    res = requests.post(url=url,headers=headers,data=data).json()
    response = res['data']['translate']['dit']
    rest.set(response)


def sougou_translate():
    # 创建窗口
    root = Tk()

    # 窗口标题
    root.title("中英互译")

    # 窗口大小、小写x
    root.geometry('390x100+500+300')

    # 标签控件
    lable = Label(root, text="请输入要翻译的内容:", font=("微软雅黑"), fg="red")
    lable.grid()
    lablel1 = Label(root, text="翻译后的内容为:", font=("微软雅黑"), fg="green")
    lablel1.grid()

    global rest
    rest = StringVar()

    # 输入控件
    global entry
    entry = Entry(root, font=("微软雅黑", 14))
    entry.grid(row=0, column=1)
    # 翻译之后的结果
    global entry1
    entry1 = Entry(root, font=("微软雅黑", 14), textvariable=rest)
    entry1.grid(row=1, column=1)

    # 按钮控件   sticky对齐方式  N S E W - 上下左右
    button = Button(root, text="翻译", font=("微软雅黑", 13), command=translate)
    button.grid(row=2, column=0, sticky=W,padx=10)
    button1 = Button(root, text="退出", font=("微软雅黑", 13), command=root.quit)
    button1.grid(row=2, column=1, sticky=E,padx=10)

    # 消息循环、显示窗口
    root.mainloop()

if __name__ == '__main__':
    sougou_translate()

猜你喜欢

转载自blog.csdn.net/m0_37886429/article/details/84938045