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
相关产品推荐
相关产品推荐

