web browser anti detection
This commit is contained in:
@@ -5,6 +5,8 @@ import json
|
||||
import os
|
||||
import time
|
||||
import urllib.parse
|
||||
|
||||
from playwright.async_api import async_playwright
|
||||
from playwright.sync_api import sync_playwright
|
||||
|
||||
|
||||
@@ -16,6 +18,58 @@ class WebBrowser:
|
||||
self.page = None
|
||||
self.playwright = None
|
||||
|
||||
def human_like_actions(self):
|
||||
"""更逼真的人类行为模拟"""
|
||||
# 模拟页面加载后的自然浏览行为
|
||||
time.sleep(random.uniform(1, 3))
|
||||
|
||||
# 模拟鼠标悬停
|
||||
try:
|
||||
hover_elements = self.page.query_selector_all("a, button")
|
||||
if hover_elements:
|
||||
element = random.choice(hover_elements[:min(5, len(hover_elements))])
|
||||
self.page.mouse.move(0, 0) # 先移开
|
||||
time.sleep(0.5)
|
||||
element.hover()
|
||||
time.sleep(random.uniform(0.5, 1.5))
|
||||
except:
|
||||
pass
|
||||
|
||||
def get_random_user_agent(self):
|
||||
"""获取随机User-Agent"""
|
||||
user_agents = [
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
|
||||
]
|
||||
return random.choice(user_agents)
|
||||
|
||||
def enhanced_anti_detection(self):
|
||||
"""增强的反检测脚本"""
|
||||
self.page.add_init_script("""
|
||||
// 更彻底地隐藏webdriver痕迹
|
||||
Object.defineProperty(navigator, 'webdriver', {
|
||||
get: () => undefined
|
||||
});
|
||||
|
||||
// 伪装chrome csi和loadTimes
|
||||
if (!window.chrome) {
|
||||
window.chrome = {
|
||||
runtime: {}
|
||||
};
|
||||
}
|
||||
|
||||
// 伪装permissions查询
|
||||
const originalQuery = window.navigator.permissions.query;
|
||||
window.navigator.permissions.query = (parameters) => {
|
||||
if (parameters.name === 'notifications') {
|
||||
return Promise.resolve({
|
||||
state: Notification.permission
|
||||
});
|
||||
}
|
||||
return originalQuery(parameters);
|
||||
};
|
||||
""")
|
||||
def anti_detection(self):
|
||||
"""注入更全面的反检测脚本"""
|
||||
self.page.add_init_script("""
|
||||
@@ -122,6 +176,27 @@ class WebBrowser:
|
||||
except:
|
||||
return False
|
||||
|
||||
def start_browser_with_proxy(self, proxy_host=None, proxy_port=None):
|
||||
"""启动带代理的浏览器"""
|
||||
self.init_cookie_file()
|
||||
|
||||
browser_args = [
|
||||
"--disable-blink-features=AutomationControlled",
|
||||
"--disable-infobars",
|
||||
"--no-sandbox",
|
||||
"--disable-dev-shm-usage"
|
||||
]
|
||||
|
||||
if proxy_host and proxy_port:
|
||||
browser_args.append(f"--proxy-server=http://{proxy_host}:{proxy_port}")
|
||||
|
||||
self.playwright = sync_playwright().start()
|
||||
self.browser = self.playwright.chromium.launch(
|
||||
headless=False,
|
||||
args=browser_args
|
||||
)
|
||||
# ... 其余初始化代码
|
||||
|
||||
def bypass_debugger(self):
|
||||
"""绕过调试器检测"""
|
||||
self.page.add_init_script("""
|
||||
@@ -188,10 +263,12 @@ class WebBrowser:
|
||||
)
|
||||
self.page = self.context.new_page()
|
||||
self.anti_detection()
|
||||
self.enhanced_anti_detection()
|
||||
# 立即执行一次反检测
|
||||
self.page.evaluate("""
|
||||
delete navigator.__proto__.webdriver;
|
||||
""")
|
||||
self.human_like_actions()
|
||||
self.random_behavior()
|
||||
|
||||
def close_browser(self):
|
||||
@@ -243,7 +320,9 @@ class WebBrowser:
|
||||
self.page.evaluate("""
|
||||
delete navigator.__proto__.webdriver;
|
||||
""")
|
||||
|
||||
self.page.wait_for_load_state("networkidle")
|
||||
self.human_like_actions()
|
||||
self.random_behavior()
|
||||
return True
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user