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

Firefox扩展开发:获取当前标签页对应代理的公网IP地址

获取Firefox容器标签页代理下的公网IP解决方案

你提到的tabs.executeScript是可行的核心方案——注入到目标标签页的脚本会继承该标签页所属容器的代理配置,发起的请求会走对应代理,从而拿到代理后的公网IP。以下是完整实现步骤:

1. 配置扩展权限

首先在manifest.json中添加必要权限,确保扩展能访问标签页并发起IP查询请求:

Manifest V2 示例

{
  "manifest_version": 2,
  "name": "容器IP查询工具",
  "version": "1.0",
  "permissions": [
    "tabs",
    "https://api.ipify.org/*"
  ],
  "browser_action": {
    "default_popup": "popup.html"
  }
}

Manifest V3 示例

{
  "manifest_version": 3,
  "name": "容器IP查询工具",
  "version": "1.0",
  "permissions": ["tabs", "scripting"],
  "host_permissions": ["https://api.ipify.org/*"],
  "action": {
    "default_popup": "popup.html"
  }
}

2. 核心逻辑实现

在扩展的弹窗脚本(如popup.js)中,通过查询当前活动标签页并注入脚本,获取代理IP:

Manifest V2 代码

document.addEventListener('DOMContentLoaded', () => {
  const ipDisplay = document.getElementById('ip-display');
  
  browser.tabs.query({active: true, currentWindow: true})
    .then(tabs => {
      const activeTab = tabs[0];
      // 注入脚本到目标标签页,发起IP查询请求
      return browser.tabs.executeScript(activeTab.id, {
        code: `
          fetch('https://api.ipify.org?format=json')
            .then(res => res.json())
            .then(data => data.ip)
            .catch(err => \`获取失败: \${err.message}\`);
        `
      });
    })
    .then(results => {
      ipDisplay.textContent = `当前容器代理IP: ${results[0]}`;
    })
    .catch(err => {
      console.error('脚本执行失败:', err);
      ipDisplay.textContent = `错误: ${err.message}`;
    });
});

Manifest V3 代码

document.addEventListener('DOMContentLoaded', () => {
  const ipDisplay = document.getElementById('ip-display');
  
  browser.tabs.query({active: true, currentWindow: true})
    .then(tabs => {
      const activeTab = tabs[0];
      // Manifest V3 使用 scripting API 注入脚本
      return browser.scripting.executeScript({
        target: {tabId: activeTab.id},
        func: async () => {
          try {
            const res = await fetch('https://api.ipify.org?format=json');
            const data = await res.json();
            return data.ip;
          } catch (err) {
            return `获取失败: ${err.message}`;
          }
        }
      });
    })
    .then(results => {
      ipDisplay.textContent = `当前容器代理IP: ${results[0].result}`;
    })
    .catch(err => {
      console.error('脚本执行失败:', err);
      ipDisplay.textContent = `错误: ${err.message}`;
    });
});

3. 弹窗页面(popup.html)

简单的页面用于展示IP:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <style>
    body { width: 200px; padding: 10px; }
  </style>
</head>
<body>
  <div id="ip-display">正在获取IP...</div>
  <script src="popup.js"></script>
</body>
</html>

关键说明

  • 容器上下文继承:Firefox容器标签页的代理配置与标签页绑定,注入到该标签页的脚本发起的网络请求会自动使用对应容器的代理,确保返回的IP是代理后的公网IP。
  • IP查询服务:示例中使用ipify.org的API,你也可以替换成其他可靠的IP查询服务,只要确保manifest中添加了对应的主机权限。
  • 错误处理:代码中包含了脚本注入失败、网络请求失败的捕获,避免扩展崩溃并给用户明确提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:31:26