如何让Playwright搭配Chromium发送Proxy-Authorization实现代理认证?
Playwright Chromium 代理认证失败问题解决
问题描述
使用Playwright访问需用户名密码认证的代理服务器(示例:127.0.0.1:8000,用户名abcdef,密码123456)时,Chromium无法正常携带Proxy-Authorization头,导致代理认证失败;但WebKit环境下代理认证可正常工作。
解决方案
方案1:将认证信息嵌入代理URL
把用户名和密码直接拼接在代理地址中,部分代理服务器支持这种基础认证传递方式:
from playwright.sync_api import sync_playwright # 代理配置 server = "http://127.0.0.1:8000" username = "abcdef" password = "123456" dst_url = "http://httpbin.org/ip" def test_chromium_proxy_url_auth(): print("=== 方案1:代理URL嵌入认证信息 ===") # 拼接带认证的代理地址 proxy_host_port = server.split("://")[1] proxy_with_auth = f"http://{username}:{password}@{proxy_host_port}" with sync_playwright() as p: browser = p.chromium.launch() context = browser.new_context(proxy={"server": proxy_with_auth}) page = context.new_page() try: response = page.goto(dst_url, timeout=30000) if response.status == 200: print(f"✅ Chromium 认证成功: {response.status}") else: print(f"❌ Chromium 认证失败: {response.status}") print(f"响应内容: {response.text()}") except Exception as e: print(f"❌ Chromium 执行异常: {e}") finally: browser.close() if __name__ == "__main__": test_chromium_proxy_url_auth()
方案2:路由拦截手动添加认证头
如果方案1无效,可通过拦截所有请求,手动注入Proxy-Authorization头:
from playwright.sync_api import sync_playwright import base64 # 代理配置 server = "http://127.0.0.1:8000" username = "abcdef" password = "123456" dst_url = "http://httpbin.org/ip" def test_chromium_proxy_route_auth(): print("=== 方案2:路由拦截添加认证头 ===") # 生成Basic认证的Base64编码字符串 auth_credentials = f"{username}:{password}".encode() auth_base64 = base64.b64encode(auth_credentials).decode() proxy_auth_header = f"Basic {auth_base64}" with sync_playwright() as p: browser = p.chromium.launch() context = browser.new_context(proxy={"server": server}) # 拦截所有请求,添加代理认证头 context.route("**/*", lambda route: route.continue_(headers={"Proxy-Authorization": proxy_auth_header})) page = context.new_page() try: response = page.goto(dst_url, timeout=30000) if response.status == 200: print(f"✅ Chromium 认证成功: {response.status}") else: print(f"❌ Chromium 认证失败: {response.status}") print(f"响应内容: {response.text()}") except Exception as e: print(f"❌ Chromium 执行异常: {e}") finally: browser.close() if __name__ == "__main__": test_chromium_proxy_route_auth()
方案3:更新Playwright与Chromium版本
部分旧版本的Playwright或Chromium存在代理认证的兼容性bug,执行以下命令更新到最新兼容版本:
playwright install chromium pip install --upgrade playwright
内容的提问来源于stack exchange,提问作者nkbaixiaojie
相关产品推荐
相关产品推荐

