如何避免对isTrusted属性检测?
检测原理
什么是isTrusted属性?在web api官方网站mozilla.org有如下解释:“Event接口的 isTrusted 属性是一个只读属性,它是一个布尔值(Boolean)。当事件是由用户行为生成的时候,这个属性的值为 true ,而当事件是由脚本创建、修改、通过 EventTarget.dispatchEvent() 派发的时候,这个属性的值为 false 。”
Demo举例
创建Demo
创建一个名为‘sample_istrusted.html’本地的Html网页
<html>
<body>
<h1>测试isTrusted属性</h1>
<button type="button" name="bt" id="bt">点我</button>
</body>
</html>
使用Selenium +FireFox打开该网页
from selenium import webdriver
chrome_options = webdriver.FirefoxOptions()
chrome = webdriver.Firefox()
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument(
'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleW\
ebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
chrome.get(r"C:\Users\chaosheng\Desktop\sample_istrusted.html")
在浏览器控制台创建点击函数,绑定事件的处理函数将会在button点击的时候在控制台输出isTrusted的值。
document.querySelector("#bt").addEventListener("click",
function(event) {
console.log('被点击,isTrusted值为:');
console.log(event.isTrusted);
});
测试
人手点击按钮测试 True
人手点击值为True
执行代码:控制台运行js代码来执行点击事件 False
使用程序点击值为False
document.querySelector('#bt').click();
小总结
到这里我们大概明白了原理:扩展到所有事件,如果事件是我们手动触发的isTrusted(可信)就是true,如果是通过JavaScript去直接执行就是false。
执行代码:利用py断点输入py命令来执行点击事件 True
1.新建selenium_ipdb.py并运行
from selenium import webdriver
chrome_options = webdriver.FirefoxOptions()
chrome = webdriver.Firefox()
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument(
'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleW\
ebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
chrome.get(r"C:\Users\chaosheng\Desktop\sample_istrusted.html")
import ipdb
# 断点,执行到这里程序会进入ipython的调试控制台
ipdb.set_trace()
2.在浏览器控制台添加点击事件如上文
3.在断点处执行Python代码
chrome.find_element_by_name('bt').click();
执行代码:利用py断点输入js命令来执行点击事件 False
chrome.execute_script('document.querySelector("#bt").click();')
原因
因为我们在用python执行:
driver.find_element_by_name(“bt”).click();
我们实际上走的是Chrome DevTools Protocol协议的这个接口:
并不是在chrome控制台下直接执行js,所以isTrusted还是和我们手动点击一样是可信的,就如同相当于浏览器给你开了一个方便之门,可以“假装是手动”,类似的其他点击操作原理一样,大家可以自己去尝试。
结果
所以,最后我们需要注意的就是在selenium爬虫的时候,要想不要被前端反爬利用isTrusted检测到,就不要用直接执行js的方式去操作浏览器。
来源
https://zhuanlan.zhihu.com/p/335858574