现在检测 Puppeteer 越来越难了,用户可以通过 js 对无头浏览器进行各种伪装,webdriver、webgl、plugins 都很难检测到爬虫,在这里有一个新思路。
许多网页都有检测控制台是否开启的功能,其中大多数网页会直接禁用 F12 和右键,但这似乎并没有什么用处,因为浏览器也有其他办法开启控制台,偶然的机会,我看到这篇文章《判断控制台是否开启(chrome)》。其中提供了一个思路来检测控制台是否开启,也就是重写某个函数的 toString 方法。当控制台开启时使用 console.log 时这个方法将被调用,从而检测到用户开启了控制台。

1
2
3
4
5
6
function checkOpen() {}
checkOpen.toString = function () {
this.opened = true;
};
console.log("%c", checkOpen);
// checkOpen.opened will become true if/when the console is opened

偶然的机会,我发现当用户使用 Puppeteer 访问网页时,即便控制台没有被开启,这个方法的 this.opened 也会被置为 true,也就是说,我们用这个方法不仅可以检测到用户是否打开了控制台,用户在使用 Puppeteer 没有开启控制台的情况下也会被检测到。
这里的一个简单小实验是,别人提供的一个检测控制台开启 Demo,通过 Puppeteer 测试开启并截图后,看到控制台是开启状态。

1
2
await this.page.goto("https://blog.aepkill.com/demos/devtools-detector/");
await this.page.screenshot({ path: "aaa.png" });

image.png
刚才提到的那篇文章的作者,提供了一个开源的检测控制台模块,devtools-detector,可以用做 Puppeteer 检测。

评论