【60行代码解决】2024年最新版python爬虫有道翻译js逆向

一、表单参数sign加密

sign: c0f36866a9c650144ed5bac4eba532a7
这种32位一般是MD5加密

1.搜索sign:

2.点击去分别在每个 sign: 某某某 处打上断点

在这里插入图片描述
结果在这个断点断住了

3.原代码

const u = "fanyideskweb"
    , d = "webfanyi"
function j(e) {
    return c.a.createHash("md5").update(e.toString()).digest("hex")
}

function k(e, t) {
    return j(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`)
}

function E(e, t) {
    const o = (new Date).getTime();
    return {
        sign: k(o, e),
    }
}

4.坑点!!

  • 第一次:sign: k(o, e)
    e = ‘asdjnjfenknafdfsdfsd’
    对应的请求:https://dict.youdao.com/webtranslate/key?keyid=webfanyi-key-getter&sign=

  • 第二次:sign: k(o, e)
    e = ‘fsdsogkndfokasodnaso’
    对应的请求:https://dict.youdao.com/webtranslate
    我们要用第二次的e值

5.JS代码处理sign

const crypto = require('crypto')

const u = "fanyideskweb"
    , d = "webfanyi"

function j(e) {
    return crypto.createHash("md5").update(e.toString()).digest("hex")
}

function k(e, t) {
    return j(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`)
}

function get_sign() {
    const e = 'fsdsogkndfokasodnaso';
    const o = (new Date).getTime();
    return {
        sign: k(o, e)
    }
}
console.log(get_sign())

6.python代码处理sign

import time
import hashlib

# 获取sign
def get_sign():
    timestamp = int(time.time() * 1000)
    e = f'client=fanyideskweb&mysticTime={timestamp}&product=webfanyi&key=fsdsogkndfokasodnaso'
    sign = hashlib.md5(e.encode()).hexdigest()
    return sign
print(get_sign())

二、响应数据解密

