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

如何在Chrome扩展中获取PAC脚本响应并检测DIRECT返回值

如何在Chrome扩展中获取PAC脚本的执行结果(检测DIRECT返回)

你提到的问题很典型——chrome.proxy.settings.set的回调只是确认代理配置设置成功,没法直接拿到PAC脚本的执行结果。而且自己加载PAC文件调用FindProxyForURL时,确实会遇到浏览器内置PAC函数(比如isPlainHostName、dnsResolve)未定义的问题,不用去Mozilla找实现,Chrome已经给我们提供了更优雅的解决方案。

核心方案:使用chrome.proxy.resolve API

Chrome的chrome.proxy.resolve API专门用来根据当前代理配置(包括PAC脚本)解析指定URL的代理信息,它会让浏览器帮我们执行PAC脚本并返回结果,完全不用处理PAC的环境依赖。

下面是完整的代码示例:

var config = { 
  mode: "pac_script", 
  pacScript: { url: "https://www.example.com/proxy.pac" } 
}; 

chrome.proxy.settings.set({value: config, scope: 'regular'}, function() {
  // 替换成你要检测的目标URL,比如当前活跃标签页的URL或者特定网址
  const targetUrl = "https://www.google.com";
  
  chrome.proxy.resolve({url: targetUrl}, function(result) {
    // 处理可能的错误
    if (chrome.runtime.lastError) {
      console.error("解析代理失败:", chrome.runtime.lastError.message);
      return;
    }

    // 打印PAC返回的完整代理规则
    console.log("PAC执行结果:", result.rules);
    
    // 检测是否返回DIRECT(无需代理)
    const isDirectConnection = result.rules.some(rule => rule.proxyType === 'direct');
    if (isDirectConnection) {
      console.log("该URL无需代理,PAC返回DIRECT");
    } else {
      console.log("该URL需要使用代理:", result.rules);
    }
  });
});

权限配置注意事项

要让这段代码正常工作,你需要在扩展的manifest.json中添加对应的权限:

  • 必须添加"proxy"权限
  • 添加PAC脚本所在域名的host_permissions,以及你要检测的URL的域名权限(或者用<all_urls>覆盖所有情况)

以Manifest V3为例,配置如下:

{
  "manifest_version": 3,
  "name": "PAC代理检测工具",
  "version": "1.0",
  "permissions": ["proxy"],
  "host_permissions": ["https://www.example.com/*", "<all_urls>"]
}

为什么不用自己加载PAC脚本?

你之前尝试用jQuery.getScript加载PAC文件的问题在于,PAC脚本是运行在浏览器专门的PAC执行环境中的,这个环境包含了isPlainHostName、dnsResolve等专属函数,而扩展的背景页/内容脚本环境并没有这些函数。chrome.proxy.resolve直接复用了浏览器内置的PAC执行环境,所以完全不会有函数未定义的问题,是最可靠的方式。

内容的提问来源于stack exchange,提问作者user2650277

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:02:50