You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:53:12