首页 > 编程语言 >【60行代码解决】2024年最新版python爬虫有道翻译js逆向

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

时间:2024-02-18 22:33:19浏览次数:32  
标签:return python sign 2024 key import 最新版 response md5

一、表单参数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

timestamp = int(time.time() * 1000)
# 获取sign
def get_sign():
    e = f'client=fanyideskweb&mysticTime={timestamp}&product=webfanyi&key=fsdsogkndfokasodnaso'
    md5 = hashlib.md5()  # 创建一个md5对象
    md5.update(e.encode('utf-8'))  # 使用utf-8编码数据
    sign = md5.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()方法

点这个看

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)) // 8位无符号整数的固定长度的数组(数组长度为16)
    , i = e.alloc(16, y(n)) // 8位无符号整数的固定长度的数组(数组长度为16)
    , 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 encryptdata(t) {
    const a = new Uint8Array([8, 20, 157, 167, 60, 89, 206, 98, 85, 91, 1, 233, 47, 52, 232, 56]) // 8位无符号整数数组  
    // 或者将new Uint8Array 改为Buffer.from也可以
      , i = new Uint8Array([210, 187, 27, 253, 232, 59, 56, 195, 68, 54, 99, 87, 183, 156, 174, 28])
      , 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
from Crypto.Cipher import AES  # pip install pycryptodome

def encrypt_data(response):
    uint8_array_key = bytearray([8, 20, 157, 167, 60, 89, 206, 98, 85, 91, 1, 233, 47, 52, 232, 56])  # 字节数组 秘钥
    uint8_array_iv = bytearray([210, 187, 27, 253, 232, 59, 56, 195, 68, 54, 99, 87, 183, 156, 174, 28])  # 字节数组 偏移量
    cipher = AES.new(uint8_array_key, AES.MODE_CBC, uint8_array_iv)  # 创建一个AES对象(密钥,模式,偏移量)
    cipherText = base64.urlsafe_b64decode(response)  # 将二进制字符串解码成正常形式的字符串
    result = cipher.decrypt(cipherText).decode()
    return result

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

print(encrypt_data(response))

 三、完整python代码

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


# 获取sign
def get_sign():
    timestamp = int(time.time() * 1000)
    e = f'client=fanyideskweb&mysticTime={timestamp}&product=webfanyi&key=fsdsogkndfokasodnaso'
    md5 = hashlib.md5()  # 创建一个md5对象
    md5.update(e.encode('utf-8'))  # 使用utf-8编码数据
    sign = md5.hexdigest()  # 返回加密后的十六进制字符串
    return sign

# 获取响应密文
def get_response(text):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0',
        'Referer': 'https://fanyi.youdao.com/',
        'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID_NCOO=550293237.6976808; [email protected]'
    }
    data = {
        "i": text,
        "from": "auto",
        "to": "",
        "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):
    uint8_array_key = bytearray([8, 20, 157, 167, 60, 89, 206, 98, 85, 91, 1, 233, 47, 52, 232, 56])  # 字节数组 秘钥
    uint8_array_iv = bytearray([210, 187, 27, 253, 232, 59, 56, 195, 68, 54, 99, 87, 183, 156, 174, 28])  # 字节数组 偏移量
    cipher = AES.new(uint8_array_key, AES.MODE_CBC, uint8_array_iv)  # 创建一个AES对象(密钥,模式,偏移量)
    cipherText = base64.urlsafe_b64decode(response)  # 将二进制字符串解码成正常形式的字符串
    result = cipher.decrypt(cipherText).decode()
    return result

if __name__ == '__main__':
    # text = input('输入:')
    text = 'hello world'
    res = encrypt_data(get_response(text))
    print(res)

 

标签:return,python,sign,2024,key,import,最新版,response,md5
From: https://www.cnblogs.com/nanamiyi/p/18020074

相关文章

  • 2024-2-18 数论学习笔记
    zak讲数论专题,好难,听不懂,整理一下。借鉴了zak的课件。还没写完呐,还会更新的。目录一、线性筛二、Dirichlet前缀和三、整除分块四、莫比乌斯函数例一一、线性筛筛出\(n\)以内的所有质数。\(n≤10^8\)。直接埃氏筛是\(O(n\ln\lnn)\)的,但是一个合数会被筛多次,......
  • .NET周刊【2月第1期 2024-02-04】
    祝大家新年快乐,龙年大吉~国内文章C#/.NET/.NETCore优秀项目和框架2024年1月简报https://www.cnblogs.com/Can-daydayup/p/18000401本文介绍了公众号“追逐时光者”定期分享的C#/.NET/.NETCore优秀项目和框架,包括项目介绍、功能特点、使用方式和功能截图,并提供了源码地址。文......
  • 2024-02-18-物联网C语言(7-字符串处理函数)
    7.字符串7.1获取字符串的长度函数-strlen头文件:#include<string.h>函数定义:size_tstrlen(constchar*s)参数:s-指定的字符串返回值:当前字符串的长度#include<stdio.h>#include<string.h>intmain(intargc,charconst*argv[]){//使用strlen获取字符......
  • 2024.2.18 近期练习
    P4764值域为\([l,r]\)的生成森林,也就是把值\(\gel\)的边拿出来生成森林,其中边\(\ler\)的权值和。我们现在要求所有\(l\),$\gel$边的生成森林中边有哪些。考虑从大往小加边,设当前加入第条边\((u,v,w)\)。因为这条边最小,所以这条边必选。若\(u,v\)不连通,那么直接......
  • Python教程(27)——如何使用Python中的上下文管理器
    当我们在编写代码时,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到了一些异常情况,我们需要关闭资源,不然会导致资源泄露,虽然我们可以通过手动的方式来关闭,但如果有多个异常情况需要考虑的话,万一不小心漏了一处,就芭比Q了。所以,如果有一种更加优雅的方式来处理资源泄露的问......
  • winter 2024 第三四周周报
    内容week3day1https://www.cnblogs.com/bible-/p/18018423这天是打寒假牛客2,请假了后面补的题,补了10道吧,感觉这些题花点时间都是可以写的,但是赛时真的很容易被卡,板子题也挺多,线段树、树状数组、字典树(太久不写有点忘了)week3day3https://www.cnblogs.com/bible-/p/18011488打......
  • [2024 AtCoder 比赛历程]
    2024.1.20ABC337-G题目大意:给定一棵树,对于树上的每个点$u$,定义$f[u]$表示满足点$w$在点$u$到点$v$的路径中,且$w>v$的点对$(w,v)$的数量。$u$可以等于$w$。解法:比赛时先考虑将一个点钦定为$w$时,该点对其他点的贡献。发现对于一个点,它可以通过它的一个子树内......
  • 跨界协作:借助gRPC实现Python数据分析能力的共享
    gRPC是一个高性能、开源、通用的远程过程调用(RPC)框架,由Google推出。它基于HTTP/2协议标准设计开发,默认采用ProtocolBuffers数据序列化协议,支持多种开发语言。在gRPC中,客户端可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用......
  • (2024.2.5-2024.2.18)C语言学习小结
    这两周主要围绕《HeadfirstC》这本书展开C语言学习,同时尝试学习DES密码算法C程序。基本内容《HeadfirstC》学习的内容基本上就是进程与通信、网络、线程这块。以下是思维导图:实践练习除了书上的一些小练习之外,我也实践写了HFC的C语言实验室2的程序,一波三折,详见C代码......
  • python相关知识
    1python原理Python先把代码编译成字节码,交给虚拟机执行。.pyc文件是字节码在磁盘上的表现形式字节码在虚拟机程序里面对应的对象是PyCodeObject对象(C++对象)PyCodeObjecttypedefstruct{PyObject_HEADintco_argcount;/*位置参数个数*/intco_nlocals;......