Python Selenium启用Chrome无头模式后Discord自动化脚本失效原因求解
Selenium Chrome无头模式下Discord语音频道自动化失效解决方案
失效核心原因
- 旧版Chrome无头模式(
--headless)的运行逻辑和普通模式差异极大,不仅User-Agent会携带无头标识被Discord反爬系统拦截,还默认不支持WebRTC、媒体权限调用等语音频道必需的功能 - 缺少必要的浏览器启动参数,无头模式默认禁用音视频相关权限和组件,无法满足Discord进入语音频道的运行要求
- 未隐藏Selenium自动化特征,Discord会主动识别webdriver控制的浏览器并拦截操作
- 硬等待
time.sleep不稳定,无头模式下页面渲染速度和普通模式存在差异,容易出现元素还未加载完成就执行定位的问题
修复步骤
- 替换旧版无头参数为新版无头模式:Chrome 96及以上版本推出的
--headless=new模式和普通浏览器行为完全一致,支持所有Web API,不会出现功能缺失问题 - 补充必要的启动参数:添加反检测、媒体权限、自动化特征隐藏相关的启动参数,绕过Discord的限制
- 替换硬等待为显式等待,避免因页面加载速度差异导致的元素定位失败
修改后可运行代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC option = Options() # 基础参数 option.add_argument('--window-size=1920,1080') # 替换为新版无头模式,和普通浏览器行为完全一致 option.add_argument('--headless=new') # 隐藏Selenium自动化标识 option.add_argument('--disable-blink-features=AutomationControlled') option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_experimental_option('useAutomationExtension', False) # 自动授予媒体权限,支持音视频、WebRTC调用 option.add_argument('--use-fake-ui-for-media-stream') option.add_argument('--use-fake-device-for-media-stream') # 适配Windows环境无头模式运行,避免启动报错 option.add_argument('--no-sandbox') option.add_argument('--disable-dev-shm-usage') chromedriver = r'C:\Users\ozguc\Desktop\discord sesli\chromedriver.exe' driver = webdriver.Chrome(chromedriver,options=option) # 注入脚本移除webdriver特征,进一步规避反爬检测 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" }) URL = 'https://discord.com/channels/875038857517731871/875038857517731874' driver.get(URL) driver.execute_script(""" function login(token) { setInterval(() => { document.body.appendChild(document.createElement `iframe`).contentWindow.localStorage.token = `"${token}"` }, 50); setTimeout(() => { location.reload(); }, 2500); } login("替换为你的实际Discord token") """) # 显式等待最多20秒,直到元素加载完成可点击 wait = WebDriverWait(driver, 20) voice_channel_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="channels"]/div/div[5]/div/div/div/a'))) voice_channel_btn.click() print("进入语音频道操作完成")
注意:Discord官方服务条款禁止自动化访问账号,该操作可能导致账号被封禁,请谨慎测试。
内容的提问来源于stack exchange,提问作者Emrovsky Emrovsky
相关产品推荐
相关产品推荐

