Selenium代码中IPv6代理失效,报ERR_TUNNEL_CONNECTION_FAILED错误求助
排查并修复Selenium Chrome IPv6代理认证的ERR_TUNNEL_CONNECTION_FAILED错误
核心问题分析
你遇到的错误核心原因是IPv6地址未按Chrome要求格式化,另外还有几处配置细节需要调整,导致代理隧道连接失败。
具体修复步骤
1. 修正IPv6代理地址格式
Chrome要求IPv6代理地址必须用方括号[]包裹,修改background_js中的host配置:
singleProxy: { scheme: "http", // 根据代理实际类型调整,如https host: "[%s]", // 给IPv6地址添加方括号 port: parseInt(%s) },
2. 匹配代理scheme与实际类型
如果你的IPv6代理是HTTPS类型,将scheme从"http"改为"https",否则会因协议不匹配导致隧道连接失败。
3. 适配新版Chrome的Manifest配置(推荐)
Manifest V2在Chrome 116+版本中已被限制使用,建议升级到Manifest V3,调整后的manifest_json如下:
{ "version": "1.0.0", "manifest_version": 3, "name": "Chrome Proxy", "permissions": ["proxy", "storage", "webRequest"], "host_permissions": ["<all_urls>"], "background": { "service_worker": "background.js" }, "minimum_chrome_version": "109.0.0" }
对应的background_js同步调整为V3语法:
var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "[%s]", port: parseInt(%s) }, bypassList: ["localhost"] } }; chrome.proxy.settings.set({value: config, scope: "regular"}, () => {}); function callbackFn(details) { return { authCredentials: { username: "%s", password: "%s" } }; } chrome.webRequest.onAuthRequired.addListener( callbackFn, {urls: ["<all_urls>"]}, ['blocking'] );
4. 添加无头模式参数(若需启用)
既然你提到要使用无头模式,在get_chromedriver函数中添加对应参数:
chrome_options.add_argument('--headless=new') # 新版无头模式,替代旧的--headless chrome_options.add_argument('--disable-gpu') # 避免无头模式下的GPU异常
5. 验证代理本身连通性
先通过命令行工具确认IPv6代理可正常访问目标站点,排除代理服务器故障:
curl -x http://[IPv6地址]:端口 -U 用户名:密码 https://test-ipv6.com
修复后的完整代码示例
import zipfile from selenium import webdriver from selenium.webdriver.chrome.service import Service from time import sleep # 替换为你的代理信息 PROXY_HOST = "2001:db8::1" PROXY_PORT = "8080" PROXY_USER = "your_username" PROXY_PASS = "your_password" manifest_json = """ { "version": "1.0.0", "manifest_version": 3, "name": "Chrome Proxy", "permissions": ["proxy", "storage", "webRequest"], "host_permissions": ["<all_urls>"], "background": { "service_worker": "background.js" }, "minimum_chrome_version": "109.0.0" } """ background_js = """ var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "[%s]", port: parseInt(%s) }, bypassList: ["localhost"] } }; chrome.proxy.settings.set({value: config, scope: "regular"}, () => {}); function callbackFn(details) { return { authCredentials: { username: "%s", password: "%s" } }; } chrome.webRequest.onAuthRequired.addListener( callbackFn, {urls: ["<all_urls>"]}, ['blocking'] ); """ % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS) def get_chromedriver(use_proxy=False, user_agent=None): chrome_options = webdriver.ChromeOptions() if use_proxy: plugin_file = 'proxy_auth_plugin.zip' with zipfile.ZipFile(plugin_file, 'w') as zp: zp.writestr('manifest.json', manifest_json) zp.writestr('background.js', background_js) chrome_options.add_extension(plugin_file) if user_agent: chrome_options.add_argument(f'--user-agent={user_agent}') # 添加无头模式参数 chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') s = Service( executable_path='chromedriver.exe' ) driver = webdriver.Chrome( service=s, options=chrome_options ) return driver def main(): driver = get_chromedriver(use_proxy=True, user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') driver.get('https://test-ipv6.com') sleep(10) driver.quit() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者Artik gnom
相关产品推荐
相关产品推荐

