现在检测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"})

反爬虫-如何检测有没有使用Puppeteer_001.png

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

评论