PythonJS逆向解密——实现翻译软件+语音播报

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

环境使用:

  • python 3.8

  • pycharm

模块使用:

  • requests --> pip install requests

  • execjs --> pip install PyExecJS

  • ttkbootstrap --> pip install ttkbootstrap

  • pyttsx3 --> pip install pyttsx3

第三方模块安装:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

  2. 在pycharm中点击Terminal(终端) 输入安装命令

(如果你觉得安装速度比较慢, 你可以切换国内镜像源)


更多精彩机密、教程,尽在下方,赶紧点击了解吧~

素材、视频教程、完整代码、插件安装教程我都准备好了,直接在文末名片自取就可


本次案例分为两个部分:

一. 实现翻译功能 <爬虫技术>

二. 实现软件界面

一. 实现翻译功能 <爬虫技术>

  • 如果有翻译接口 --> 抓包分析

    抓包分析 通过开发者工具 <浏览器自带>

    • 翻译接口: https://fanyi.baidu.com/v2transapi?from=zh&to=en
  • 通过对比:

    sign --> 参数是改变的

    < js代码生成 >

  • 通过开发者工具 分析 --> JS代码那块生成出来 <扣代码>

    运行扣下来的js代码

  • 通过python代码执行js代码, 获取sign值

基本步骤:

  1. 发送请求, 模拟浏览器对于url地址发送请求

  2. 获取数据, 获取服务器返回响应数据

  3. 解析数据, 提取我们需要的数据内容

代码展示

一. 获取翻译接口

网址: https://fanyi.baidu.com/?aldtype=16047#en/zh/Welcome%20to%20Qingdeng%20Education

PythonJS逆向解密——实现翻译软件+语音播报_第1张图片

通过开发者工具直接进行抓包分析, 找到对应的翻译数据包

PythonJS逆向解密——实现翻译软件+语音播报_第2张图片

Post请求, 需要提交data参数:

PythonJS逆向解密——实现翻译软件+语音播报_第3张图片

主要改变的参数:

  • sign

    这个参数是有加密的, 每个翻译的内容对应一个sign值

  • ts

    这是时间戳, 也就是请求当前接口的时间节点

    加密参数获取 <通过JS代码生成的>

PythonJS逆向解密——实现翻译软件+语音播报_第4张图片

PythonJS逆向解密——实现翻译软件+语音播报_第5张图片

PythonJS逆向解密——实现翻译软件+语音播报_第6张图片

PythonJS逆向解密——实现翻译软件+语音播报_第7张图片

找到生成参数的JS代码, 然后扣代码就好了, 缺什么补什么

PythonJS逆向解密——实现翻译软件+语音播报_第8张图片

PythonJS逆向解密——实现翻译软件+语音播报_第9张图片

# 数据请求模块
import requests
import execjs
import ttkbootstrap as ttk
import time
import pyttsx3
import json
import hashlib

def sign(word):
    # 读取JS代码文件
    with open('jiemi.js', encoding='utf-8') as f:
        text = f.read()
    # 编译一下js文本内容
    js_code = execjs.compile(text)
    # 调用js代码函数
    result = js_code.call('baidu', word)  # 调用函数名 字符串
    return result


def search(word):
    result = sign(word)
    """
    1. 发送请求, 模拟浏览器对于url地址发送请求
    """
    # 模拟浏览器 --> headers请求头, 字典数据
    headers = {
        'Cookie': 'BAIDUID=7E8AD9B6DCD3A4DA0A60D3EB8FFB9C71:FG=1; BAIDUID_BFESS=7E8AD9B6DCD3A4DA0A60D3EB8FFB9C71:FG=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1692365550; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1692365550; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; ab_sr=1.0.1_ZTI2YmY3OTk2MTQ4Nzk1YjY5MDBlYWVhZTk4ODA2NGJlMWZlMTNkYjNjZTRlNTI3MTc5ZWM3N2RkOGI1MzJiM2M1NDNhNmFlY2RjOTk2MzUxNjM4Y2E1ZTRjZmQyM2JkY2JiYzIxZTU0ZjA5MTM3MDU1YzBiYmNlNDg3ZmQxNjM1MjU4ZmE3OGU5MDRkYjA3N2I4ZWI4YzI2NTY1OThkZg==',
        'Host': 'fanyi.baidu.com',
        'Origin': 'https://fanyi.baidu.com',
        'Referer': 'https://fanyi.baidu.com/?fr=pcPinzhuan',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    }
    # 请求链接
    url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'
    # 请求参数
    data = {
        'from': 'zh',
        'to': 'en',
        'query': word,
        'transtype': 'realtime',
        'simple_means_flag': '3',
        'sign': result,
        'token': '533f57ec8e908ecfc6c003868d8c9518',
        'domain': 'common',
        'ts': int(time.time() * 1000),
    }
    try:
        # 发送请求
        response = requests.post(url=url, data=data, headers=headers)
        """
        2. 获取数据, 获取服务器返回响应数据
        3. 解析数据, 提取我们需要的数据内容
        """
        json_data = response.json()
        print(json_data)
        trans_result = json_data['trans_result']['data'][0]['dst']
        return trans_result
    except:
        pass

二. 软件界面开发

GUI界面没有什么特别的, 就是一些方法的使用

def show():
    engine = pyttsx3.init()
    word = input_va.get()
    trans_result = search(word)
    text.delete('0.0', 'end')
    text.insert('insert', trans_result)
    engine.say(word+trans_result)
    engine.runAndWait()


root = ttk.Window(
    title="翻译软件",
    themename="litera",
    size=(400, 200),
)
root.place_window_center()
root.resizable(False, False)

frame = ttk.Frame()
frame.pack(pady=10)
input_va = ttk.StringVar()
ttk.Label(frame, text='请输入翻译内容:', font=('微软雅黑', 12)).pack(side=ttk.LEFT)
ttk.Entry(frame, textvariable=input_va).pack(side=ttk.LEFT, padx=5)
ttk.Button(frame, text='搜索', command=show).pack(side=ttk.LEFT)

text_frame = ttk.Frame()
text_frame.pack()
text = ttk.Text(text_frame)
text.pack()

root.mainloop()

PythonJS逆向解密——实现翻译软件+语音播报_第10张图片

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦

希望本篇文章有对你带来帮助 ,有学习到一点知识~

躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~更多源码、资料、素材、解答、交流皆点击下方名片获取呀

你可能感兴趣的:(python,python,开发语言,pycharm)