1.搜索 JSON.parse(

在这里插入图片描述

2.点进去打上断点

o = 密文
Po[“a”].decodeData(o, Wo[“a”].state.text.decodeKey, Wo[“a”].state.text.decodeIv) = 明文
在这里插入图片描述

3.进入Po[“a”].decodeData()方法

在这里插入图片描述

在这里插入图片描述
首先o和n都是固定值

o = 'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'
n = 'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'

在这里插入图片描述
y()方法是md5加密

function y(e) {
    return c.a.createHash("md5").update(e).digest() // digest()是返回二进制
}

然后再看e.alloc()方法
在这里插入图片描述
在这里插入图片描述

发现e.alloc()调用了 s.alloc(),然后再往上看,发现t.Buffer = s,
所以将e.alloc() 改为Buffer.alloc()

4.原代码


var o = 'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'
var n = 'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'
const a = e.alloc(16, y(o)) // 16字节的对象
    , i = e.alloc(16, y(n)) 
    , r = c.a.createDecipheriv("aes-128-cbc", a, i);
let s = r.update(t, "base64", "utf-8");
return s += r.final("utf-8"), s

5.JS代码处理密文

const crypto = require('crypto')

function y(e) {
    return crypto.createHash("md5").update(e).digest()
}
//  数据解密
function encryptdata(t) {
    var o = 'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'
    var n = 'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'
    const a = Buffer.alloc(16, y(o))
        , i = Buffer.alloc(16, y(n))
        , r = crypto.createDecipheriv("aes-128-cbc", a, i);

    let s = r.update(t, "base64", "utf-8");
    return s += r.final("utf-8"), s
}

// t 是密文
t = 'Z21kD9ZK1ke6ugku2ccWu-MeDWh3z252xRTQv-wZ6jd-f4VUaQOlThzHO02JcemZvxc0nJ-vbhDbFJRQdHPTtKovDPAv1sDHCrmpMuYhk7ykQ_zXbIHWZq1lhkbfP_KiB3fg19tI6sTvwyKrG_AF8e28EjCELO-0zHUqyiTAn4Q6jKY5mhCX_N2Tvy4AifRcUQw6y_hlNV-qjgxSvFekmckOymIxOvG11B5nHd4AeyF2cCqlv8nRvrTAEAn1VbQ59gZISkVM0D-yGkWv_cVP9aI2IdancjJkRY20-8NqSMI2Nu9tJES1XdceaZGS2EJCusOFCl30Dc4UQOtCvysyGsSiE6YRgdZ3_xbnAVYDskGcgiKEMxA9CxoZylVmaF2z041XLE4Q0tj2PGwOgRgXr0FBfPMcsr0qghdWjii8oJlfbix6DmCGpW1Zu6w9h2uGTHE8FAIumN0uYW5Fo-D5I8VcAx6y1uBZmJpVufdt2Sabq7EA_OaZyuipzgzXOWqUEfLRvtApxAs_aTEXKXXuvxW0aHrFD9ZV_YfmmsJOvu-r9IF2pYMoBccTUJ0d2B6kQywvGLe3Hw52RhmnOQ80NfCWwRBxTOcK30RM_-LEvGW_7Gdu36Ef9bsTiblvp9Xi'
console.log(encryptdata(t))

6.python代码处理密文

import base64
import hashlib
from Crypto.Cipher import AES  # pip install pycryptodome
from Crypto.Util.Padding import unpad

response = 'Z21kD9ZK1ke6ugku2ccWu-MeDWh3z252xRTQv-wZ6jd-f4VUaQOlThzHO02JcemZvxc0nJ-vbhDbFJRQdHPTtKovDPAv1sDHCrmpMuYhk7ykQ_zXbIHWZq1lhkbfP_KiB3fg19tI6sTvwyKrG_AF8e28EjCELO-0zHUqyiTAn4Q6jKY5mhCX_N2Tvy4AifRcUQw6y_hlNV-qjgxSvFekmckOymIxOvG11B5nHd4AeyF2cCqlv8nRvrTAEAn1VbQ59gZISkVM0D-yGkWv_cVP9aI2IdancjJkRY20-8NqSMI2Nu9tJES1XdceaZGS2EJCusOFCl30Dc4UQOtCvysyGsSiE6YRgdZ3_xbnAVYDskGcgiKEMxA9CxoZylVmaF2z041XLE4Q0tj2PGwOgRgXr0FBfPMcsr0qghdWjii8oJlfbix6DmCGpW1Zu6w9h2uGTHE8FAIumN0uYW5Fo-D5I8VcAx6y1uBZmJpVufdt2Sabq7EA_OaZyuipzgzXOWqUEfLRvtApxAs_aTEXKXXuvxW0aHrFD9ZV_YfmmsJOvu-r9IF2pYMoBccTUJ0d2B6kQywvGLe3Hw52RhmnOQ80NfCWwRBxTOcK30RM_-LEvGW_7Gdu36Ef9bsTiblvp9Xi'

# 数据解密
def encrypt_data(response):
    # 先把密匙和偏移量进行md5加密 digest()是返回二进制的值
    key = hashlib.md5("ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl".encode()).digest()
    iv = hashlib.md5("ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4".encode()).digest()
    cipher = AES.new(key, AES.MODE_CBC, iv)  # 创建一个AES对象(密钥,模式,偏移量)
    ciphertext = base64.urlsafe_b64decode(response)  # 解码为原始的字节串
    plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
    return plaintext.decode()

print(encrypt_data(response))

三、完整python代码

import time
import requests
import base64
import hashlib
from Crypto.Cipher import AES  # pip install pycryptodome
from Crypto.Util.Padding import unpad

# 获取sign
def get_sign():
    timestamp = int(time.time() * 1000)
    e = f'client=fanyideskweb&mysticTime={timestamp}&product=webfanyi&key=fsdsogkndfokasodnaso'
    sign = hashlib.md5(e.encode()).hexdigest()
    return sign

# 获取数据
def get_response(e):
    headers = {
        'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=1948382659.381789; OUTFOX_SEARCH_USER_ID=1775497575@183.219.26.105; __yadk_uid=5QwMgTGcByPM5Fdhip58d5m1lBPBpGCW; rollNum=true; ___rl__test__cookies=1708157820132',
        'Referer': 'https://fanyi.youdao.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',

    }
    data = {
        'i': e,
        'from': 'auto',
        'to': '',
        'domain': '0',
        'dictResult': 'true',
        'keyid': 'webfanyi',
        'sign': get_sign(),
        'client': 'fanyideskweb',
        'product': 'webfanyi',
        'appVersion': '1.0.0',
        'vendor': 'web',
        'pointParam': 'client,mysticTime,product',
        'mysticTime': str(int(time.time() * 1000)),
        'keyfrom': 'fanyi.web',
        'mid': '1',
        'screen': '1',
        'model': '1',
        'network': 'wifi',
        'abtest': '0',
        'yduuid': 'abcdefg',
    }
    response = requests.post('https://dict.youdao.com/webtranslate', headers=headers, data=data).text
    return response
    
# 数据解密
def encrypt_data(response):
    # 先把密匙和偏移量进行md5加密 digest()是返回二进制的值
    key = hashlib.md5("ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl".encode()).digest()
    iv = hashlib.md5("ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4".encode()).digest()
    cipher = AES.new(key, AES.MODE_CBC, iv)  # 创建一个AES对象(密钥,模式,偏移量)
    ciphertext = base64.urlsafe_b64decode(response)  # 解码为原始的字节串
    plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
    return plaintext.decode()

if __name__ == '__main__':
    # e = input('请输入:')
    e = 'apple'
    response = get_response(e)
    print(encrypt_data(response))
  • 33
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值