2

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

 2 years ago
source link: https://blog.51cto.com/cnca/5241350
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 <font color=red>621</font> 篇原创博客

⛳️ 实战场景

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

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

上述地址打开之后,用开发者工具选中某文字之后,会发现 Elements 中,无法从源码读取到数据,如下图所示。
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_python
类似的所有场景都属于字体编码系列,简单理解就是:

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

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

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

⛳️ 系统分析

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

Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_python_03
打开控制台,直接检索 signKey 参数,发现只有一个文件所有涉及。

Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_数据_04
打开 common.js 文件之后,进行格式化,继续检索关键字。

Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_数据_05
直接将断点打在 688 行附近,然后刷新页面,等待断点请求。

Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_数据_06
当发现关键字 _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()
}

每次页面刷新的时候,都可以捕获一下相关参数与值。
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_数据_07
例如,这里可以直接得到 d = "GET",写入到我们的 JS 文件即可。

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

获取 f 值
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_python_08

获取 _0x5827 函数内容
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_ajax_09

下述内容 r 是一个数组,可以通过索引获取其中的字符串
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_python_10

a(_0x371d("0x158"));
("default");

随着代码的深入,发现了最核心 signKey 参数的加密位置,截图如下:
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_python_11
这就是一个大工程了,没有 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 字了。
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_数据_12
加密变量 a

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

加密变量 r
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_ajax_13
加密参数 d
Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey_python_14
了解上述几个值的取值方式,解决 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)

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK