json解析失败主因是服务端返回非标准json,常见于前端加密(aes/rsa+base64)或混淆;应先用print(repr(response.text))识别格式,再据js中密钥/iv实现解密。

Python中用requests获取AJAX响应后,JSON解析失败怎么办?
直接调用 response.json() 报 JSONDecodeError,大概率不是网络问题,而是服务端返回的压根就不是标准JSON——常见于前端加密传输(如AES、RSA混合)、Base64编码、或字段名/值整体混淆。先别急着写解密逻辑,先确认原始响应体:print(response.content) 或 print(repr(response.text)),看是否有明显 Base64 字符串(含 == 结尾)、十六进制串、或乱码字节。
如何识别并解密常见的前端加密格式?
多数Web应用用对称加密(AES)+ Base64 封装,密钥和IV常硬编码在JS里。抓包看XHR请求的JS文件(如 app.xxx.js),搜索关键词:AES、CryptoJS、decrypt、atob、btoa。重点关注 CryptoJS.AES.decrypt( 调用附近:密钥(key)和IV(iv)可能以字符串或十六进制字面量出现。若看到 CryptoJS.enc.Utf8.parse("xxx"),说明密钥是明文字符串;若为 CryptoJS.enc.Hex.parse("123456..."),则需转为 bytes。
- Base64 解码后通常是 AES 密文(长度为 16/24/32 字节的倍数)
- 密钥长度必须匹配:16字节 → AES-128,24 → AES-192,32 → AES-256
- IV 通常为 16 字节,且必须与加密时完全一致(大小写、填充方式)
- 补码方式常见 PKCS7,但有些用 ZeroPadding,解密失败时可切换尝试
用pycryptodome还原CryptoJS的AES解密行为
CryptoJS 默认使用 OpenSSL 格式:密文 = Base64(AES-CBC(plaintext, key, iv)),且 key/iv 是从用户传入字符串通过 OpenSSL 的 EVP_BytesToKey 衍生(但很多前端简化处理,直接用原字符串)。最稳妥方式是复现 JS 中实际使用的派生逻辑——但若 JS 里明确写了 key: "mySecretKey" 和 iv: "1234567890123456",且没调用 evp 相关函数,就直接用原始字符串:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
<p>cipher_text = base64.b64decode(encoded_str)
key = b"mySecretKey" # 必须是 bytes,长度 16/24/32
iv = b"1234567890123456"
cipher = AES.new(key, AES.MODE_CBC, iv)
plain_bytes = unpad(cipher.decrypt(cipher_text), AES.block_size)
data = plain_bytes.decode('utf-8')</p>
注意:若解密后开头是乱码或报 ValueError: Padding is incorrect,优先检查 IV 是否错一位、key 长度是否匹配、以及是否误把 Base64 当 Hex 处理。
遇到RSA + AES混合加密怎么拆?
典型流程:服务端生成随机AES密钥 → 用RSA公钥加密该密钥 → 用该AES密钥加密数据 → 合并发送。此时响应体通常是 JSON,但 data 字段是 AES 密文,key 字段是 RSA 加密后的 AES 密钥。你需要:
- 从网页源码或JS中提取 RSA 公钥(PEM格式,以
-----BEGIN PUBLIC KEY-----开头) - 用
pycryptodome的RSA.import_key()加载公钥(注意:解密需要私钥,但这里只是验证流程;实际逆向需找服务端私钥或JS中硬编码的私钥——后者极少见,多见于调试环境) - 更现实的做法:用 Selenium 执行原页面JS解密函数(
eval或execScript),避免手动还原复杂加密链
真正难的不是解密算法本身,而是密钥来源不可控——JS更新一次,密钥或IV就变一次。一旦发现密钥从时间戳、设备指纹、或 localStorage 动态生成,基本意味着必须走浏览器上下文执行。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










