登录
首页 >  文章 >  python教程

Python爬虫逆向JS计算加密参数方法

时间:2026-04-06 14:24:13 294浏览 收藏

本文深入解析了Python爬虫中逆向分析JS加密参数的核心技巧,从如何精准定位前端动态生成sign、token等关键字段的JS逻辑(如通过Network断点和调用栈追踪getSign函数),到在Python中稳健复现计算过程的实战要点——强调分段验证中间值、严格对齐时间精度、编码方式(UTF-16/UTF-8)、API映射(如crypto.subtle→hashlib、atob→base64)及上下文依赖(Cookie、localStorage、Referer等),并理性指出何时该放弃纯Python硬解而转向Playwright调用真实浏览器环境,帮助开发者避开401/403陷阱,高效突破现代Web反爬的加密防线。

Python爬虫怎么爬取加密内容_通过逆向JS计算目标参数值

JS逆向:怎么定位加密参数生成位置

加密参数通常在请求前被动态计算,比如 signtokentimestamp 这类字段。直接抓包看到的请求里有值,但换时间或参数就失效——说明它不是写死的,而是运行时算出来的。

关键不是“找哪个 JS 文件”,而是“找谁调用了目标接口”。打开浏览器开发者工具,在 Network 面板里找到那个带加密参数的请求 → 右键 → “Break on fetch/XHR” → 刷新页面,断点会停在发起请求的位置;往上翻调用栈,大概率能看到类似 getSign()buildParams() 或直接内联的表达式。

  • 优先看 fetchXMLHttpRequest 的上一层函数,90% 的加密逻辑藏在这里
  • 如果调用栈太深,用 “Event Listener Breakpoints” 勾选 clicksubmit,从用户操作起点追
  • 别一上来就搜 signmd5,混淆后变量名可能是 _0xabc123e.t

Python复现:怎么把 JS 里的计算逻辑搬进 requests

拿到 JS 代码片段后,不能直接照抄语法——比如 atob()crypto.subtle.digest()new Date().getTime() 在 Python 里对应的是 base64.b64decode()hashlib.sha256()int(time.time() * 1000)。类型、精度、编码方式稍不对,结果就全错。

最稳的方式是分段验证:把 JS 里每一步中间值(console.log 出来)和 Python 对应步骤的输出逐个比对。

  • Date.now() → Python 用 int(time.time() * 1000),不是 time.time_ns()datetime.timestamp()
  • unescape(encodeURIComponent(str)) → Python 用 urllib.parse.quote(str, safe='') + urllib.parse.unquote() 组合,顺序不能反
  • JS 的 ArrayBufferUint8Array 再哈希 → Python 里等价于对 bytes 对象直接算 hashlib.sha256(data).digest()
  • 遇到 crypto.subtle.encrypt() 这种 Web Crypto API,基本没法纯 Python 复现,得换方案(见下一条)

绕不过去时:要不要用 execjs 或 playwright

有些站点用 Web Crypto、WebAssembly、或者大量闭包+原型链污染,纯 Python 模拟成本远高于调用原环境。这时候该上就上,别硬刚。

execjs 轻量但只支持基础 JS 引擎(比如 JScript、Node),不支持 crypto.subtleplaywrightpuppeteer 能跑完整 Chromium,但启动慢、内存高、容易被检测。

  • 简单 md5/hmac/base64 → 用 Python 原生库,快且稳定
  • crypto.subtle.digest()TextEncoder → 必须用浏览器环境,playwright.sync_api.sync_playwright().start() 启一个无头 Chromium,执行 JS 片段取返回值
  • 注意 playwright 默认 User-Agent 是“pw”,要手动设成常见浏览器 UA,否则可能触发风控
  • 别用 selenium,它默认不支持 await,处理 Promise 容易卡死

调试失败:为什么 sign 总是 401 或 403

参数值对了,但服务端仍拒绝,大概率是漏了隐式依赖项:时间戳精度、Referer、Cookie 同步状态、甚至请求顺序。

尤其注意那些没出现在请求体里、但 JS 执行过程中悄悄读取的上下文,比如 document.cookielocalStorage.getItem('uid')navigator.platform —— 这些都可能参与签名计算。

  • 检查 JS 里有没有 documentwindow 相关读取,Python 里得模拟对应值(比如伪造 localStorage 就得提前存好 key)
  • 时间相关字段(tsttime)不仅要值对,还要和 Cookie 中的 session_id 有效期匹配,差几秒都可能被拒
  • 某些签名算法会把请求 URL 路径或 query string 当作输入,Python 构造时少了个 / 或多了一个 &,整个 hash 就崩了
  • 最后也是最容易忽略的:JS 里字符串是 UTF-16 编码,Python 默认 UTF-8,涉及中文或 emoji 时,先统一转成 .encode('utf-16be') 再哈希

逆向的本质不是还原全部逻辑,而是找出最小必要变量集和它们的生成规则。越早验证中间值,越不容易在最后一步卡住。

今天关于《Python爬虫逆向JS计算加密参数方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>