写点什么

Python 反爬,JS 反爬串讲, 从 MAOX 眼 X 开始, 本文优先解决反爬参数 signKey

作者:梦想橡皮擦
  • 2022 年 7 月 10 日
  • 本文字数:1706 字

    阅读完需:约 6 分钟

⛳️ 实战场景

Python 反爬中有一大类,叫做字体反爬,核心的理论就是通过字体文件或者 CSS 偏移,实现加密逻辑,接下来的 10 篇博客,我们将搞定目前市场上各种典型的字体反爬场景,每一篇都涉及一个案例。


本次要采集的站点是:54yr55y855S15b2x(Base64 加密)站点地址为:https%3A%2F%2Fmaoyan.com%2Ffilms%2F522013(URL 编码)


上述地址打开之后,用开发者工具选中某文字之后,会发现 Elements 中,无法从源码读取到数据,如下图所示。



类似的所有场景都属于字体编码系列,简单理解就是:


服务器源码,无法直接读取文字。


也可以用请求页面预览选项卡,判断是否为字体加密,当出现如下结论时,可以判断,其中数字信息,显示为方框。


⛳️ 系统分析

本以为直接进入字体加密解密逻辑,本案例就可以解决,但是当打开请求头之后,发现出现了一个请求参数 signKey,而且还加密了,那解决字体反爬前,先解决这个加密问题吧。



打开控制台,直接检索 signKey 参数,发现只有一个文件所有涉及。



打开 common.js 文件之后,进行格式化,继续检索关键字。



直接将断点打在 688 行附近,然后刷新页面,等待断点请求。



当发现关键字 _0x371d 时,就知道,这里需要一点点扣 JS 代码了,又是一个细致活。


待提取的 JS 代码如下所示:


u = function(x) {var d = x[a(_0x371d("0x14c"))] , e = x[a(_0x371d("0x14d"))] , _ = x[a(_0x371d("0x14e"))] , t = void 0 === _ ? 1 : _ , n = Math[a("0x82")](10 * Math[a(_0x371d("0x14f"))]()) , i = (new Date)[a(_0x371d("0x150"))]() , o = typeof window !== a("0x4") && window[_0x371d("0x151")] , s = o[a(_0x371d("0x152"))] , u = a(_0x371d("0x153")) + d.toUpperCase() + a("0x87") + i + a(_0x371d("0x154")) + s + _0x371d("0x155") + n + a("0x89") + e + a(_0x371d("0x156")) + t , f = a(_0x371d("0x157"));return {   timeStamp: i,   index: n,   signKey: (0,   r[a(_0x371d("0x158"))])(u + f),   channelId: e,   sVersion: t,   webdriver: c()}
复制代码


每次页面刷新的时候,都可以捕获一下相关参数与值。



例如,这里可以直接得到 d = "GET",写入到我们的 JS 文件即可。


第一步加密之后,得到各个参数值,其中 uf 比较重要。通过每次断点,可以依次将代码逐步还原。下述是一些比较重要的步骤,如果路径不清楚,可以点击下面卡片,直接询问橡皮擦。


获取 f 值



获取 _0x5827 函数内容



下述内容 r 是一个数组,可以通过索引获取其中的字符串



a(_0x371d("0x158"));("default");
复制代码


随着代码的深入,发现了最核心 signKey 参数的加密位置,截图如下:



这就是一个大工程了,没有 1 个小时,无法翻译完毕。


我们先将核心的函数扣出来,然后一点点进行替换,核心未翻译代码如下所示


function() {var d = e(7) 这里面好多代码        , v = u        , M = f;        s = m(s, c, u, f, i[l + 0], 7, -680876936),        f = m(f, s, c, u, i[l + 1], 12, -389564586),        u = m(u, f, s, c, i[l + 2], 17, 606105819),        c = m(c, u, f, s, i[l + 3], 22, -1044525330), 这里面好多代码}()
复制代码


翻译的时候,关注几个重点参数即可。** _0x371d **


var _0x371d = function (x, d) {  return (x -= 0), _0x5827[x];};
复制代码


** _0x5827 **


var _0x5827 = ["parseJSON", "parseXML", "ajaxSettings", "ajaxSetup", "statusCode", "canceled", "success", "dataType", …………;
复制代码


复制到编辑器中,直接好家伙,超过 7W 字了。



加密变量 a


var a = function (x, d) {  return (x -= 0), r[x];};
复制代码


加密变量 r



加密参数 d



了解上述几个值的取值方式,解决 signKey 就变得非常简单了。


除此之外,最简单的办法是直接将 common.js 文件搭建在本地,然后用 Python 去调用,直接就可以获取到对应的数据。


JS 代码在 Python 中执行,使用如下 Demo 即可实现。


import execjs# 执行 JS 文件js = "js 脚本内容"ctx = execjs.compile(js)x = {    'method': 'GET',    'channelId': 40011,    'sVersion': 1,    'type': 'object'}# 传入参数n = ctx.call('翻译之后的加密函数名', x)
复制代码


📣📣📣📣📣📣右下角有个大拇指,点赞的漂亮加倍


发布于: 刚刚阅读数: 2
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_Python_梦想橡皮擦_InfoQ写作社区