本帖最后由 ShriyGo 于 2025-7-22 11:34 编辑 站点:aHR0cHM6Ly9zby50b3V0aWFvLmNvbS9zZWFyY2g/ZHZwZj1wYyZzb3VyY2U9dHJlbmRpbmdfY2FyZCZrZXl3b3JkPSVFNyVCRSU4RSVFNSU5QiVCRCVFNiVCNCU5QiVFNiU5RCU4OSVFNyU5RiVCNiVFNCVCOCU4MCVFOCVCRCVBNiVFOCVCRSU4NiVFNSU4NiVCMiVFNiU5MiU5RSVFNCVCQSVCQSVFNyVCRSVBNA== 视频:视频教程 先访问站点,发现有2次请求,且第一次请求的响应内容空白。第1次请求后紧接的第2次请求就是渲染的页面。可见第1次请求必然做了什么事情,这也是典型的动态cookie场景。
本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责

1.png (48.62 KB, 下载次数: 1)
下载附件
2025-7-21 20:54 上传
观察第1次请求的响应头:有一些setcookie等字段

2.png (58.29 KB, 下载次数: 1)
下载附件
2025-7-21 20:54 上传
再看看第2次请求成功:
url、参数并没有区别,只不过带了个cookie,其中__ac_nonce来自于第1次请求返回,而多的这个__ac_signature就要处理了。

3.png (35.21 KB, 下载次数: 1)
下载附件
2025-7-21 20:54 上传
此时利用postman发一次包看第1次请求响应内容究竟是什么:

4.png (130.71 KB, 下载次数: 2)
下载附件
2025-7-21 20:55 上传

5.png (91.33 KB, 下载次数: 1)
下载附件
2025-7-21 20:55 上传
由于是个大jsvmp,简单做法直接补环境处理。
先尝试运行代码看看:报错防盗链。。。

6.png (74.71 KB, 下载次数: 1)
下载附件
2025-7-21 20:55 上传
那常规操作,先补几个基础dom对象,再祭出Proxy直接挂!
提一嘴,watch方法来自于B站up主:无名的Coder,主页:up主页
function watch(obj, name) { return new Proxy(obj,{ get: function(target, property, receiver) { try { if (typeof target[property] === "function") { console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + 'function' + `,类型为:` + (typeof target[property])]); } else { console.table([`对象 => ${name} ,读取属性:`, property + `,值为:` + target[property] + `,类型为:` + (typeof target[property])]); } } catch (e) {} return target[property]; }, set: function(target, property, newValue, receiver) { try { console.table([`对象 => ${name} ,设置属性:`, property + `,值为:` + newValue + `,类型为:` + (typeof newValue)]); } catch (e) {} return Reflect.set(target, property, newValue, receiver); } }); } window = global; document= { }; location= { }; navigator= { }; window = watch(window, "window"); location = watch(location, "location"); document = watch(document, "document"); navigator = watch(navigator, "navigator"); require("./bdm.js") var sign = window.byted_acrawler.sign("","123"); console.log(sign);运行打印看看:
行,那就全补上
document= { referrer:'https://xx.xx.xx/search?dvpf=pc&source=trending_card&keyword=%E5%B7%A6%E6%B0%A7%E6%B0%9F%E6%B2%99%E6%98%9F%E2%80%9C%E6%94%BB%E5%87%BB%E2%80%9D%E8%82%8C%E8%85%B1%E7%9A%84%E6%A6%82%E7%8E%87', }; location= { "ancestorOrigins": {}, "href": "https://xx.xxx.xx/search?dvpf=pc&source=trending_card&keyword=%E5%B7%A6%E6%B0%A7%E6%B0%9F%E6%B2%99%E6%98%9F%E2%80%9C%E6%94%BB%E5%87%BB%E2%80%9D%E8%82%8C%E8%85%B1%E7%9A%84%E6%A6%82%E7%8E%87", "origin": "https://xx.com", "protocol": "https:", "host": "xx.com", "hostname": "xx.com", "port": "", "pathname": "/search", "search": "?dvpf=pc&source=trending_card&keyword=%E5%B7%A6%E6%B0%A7%E6%B0%9F%E6%B2%99%E6%98%9F%E2%80%9C%E6%94%BB%E5%87%BB%E2%80%9D%E8%82%8C%E8%85%B1%E7%9A%84%E6%A6%82%E7%8E%87", "hash": "" }; navigator= { userAgent: "自己找" }; Storage = function(){} localStorage = {} sessionStorage = {} Object.setPrototypeOf(localStorage, Storage.prototype) Object.setPrototypeOf(sessionStorage, Storage.prototype)再来试试:只剩这个关键函数,提示undefined

11.png (20.59 KB, 下载次数: 1)
下载附件
2025-7-21 20:55 上传

12.png (73.61 KB, 下载次数: 1)
下载附件
2025-7-21 20:55 上传
"undefined"!=typeof exports?exports:void 0在node环境下,这个表达式包返回Object,但是浏览器环境并没有exports,结果是undefined。所以必须让这个表达式的结果也是undefined,这样修改下再运行:
"undefined"==typeof exports?exports:void 0

13.png (17.04 KB, 下载次数: 1)
下载附件
2025-7-21 20:55 上传
目前这个值请求通搜索接口没问题,不过有些场景的话,这个长度还不够,例如评论接口:

14.png (28.98 KB, 下载次数: 1)
下载附件
2025-7-21 20:55 上传
这个就留给大伙自己补来看看哈哈
入门补环境,大佬请忽略








查看全部评分