前言
身在深渊中,何须怕深渊
有些网站为防止爬虫,打开页面后再打开开发者工具导致页面跳转或者打不开页面
⚠️声明:本文所涉及的爬虫技术及代码仅用于学习、交流与技术研究目的,禁止用于任何商业用途或违反相关法律法规的行为。若因不当使用造成法律责任,概与作者无关。请尊重目标网站的robots.txt协议及相关服务条款,共同维护良好的网络环境。
1.防抽
网页地址:https://landchina.com/#/givingNotice
代码核心检测方式
检测方式
适用浏览器
可靠性
触发方式
console.profile()
早期 Chrome、Opera
已失效
通过 console.profiles.length 判断
console.firebug
早期 Firefox
已失效
Firebug 标志检测
console.table().match(/firebug/i)
早期 Firefox
已失效
Firebug 兼容检测
window.outerHeight - window.innerHeight > 200
Chrome、Firefox
可靠
通过窗口大小变化检测
setInterval(ck, 2000)
所有浏览器
可靠
定时检查 DevTools
代码作用
主要用于检测开发者工具(F12)是否打开,防止用户查看网页源码或爬取数据。
一旦检测到 DevTools 打开,会执行 fanchou() 清空页面并跳转到 about:blank。
关键检测方式
console.profile() 检测(已失效)
早期 Chrome 允许 console.profile() 在 DevTools 打开时启用,但现在已被屏蔽。
检测 Firebug(旧版 Firefox)
通过 console.firebug 和 console.table() 关键字检测 Firebug,但该工具已停止维护。
窗口大小变化检测(有效)
window.outerHeight - window.innerHeight > 200
如果窗口高度变化超过 200px,说明 DevTools 可能被打开,触发 fanchou() 清空页面。
定时 setInterval() 检测
每 2 秒 运行 ck() 进行检测,若发现异常则清空页面。
地址:
这段 JavaScript 代码的主要目的是检测用户是否打开了开发者工具(F12),如果检测到用户打开了开发者工具,就会触发 fanchou(),执行防抽操作(清空页面内容并跳转到 about:blank )。
(function() {
function fanchou() {
// 现代浏览器(如 Chrome、Edge、Firefox)默认会禁止 window.close() 关闭非 window.open() 打开的页面,所以 window.close() 在某些情况下不会生效。
window.close();
document.body.innerHTML = ''; // 清空页面内容
window.location.href = 'about:blank'; // 跳转到空白页
}
function ck() {
console.profile(); // 开启性能分析
console.profileEnd(); // 结束性能分析
if (console.clear) {
console.clear(); // 清空控制台
}
if (typeof console.profiles === 'object') {
return console.profiles.length > 0;
}
}
function hehe() {
// 1. 检测 Firebug(旧版 Firefox 扩展)
if (
(window.console && (console.firebug || console.table && /firebug/i.test(console.table()))) ||
(typeof opera === 'object' && typeof opera.postError === 'function' && console.profile.length > 0)
) {
fanchou();
}
// 2. 检测 console.profiles(旧版 Chrome)
if (typeof console.profiles === "object" && console.profiles.length > 0) {
fanchou();
}
}
hehe();
// 3. 监测窗口大小变化
window.onresize = function() {
if ((window.outerHeight - window.innerHeight) > 200) { // 判断窗口变化是否大于 200px
fanchou();
}
};
// 4. 定时检测 console 变化
setInterval(function() {
if (ck()) {
fanchou();
}
}, 2000);
})();
2.window.close()
window.close() 只能关闭 window.open() 打开的窗口,用户手动打开的窗口无法关闭。
window.opener = null;将 opener 设为 null,防止窗口与父页面通信,避免浏览器拦截 window.close()。
可以用 window.open("", "_self").close(); 绕过浏览器限制。
如果 window.close() 无效,可以用 window.history.back() 或 window.location.href = "about:blank" 替代。
在按钮 onclick 事件中使用 window.close(),某些浏览器可能允许执行。
3.事件监听器断点中的 script 选项
事件监听器断点(Event Listener Breakpoints)是 Chrome 开发者工具(DevTools)提供的一种 调试功能,可以在特定的 DOM 事件触发时自动暂停 JavaScript 执行,帮助开发者分析代码逻辑、找出错误或者逆向分析页面行为。
script 选项下包含两个具体的断点类型:
Script First Statement(脚本首语句)
作用:当 JavaScript 代码开始执行时,自动触发断点。
用途:
拦截网页执行的所有 JavaScript 代码。
调试内嵌 JavaScript 或 动态加载的 JavaScript(如 eval())。
用于分析网站的核心 JS 逻辑,包括反爬虫、反调试、加密逻辑等。
Script Parsed(脚本解析)
作用:当 JavaScript 代码被浏览器解析时(但可能尚未执行),自动触发断点。
用途:
捕获所有 JavaScript 代码,包括 script 标签、document.write()、XHR 动态加载的 JS。
分析 JavaScript 代码的执行顺序,找到影响页面加载的 JS 代码。
监测防调试代码,如 debugger;、Object.defineProperty(console, ...) 之类的代码。
script 断点的常见用途
场景
使用 script 断点的方式
实际用途
网站开启了防调试(F12 失效)
Script First Statement
拦截网站核心 JS 逻辑,找到 debugger; 代码并绕过
网站动态加载 JavaScript
Script Parsed
监听 eval()、document.write() 等动态 JS 加载行为
分析网页的核心 JavaScript 逻辑
Script First Statement
逆向分析网页代码,找到关键的加密/解密逻辑
调试某个 JS 文件
Script Parsed + Script First Statement
找到 JS 代码的入口,逐步调试
检测网站是否用 eval() 加载 JS
Script Parsed
监听 eval() 代码块并中断执行
如何使用 script 断点?
打开 Chrome 开发者工具(F12 / Ctrl + Shift + I)
切换到 Sources 面板
在右侧 Event Listener Breakpoints 面板中,展开 script 选项
勾选 Script First Statement 和 Script Parsed
刷新页面,观察代码执行情况
4.解决防抽
打开浏览器,在事件监听器断点中脚本(script)勾选上,然后输入地址就能进入断点
既然上面理解了防抽其实就是js代码的作用,我们就断点调试找到对应的代码注释或替换即可
每次加载js脚本都会进入断点,我们在文件搜索window.close,没有就跳过执行下一个,找到后打个断点
可以选择注释或者替换代码即可
5.防抽代码
onDevToolOpen 是一些网站用于检测开发者工具(F12)是否打开的防调试手段。
它通常结合 console.log、debugger 语句、performance API 或 特定事件监听 来实现。
开启了一个定时器监听onDevToolOpen事件
代码
这里不仅关闭浏览器,也启动定时器进行页面跳转
function p() {
if (h.url)
window.location.href = h.url;
else if (h.rewriteHTML)
try {
document.documentElement.innerHTML = h.rewriteHTML
} catch (o) {
document.documentElement.innerText = h.rewriteHTML
}
else {
try {
// window.opener = null,
// window.open("", "_self"),
// window.close(),
// window.history.back()
} catch (o) {
console.log(o)
}
// setTimeout((function() {
// window.location.href = h.timeOutUrl || "https://theajack.github.io/disable-devtool/404.html?h=".concat(encodeURIComponent(location.host))
// }
// ), 500)
}
}
📌 创作不易,感谢支持!
每一篇内容都凝聚了心血与热情,如果我的内容对您有帮助,欢迎请我喝杯咖啡☕,您的支持是我持续分享的最大动力!