Python爬虫失败?尝试使用js逆向技术破解反爬虫机制!【一次简单的反爬虫案例实践】

230 阅读3分钟

起因

起因是,最近在自学爬虫,需要爬取一个网站的数据用于学习,但是这个网站有反爬虫机制,在代理头中添加了Auth字段进行校验,所以需要先获取到这个Auth字段的值。因为难度不大,因此没有使用到什么断点调试的步骤,纯粹采取了猜测+尝试的方式进行逆向。

分析

1.请求

Body

尝试直接使用apifox发送请求,查看返回结果。可以看到,返回了"No Auth in",说明请求参数或是请求头中缺少了Auth字段。查看了网站发送的请求,发现请求体中不包含Auth字段,于是猜测Auth字段可能是在请求头中。

2.请求头

Auth1

首先,打开开发者工具,查看请求,发现请求头中有一个字段是Auth,其值是3648521fd0e772d0434b0dbb86329a63,猜想这个编码或许是经过加密后的md5值。因此,尝试直接进行md5解密,无果。

3.解密Auth

Auth2

既然如此,尝试直接寻找Auth字段的来源。发现在每次刷新界面后,Auth值都发生改变,猜想这个Auth值可能来自于某个接口的响应。于是,尝试在开发者工具中寻找响应,发现并无相关接口的响应。那么相关的加密规则应该是存储在前端js文件当中。

4.前端js

hunxiao

打开开发者工具,点击应用程序,找到js文件组,看到一大堆i、e、t、o这类字母就知道js文件采用了混淆处理。

在这里插入图片描述

尝试找到主js文件,发现主js文件中有关于网络请求部分的function虽然被混淆但是可以大致看出其功能,于是尝试寻找调用该function的地方,或许在调用处能找到关于Auth的内容。最终没有找到,应该是在其他js文件中进行的调用操作,因此这条路行不通。

5.headers

因为Auth请求存储在请求头内,因此尝试在js文件中寻找headers字段,查看是否有关于Auth的加密规则。最终在某个js文件中找到了有关headers设置的代码,如下:

preSendHandler: e => {
    const t = new Date().getTime()
        , o = Le(t);
    return {
        ...e,
        headers: {
            Timestamp: t,
            Auth: o
        }
    }
}

可以看到,发送请求时headers需要带上两个字段,一个是Auth字段,另一个是Timestamp字段。Auth字段是通过Le(t)函数生成的,因此,接下来只需要找到Le(t)函数的实现,查看其加密规则即可。

6.加密规则

在js文件中搜索Le函数,发现其定义如下:

function Le(e) {
    return md5.md5(md5.md5(String(e), 32))
}

发现,其加密规则是先对时间戳进行md5加密,然后再对加密后的结果进行md5加密。因此,只需要将时间戳进行两次md5加密即可得到Auth字段的值。

python实现加密步骤

import hashlib
import time

def le(e):
    # 第一次MD5,将输入转换为字符串并计算MD5
    first_md5 = hashlib.md5(str(e).encode()).hexdigest()
    # 拼接字符串并第二次计算MD5
    combined = first_md5
    second_md5 = hashlib.md5(combined.encode()).hexdigest()
    return second_md5

# 获取当前时间的毫秒级时间戳(与JavaScript的new Date().getTime()等效)
t = int(time.time() * 1000)
# 计算最终结果
o = le(t)

print("Timestamp:", t)
print("Result:", o)

运行结果:

Timestamp: 1739170958166
Result: c5b3174625585bc949f8319d3e309c4a

尝试采用该Auth值和Timestamp值进行请求,发现请求成功,说明逆向成功。

本文仅为js逆向思路分享,不涉及任何具体网站,请大家合理进行爬虫,不要对他人网站服务器进行攻击破坏