Python和JS反爬之解决反爬参数 signKey

 更新时间:2022年05月17日 17:23:58   作者:​ 梦想橡皮擦   ​  
这篇文章主要介绍了Python和JS反爬之解决反爬参数 signKey,Python 反爬中有一大类,叫做字体反爬,核心的理论就是通过字体文件或者 CSS 偏移,接下来文章的详细介绍,需要的小伙伴可以参考一下

实战场景

Python 反爬中有一大类,叫做字体反爬,核心的理论就是通过字体文件或者 CSS 偏移,实现加密逻辑

本次要采集的站点是: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 文件即可。

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

获取 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)

到此这篇关于Python和JS反爬之解决反爬参数 signKey的文章就介绍到这了,更多相关反爬参数 signKey内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现flappy bird游戏

    python实现flappy bird游戏

    这篇文章主要为大家详细介绍了python实现flappy bird游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Python获取Linux系统下的本机IP地址代码分享

    Python获取Linux系统下的本机IP地址代码分享

    这篇文章主要介绍了Python获取Linux系统下的本机IP地址代码分享,本文直接给出实现代码,可以获取到eth0等网卡的IP地址,需要的朋友可以参考下
    2014-11-11
  • 基于Django URL传参 FORM表单传数据 get post的用法实例

    基于Django URL传参 FORM表单传数据 get post的用法实例

    今天小编就为大家分享一篇基于Django URL传参 FORM表单传数据 get post的用法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python中pygame安装方法图文详解

    Python中pygame安装方法图文详解

    这篇文章主要介绍了Python中pygame安装方法,结合图文说明,较为详细的分析总结了Python中pygame的下载及安装调试详细步骤,需要的朋友可以参考下
    2015-11-11
  • 详解Python中pyautogui库的最全使用方法

    详解Python中pyautogui库的最全使用方法

    这篇文章主要介绍了详解Python中pyautogui库的最全使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 使用Python实现火车票查询系统(带界面)

    使用Python实现火车票查询系统(带界面)

    周末、假期来了,七夕也快到了,又到一年中最一票难求的时候了!本文将用Python制作一个简单的火车票查询系统,感兴趣的可以了解一下
    2022-07-07
  • python实现列车管理系统

    python实现列车管理系统

    这篇文章主要为大家详细介绍了python实现列车管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)

    matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)

    这篇文章主要介绍了matplotlib绘制鼠标的十字光标(自定义方式,官方实例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python实现多线程的两种方式分析

    Python实现多线程的两种方式分析

    这篇文章主要介绍了Python实现多线程的两种方式,结合实例形式分析了通过自定义函数传递Thread对象以及继承Thread类两种多线程实现方式相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • YOLOv5构建安全帽检测和识别系统使用详解

    YOLOv5构建安全帽检测和识别系统使用详解

    这篇文章主要为大家介绍了YOLOv5构建安全帽检测和识别系统使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论