【60行代码解决】2024年最新版python爬虫有道翻译js逆向
少代码,简单点,能跑就行,不要太难
·
【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))
更多推荐
已为社区贡献1条内容
所有评论(0)