关于spiderdemo第二题的奇思妙想

前言

spiderdemo是练习爬虫案例的网站,如下

反爬虫练习平台https://www.spiderdemo.cn/而第二题需要逆向,但是里面的js代码很麻烦,经过混淆,不想搞怎么办?

直接开始

正文

前置分析

其中参数很容易发现

如下

很明显,sign就是加密参数。

搜索一下关键,很容易发现如下

而其中加密使用的是hex_md5,进去看看

一堆不知道是什么东西

但是笔者发现这个hex_md5都在ob_challenge1.js这个js文件中,于是笔者把这个文件下载来,

添加

javascript 复制代码
let a=hex_md5("17612268353402")
console.log(a)

运行,报错

var ۦۥۥﱠﱣﱟ = WheelEvent, ۥﱣﱠۦﱣۦ = window, ۥﱟۦﱠۥۦ = document, ۥﱟۦﱠۦۥ = navigator, ﱣﱞﱟﱣﱣﱠ = location, ۥﱟۦﱠﱞۦ = history,
^

ReferenceError: WheelEvent is not defined

。。。。

笔者看着也不想逆向,然后,笔者问了AI,AI说是node环境没有window。

笔者突然有个想法,放到html里面试试,如下新建一个a.html文件

html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns="">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script src="ob_challenge1.js">
</script>
<script>
    let a=hex_md5('17612268353402')
    console.log(a)
</script>
<body>

</body>
</html>

Pycharm打开页面

啊,哈哈哈哈哈哈

和前面生成sign一模一样,那说明全部的加密都在这里面,那不需要解混淆,解个寂寞

直接调用html获取参数不就可以了,笔者感觉没问题,说干就干。

调用html

如何调用html,可以使用selenium ,但笔者想使用DP,笔者从来没有使用过,正好尝试一下

DrissionPage官网https://drissionpage.cn/安装过程就不必细说。

笔者想使用如下的代码获取结果

如下是two.py文件

python 复制代码
from DrissionPage import ChromiumPage
page = ChromiumPage()

# 1. 加载本地 HTML(file:// 协议)
html_path = 'file:///' + __import__('os').path.abspath('a.html').replace('\\', '/')
page.get(html_path)
# 2. 执行 JS 并拿结果
md5_val = page.run_js("return hex_md5('17612268353402');")
print('MD5 值:', md5_val)

# 3. 退出
page.quit()

文件位置如下

执行two.py文件,结果如下

哈哈哈哈哈,成功了。

绕过逆向。哈哈哈哈哈

笔者还发现在Pycharm中打开html,如下

有个localhost:63342,那么直接不装了,代码如下

python 复制代码
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get("http://localhost:63342/study-spider/src/spiderDemo/a.html")
for i in range(1,101):
    md5_val = page.run_js(f"return hex_md5('1761226835340{i}');")
    print('MD5 值:', md5_val)
page.quit()

直接对localhost:63342发送请求,结果如下

没问题。既然如此,搞事情

编写爬虫

细节不必多言,直接看代码

python 复制代码
from DrissionPage import ChromiumPage
import time
import requests
html = ChromiumPage()
html.get("http://localhost:63342/.../a.html")
total=0
for page in range(1,101):
    url=f'https://www.spiderdemo.cn/ob/api/ob_challenge1/page/{page}?'
    timestamp=int(time.time()*1000)
    sign=html.run_js(f"return hex_md5('{timestamp}{page}');")
    print("第"+str(page)+"页的参数sign是"+sign)
    cookies = {
        'sessionid': '你的sessionid'
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0'
    }
    params={
        'challenge_type':'ob_challenge1',
        'sign':sign,
        'timestamp':timestamp
    }
    response=requests.get(url,params=params,headers=headers,cookies=cookies)
    success=response.json()['success']
    if not success:
        print("Failed to get valid response")
    else:
        page_total=sum(response.json()['page_data'])
        total+=page_total
print(total)

笔者html页面路径都去掉了,这个每个人的都不同,看个人。

结果

ok。

总结

感觉卡bug了,没有进行逆向之类的。

就是把那个js文件下载下来,放到html里面,使用DP打开html,调用js函数,获取加密后的结果。

哈哈哈哈哈哈哈哈哈哈哈哈。

相关推荐
香芋芋圆9 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
INS_KF9 小时前
【编程笔记】成员函数中两个 const 的区别(const Data &getData() const;)
前端·javascript·笔记
宿67410 小时前
vue3-async
前端·javascript·vue.js
excel11 小时前
Nuxt + Twin CSS 中宽度超过屏幕时底部出现空白的原因与解决方案
前端·javascript
一个游离的指针14 小时前
函数管道:消除深度嵌套调用
前端·javascript
绘梨衣54714 小时前
AI技术栈全景指南_Prompt_RAG_爬虫_MCP
人工智能·爬虫·prompt
柚yuzumi14 小时前
前端优化,从少触发一次开始:防抖与节流
前端·javascript
默_笙15 小时前
🚤 CSS 布局的"圈地运动":BFC 就是浏览器的独立领地
前端·javascript
用户9385156350715 小时前
大模型记忆指南:从短时缓存到永久记忆,手把手带你吃透 LangChain Memory 管理
javascript·人工智能
xqchen15 小时前
Web Components 普及困境深度解析:技术标准与工程实践的落差
javascript