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

在nodriver代理上下文环境中无法加载扩展的问题求助

问题分析与解决方案

你的问题核心是:通过Browser.create_context创建的带代理新上下文,不会继承浏览器启动时通过browser_args配置的扩展加载参数——因为扩展是Chrome浏览器启动阶段通过命令行参数注入的,后续创建的隔离上下文默认不会共享这些扩展配置,同时你在create_context里指定代理会生成一个全新的、独立于初始配置的上下文,导致扩展无法在该上下文生效。

解决方案1:全局代理+共享上下文(适合单代理场景)

直接把代理配置加到浏览器启动的browser_args中,让整个浏览器实例(包括所有上下文/标签)都使用该代理,同时扩展会在启动时加载到所有上下文里。修改后的代码如下:

from nodriver import *
import asyncio

path_to_extension_1 = r'D:\chrome_profile\User Data\Default\Extensions\hoklmmgfnpapgjgcpechhaamimifchmp\6.12.9_0'
path_to_extension_2 = r'D:\chrome_profile\User Data\Default\Extensions\hlkenndednhfkekhgcdicdfddnkalmdm\1.13.0_0'

async def main():
    # 把代理和扩展参数统一放到浏览器启动配置里
    config = Config(
        headless=False,
        user_data_dir=r"D:\chrome_profile\User Data",
        lang="en-US",
        browser_args=[
            # 限制仅加载指定扩展
            f"--disable-extensions-except={path_to_extension_1},{path_to_extension_2}",
            # 加载指定扩展
            f"--load-extension={path_to_extension_1},{path_to_extension_2}",
            # 全局代理配置
            "--proxy-server=socks5://xyz:xyz@123:123",
            # 可选:忽略证书错误(如果代理需要)
            "--ignore-certificate-errors"
        ]
    )

    browser = await Browser.create(config)
    # 直接创建标签页,继承浏览器的代理和扩展配置
    tab = await browser.new_tab("https://jsonip.com/")
    
    await asyncio.sleep(10)
    browser.stop()

if __name__ == '__main__':
    loop().run_until_complete(main())

解决方案2:上下文级代理+手动启用扩展(适合多代理场景)

如果需要为不同上下文配置不同代理,可通过Chrome DevTools Protocol(CDP)在新上下文创建后手动启用扩展。不过这种方式需要确保扩展已在浏览器启动时被允许加载(即保留--disable-extensions-except和--load-extension参数),然后在上下文创建后执行CDP命令:

from nodriver import *
import asyncio

path_to_extension_1 = r'D:\chrome_profile\User Data\Default\Extensions\hoklmmgfnpapgjgcpechhaamimifchmp\6.12.9_0'
path_to_extension_2 = r'D:\chrome_profile\User Data\Default\Extensions\hlkenndednhfkekhgcdicdfddnkalmdm\1.13.0_0'

async def main():
    config = Config(
        headless=False,
        user_data_dir=r"D:\chrome_profile\User Data",
        lang="en-US",
        browser_args=[
            f"--disable-extensions-except={path_to_extension_1},{path_to_extension_2}",
            f"--load-extension={path_to_extension_1},{path_to_extension_2}"
        ]
    )

    browser = await Browser.create(config)
    # 创建带代理的上下文
    context = await browser.create_context(
        proxy_server="socks5://xyz:xyz@123:123"
    )
    # 获取扩展ID(可通过Chrome地址栏输入chrome://extensions/查看)
    extension_ids = ["hoklmmgfnpapgjgcpechhaamimifchmp", "hlkenndednhfkekhgcdicdfddnkalmdm"]
    # 通过CDP启用扩展
    for ext_id in extension_ids:
        await context.execute_cdp("Browser.enable")
        await context.execute_cdp("Browser.setPermission", {
            "origin": f"chrome-extension://{ext_id}/",
            "permission": "extensions",
            "setting": "granted"
        })
    
    # 在该上下文创建标签页
    tab = await context.new_tab("https://jsonip.com/")
    
    await asyncio.sleep(10)
    browser.stop()

if __name__ == '__main__':
    loop().run_until_complete(main())

关键注意事项

  • 确保扩展路径的正确性:路径必须指向扩展的版本目录(比如6.12.9_0),而非上级文件夹。
  • 代理格式验证:socks5://xyz:xyz@123:123格式需确保用户名、密码、主机、端口正确,无特殊字符(如有需URL编码)。
  • 用户数据目录冲突:如果Chrome浏览器已经在运行,需关闭后再运行脚本,避免用户数据目录被占用导致扩展加载失败。

内容的提问来源于stack exchange,提问作者Jawad Ahmad Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:20:15