一、前言
之前分析过瑞数4的补环境方案,本篇分析一下瑞数5,一开始笔者试图直接拿瑞数4的环境来运行瑞数5,但请求失败了,cookie也不一致,这说明rs5在rs4的基础上多了一些环境检测点。
本篇的目的即是将这些新增的检测点找出来, 方案选择补环境框架。(瑞数6拿瑞数5的环境可以直接过)
二、目标
成功爬取首页html。
aHR0cDovL3d3dy5jaGluYXN0b2NrLmNvbS5jbi9uZXdzaXRlL2Nncy1zZXJ2aWNlcy9zdG9ja0ZpbmFuY2UvYnVzaW5lc3NBbm5jLmh0bWw/dHlwZT1tYXJnaW5MaXN0
三、成果
四、与4代环境的主要差异
4.1 document.all检测
代理日志
特性
从图中可以看出,返回的是一个HTMLALLCollection
对象,但用typeof
却显示undefined
分析与解决
这其实是javascript发展史上的一个bug,并且官方也不推荐使用该api
在js层面这个对象是无法模拟出来的,不过有大佬提出用c++更改nodejs底层代码,或者用c++写一个nodejs插件,笔者这里用的是后者。
4.2 form标签检测
代理日志
特性
在浏览器中form标签的特征可用下面这个案例来表示:
function test_action() {
let form = document.createElement("form");
let input1 = document.createElement("input");
input1.id = "username";
input1.content = "action";
input1.name = "action";
form.appendChild(input1);
let input2 = document.createElement("input");
input2.name = "textContent";
input2.id = "password";
form.appendChild(input2);
let input3 = document.createElement("input");
input3.id = "innerText";
input3.type = "submit";
input3.name = "id";
form.appendChild(input3);
a = form.action;
b = form.textContent;
c = form.id;
d = form.innerText;
form.id='yq'
form.name='yqName'
document.body.appendChild(form)
if (a.name == 'action' && a.id == 'username' && b.name == 'textContent' && b.id == 'password' && c.id == "innerText" && c.name == 'id' && d.id == 'innerText' && d.name == 'id' &&globalThis.yq==form &&globalThis.yqName==form) {
console.log(`test_action 检测通过`)
} else {
console.log(`test_action 可以被检测`);
}
}
test_action()
浏览器测试结果:
简要概括一下,对于一个form标签,如果添加一个input子标签,并且input设置了id和name值,那么form标签可以直接通过id和name访问到这个input标签,此为第一层;
第二层是若form标签设置了id和name,那么对于window对象及其原型链,可以直接通过id和name访问到这个form标签。
分析和解决
这个问题通过js设计解决,在input标签插入form标签的过程中,检查input标签是否有id/name标签,如果有,那么给form标签自身添加id/name值属性,指向input标签;在form标签添加到body中时,给window的原型链添加id/name值属性,指向form标签。
4.3 音视️频指纹检测
代理日志
检测原理
通过创建audio/video标签,调用其canPlayType
方法,传入不同的参数以验证浏览器支持情况。
解决
缺啥补啥,和浏览器保持一致就行。
五、总结
以上就是5代瑞数环境检测和4代的区别,主要包括3点:
document.all
检测,这个检测难以通过纯js解决,需要对v8有所了解,需要会一点c++的基础从底层实现。- form标签检测,调试好规律后在js中做一些嫁接引用 。
- 音视频指纹检测,和浏览器保持一致就行。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,如有问题请邮件至2454612285@qq.com。