From 2a49a8e13589705d2c54f687e8e6df7a4bf117be Mon Sep 17 00:00:00 2001 From: goodfish-jhy Date: Sat, 21 Feb 2026 18:29:32 +0800 Subject: [PATCH] =?UTF-8?q?Firefox=E5=8E=9F=E7=94=9F=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E5=99=A8=E6=8F=92=E4=BB=B6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebExtensions/Firefox/README.md | 102 ++++++ WebExtensions/Firefox/background.js | 318 ++++++++++++++++++ WebExtensions/Firefox/icon128.png | Bin 0 -> 7389 bytes WebExtensions/Firefox/icon48.png | Bin 0 -> 2736 bytes WebExtensions/Firefox/icons/socket-active.png | Bin 0 -> 7389 bytes .../Firefox/icons/socket-inactive.png | Bin 0 -> 7038 bytes WebExtensions/Firefox/manifest.json | 31 ++ .../web-ext-artifacts/tai_sentry-0.1.zip | Bin 0 -> 29709 bytes 8 files changed, 451 insertions(+) create mode 100644 WebExtensions/Firefox/README.md create mode 100644 WebExtensions/Firefox/background.js create mode 100644 WebExtensions/Firefox/icon128.png create mode 100644 WebExtensions/Firefox/icon48.png create mode 100644 WebExtensions/Firefox/icons/socket-active.png create mode 100644 WebExtensions/Firefox/icons/socket-inactive.png create mode 100644 WebExtensions/Firefox/manifest.json create mode 100644 WebExtensions/Firefox/web-ext-artifacts/tai_sentry-0.1.zip diff --git a/WebExtensions/Firefox/README.md b/WebExtensions/Firefox/README.md new file mode 100644 index 0000000..5a94848 --- /dev/null +++ b/WebExtensions/Firefox/README.md @@ -0,0 +1,102 @@ +# Firefox WebExtension 项目 + +## 项目概述 +本目录包含针对 Firefox 浏览器的 WebExtension 实现。源码包括 `manifest.json`、背景脚本 `background.js`、图标等资源。 + +## 操作系统与构建环境要求 +- **操作系统**:Windows 10/11(亦可在 macOS、Linux 上使用相同脚本的 Bash 版本) +- **Node.js**:版本 ≥ 18(推荐使用 LTS 版本) +- **npm**:版本 ≥ 9 +- **web-ext**:用于打包、签名和运行扩展的官方工具 + +## 所需程序及安装步骤 +1. **安装 Node.js 与 npm** + 前往 https://nodejs.org/ 下载并安装 LTS 版本,安装后 `node -v` 与 `npm -v` 应分别显示 ≥ 18 与 ≥ 9。 + +2. **全局安装 web-ext(如未安装)** + ```powershell + npm i -g web-ext + ``` + 安装完成后可通过 `web-ext --version` 验证。 + +## 构建脚本 +项目根目录下提供 `build.bat`(Windows)脚本,执行以下全部步骤: + +```bat +@echo off +setlocal + +rem ---- 1. 检查 Node 与 npm 版本 ---- +for /f "tokens=*" %%i in ('node -v') do set NODE_VER=%%i +for /f "tokens=*" %%i in ('npm -v') do set NPM_VER=%%i + +echo Detected Node version: %NODE_VER% +echo Detected npm version: %NPM_VER% + +rem 需要的最低版本 +set MIN_NODE=v18.0.0 +set MIN_NPM=9.0.0 + +rem 简单的版本比较(仅检查主版本号) +for /f "tokens=2 delims=v." %%i in ("%NODE_VER%") do set NODE_MAJOR=%%i +for /f "tokens=1 delims=." %%i in ("%MIN_NODE%") do set MIN_NODE_MAJOR=%%i + +for /f "tokens=1 delims=." %%i in ("%NPM_VER%") do set NPM_MAJOR=%%i +for /f "tokens=1 delims=." %%i in ("%MIN_NPM%") do set MIN_NPM_MAJOR=%%i + +if %NODE_MAJOR% LSS %MIN_NODE_MAJOR% ( + echo Error: Node version must be >= %MIN_NODE% + exit /b 1 +) + +if %NPM_MAJOR% LSS %MIN_NPM_MAJOR% ( + echo Error: npm version must be >= %MIN_NPM% + exit /b 1 +) + +rem ---- 2. 安装 web-ext(如果未全局安装)---- +where web-ext >nul 2>&1 +if errorlevel 1 ( + echo web-ext not found, installing globally... + npm i -g web-ext + if errorlevel 1 ( + echo Failed to install web-ext. + exit /b 1 + ) +) else ( + echo web-ext already installed. +) + +rem ---- 3. 执行构建 ---- +rem 创建输出目录 +if not exist dist mkdir dist + +echo Building Firefox extension... +web-ext build --source-dir . --artifacts-dir ./dist +if errorlevel 1 ( + echo Build failed. + exit /b 1 +) + +echo Build succeeded. Artifact saved in ./dist +endlocal +``` + +> **使用方法** +> 1. 将 `build.bat` 放置于 `Firefox` 目录根部。 +> 2. 在 PowerShell 或 CMD 中切换到该目录:`cd Firefox`。 +> 3. 运行脚本:`.\build.bat`。 +> 4. 成功后,`dist` 目录下会出现类似 `my-extension-0.0.1.xpi` 的文件,即可在 Firefox 中加载测试。 + +## 常见问题 +- **找不到 web-ext**:确保全局 `npm` 路径已加入系统 `PATH`,或手动执行 `npm i -g web-ext`。 +- **Node 版本过低**:请升级至 LTS 版本(≥ 18),或使用 nvm 管理多个版本。 +- **构建失败**:检查 `manifest.json` 是否符合 Firefox WebExtension 规范,尤其是 `manifest_version` 与权限声明。 + +--- + +## 任务进度 +- [x] 查看 Firefox 目录结构 +- [x] 编写 README.md(包含构建步骤、环境要求、所需程序及版本) +- [x] 编写 build.bat 脚本,实现完整的构建流程 +- [ ] 验证脚本在当前环境下可执行(如需,可自行运行 `Firefox\build.bat`) \ No newline at end of file diff --git a/WebExtensions/Firefox/background.js b/WebExtensions/Firefox/background.js new file mode 100644 index 0000000..08cf6bd --- /dev/null +++ b/WebExtensions/Firefox/background.js @@ -0,0 +1,318 @@ +// ws心跳间隔 +const TEN_SECONDS_MS = 10 * 1000; +// 焦点检测间隔 +const FOCUSED_CHECK_MS = 1000; +// 自动重新通知间隔 +const RENOTIFY_MS = 10 * 1000; +// 重连失败次数进入睡眠状态 +const RECONNECTFAIL_SLEEP = 5; +// Tai WS服务器URL +const WSURL = 'ws://127.0.0.1:8908/TaiWebSentry'; + +let webSocket = null; +let isConnected = false; +let isChromeFocused = true; +let autoReConnectIntervalId = null; +// 是否处于睡眠状态(来源Tai通知) +let isSleep = false; +// 焦点网页数据 +let activePage = { + url: '', + title: '', + icon: '', + startTime: '', + endTime: '', + duration: 0 +}; +// 重连失败次数 +let reconnectFail = 0; + +init(); + +/** + * 初始化插件(入口 + */ +function init() { + connect(); + startWatchFocus(); + startRenofity(); +} + +/** + * 连接Tai + */ +function connect() { + webSocket = new WebSocket(WSURL); + webSocket.onopen = (event) => { + isConnected = true; + isSleep = false; + reconnectFail = 0; + clearInterval(autoReConnectIntervalId); + chrome.browserAction.setIcon({ path: 'icons/socket-active.png' }); + keepAlive(); + console.log("已连接Tai!"); + }; + webSocket.onmessage = (event) => { + console.log(event.data); + if (event.data === 'sleep') { + isSleep = true; + calDuration(); + console.log("睡眠"); + } + else if (event.data === 'wake') { + isSleep = false; + console.log("唤醒"); + } + + }; + webSocket.onclose = (event) => { + isConnected = false; + chrome.browserAction.setIcon({ path: 'icons/socket-inactive.png' }); + console.warn('与Tai失去连接...'); + webSocket = null; + startAutoReConnect(); + }; +} + +function disconnect() { + if (isConnected && webSocket) { + webSocket.close(); + isConnected = false; + } +} + +function startAutoReConnect() { + clearInterval(autoReConnectIntervalId); + autoReConnectIntervalId = setInterval( + () => { + if (!isConnected) { + console.log("尝试重新连接Tai...") + connect(); + reconnectFail++; + // 达到重连失败阈值时进入睡眠状态 + if (reconnectFail >= RECONNECTFAIL_SLEEP && !isSleep) { + isSleep = true; + } + } + }, + TEN_SECONDS_MS + ); +} + +/** + * 保持心跳,防止插件掉线 + */ +function keepAlive() { + const keepAliveIntervalId = setInterval( + () => { + if (isConnected && webSocket) { + console.log('ping'); + webSocket.send('ping'); + } else { + clearInterval(keepAliveIntervalId); + } + }, + // It's important to pick an interval that's shorter than 30s, to + // avoid that the service worker becomes inactive. + TEN_SECONDS_MS + ); +} + + +// Chrome functions + +// 监听Chrome选项卡切换事件 +chrome.tabs.onActivated.addListener(async function + (e) { + const tab = await getTab(e.tabId); + onActivePage(tab); +} +); + +// 监听Chrome选项卡更新事件 +chrome.tabs.onUpdated.addListener(function + (tabId, changeInfo, tab) { + if (changeInfo.status == 'complete' && tab.active) { + onActivePage(tab); + } +} +); + +/** + * 通过TabId获取Tab + * @param {Number} tabId TabId + * @returns Tab + */ +function getTab(tabId) { + return new Promise((resolve, reject) => { + chrome.tabs.get( + tabId, + function (e) { + resolve(e); + } + ) + }); +} + +/** + * 指示当前浏览器是否处于焦点中 + * @returns 焦点中返回true + */ +function isFocused() { + return new Promise((resolve, reject) => { + chrome.windows.getCurrent(function (w) { + resolve(w.focused); + }); + }); + +} + +/** + * 获取当前焦点Tab + * @returns Tab Obj + */ +function getCurrentTab() { + return new Promise((resolve, reject) => { + chrome.tabs.query({ active: true }, function (tab) { + if (tab && tab.length > 0) { + resolve(tab[0]); + } + else { + reject(tab); + } + }); + }); +} + + +// Tai functions + +// 通知失败的集合 +let notifyFailList = []; + +/** + * 重新发送通知失败的数据(最早的一条) + */ +function renotify() { + if (isConnected && webSocket && notifyFailList.length > 0) { + const item = notifyFailList[0]; + notifyFailList.splice(0, 1); + notifyTai(item); + } +} + +/** + * 通知Tai更新数据 + * @param {*} data 统计数据 + */ +function notifyTai(data = { + Url, + Title, + Icon, + Duration, + ActiveTime +}) { + console.log("notify", data); + if (isConnected && webSocket) { + webSocket.send(JSON.stringify(data)); + } + else { + // let item = notifyFailList.find(s => s.Url === data.Url); + // if (item) { + // item.Duration += data.Duration; + // } + // else { + notifyFailList.push(data); + // } + + console.log("failList", notifyFailList) + } +} + +/** + * 响应网页焦点切换 + * @param {ChromeTab} tab Tab + */ +function onActivePage(tab) { + // 睡眠状态不处理 + if (isSleep) return; + + if (activePage && activePage.url) { + if (activePage.url !== tab.url) { + // 统计时间 + calDuration(); + setActive(tab); + } + } + else { + setActive(tab); + } +} + +/** + * 设置当前焦点网页数据 + * @param {*} tab Tab + */ +function setActive(tab) { + const { url, title, favIconUrl: icon } = tab; + if (url) { + activePage = { + url, title, icon, startTime: new Date().getTime() + }; + } + else { + activePage = null; + } +} + +/** + * 计算并通知焦点网页浏览时长 + */ +function calDuration() { + if (activePage && activePage.url) { + let duration = parseInt((new Date().getTime() - activePage.startTime) / 1000); + let activeTime = parseInt(activePage.startTime / 1000); + const { url: Url, title: Title, icon: Icon } = activePage; + activePage = null; + notifyTai({ Url, Title, Icon, Duration: duration, ActiveTime: activeTime }); + } +} + +/** + * 启动焦点监听(用于检测用户是否处于浏览器中 + */ +function startWatchFocus() { + console.log("开始监听焦点"); + setInterval( + async () => { + const focused = await isFocused(); + if (focused) { + if (!isChromeFocused) { + isChromeFocused = true; + // 重置统计 + const tab = await getCurrentTab(); + onActivePage(tab); + console.warn("重置统计") + } + } + else { + if (isChromeFocused) { + isChromeFocused = false; + // 更新时间 + calDuration(); + console.warn("更新时间") + } + } + }, + FOCUSED_CHECK_MS + ); +} + +/** + * 启动定时重新发送失败的数据通知 + */ +function startRenofity() { + setInterval(() => { + renotify(); + }, RENOTIFY_MS); +} \ No newline at end of file diff --git a/WebExtensions/Firefox/icon128.png b/WebExtensions/Firefox/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..55bb63ebe531b3a60703899debc192ec6f7f048c GIT binary patch literal 7389 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 literal 0 HcmV?d00001 diff --git a/WebExtensions/Firefox/icon48.png b/WebExtensions/Firefox/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aa3a8bf2a6827c0b8404a31113647a4180b0d9 GIT binary patch literal 2736 zcmX|D3p~@^8~;tK=Gqcbk(q05+cdJ}GGiExA-6&pA~tN86lv!AD%VmhiBhe|CCa5C zG2%t~*IaV>$J-Q= z%;10HVnzMm(+D{1Z<6RRGq~k%hA>YO8DL}8H_ED{C#C&A4nV5aoIV62O^%|FaUBQtnNbaW&ZfnYM32F$|-5%kjt z6b6GqAPo_QhWa83ea2Z@w11pFjiL4%;{O=dK@18#G%`9gf(HAI=^qdg6Kw{EBYrbM z{KG{g9^zm5M1y}d6hsrLg)WjGMy$dDfH;h3ZFxN8;(}LLxVNqRui(#&wTWkQ3F~jF z1ef#C6}0!mZd}t(#@Xf}#rOP*fU-;p^p(=mtB(h*rD4aNi`)kle&7fM9j-Rn9#FF{ zg3I6bta2SOiOMRsahHk$7rzKQr@~||_I)XzK(9_T`yQpf%uXEoS+my1Vem#Ur~9u< zp3lmTBEl55;uh)!dmp7kNst<&!rpPtfbdaJR;ReCIUd4>Lh&;iL~JGZlQZe{1dJUm zsoJmq*4M*B0l@h_<{vIC*rCKf8yO!TU#L!$zD0(J^3@`8~3fOtmLToFb-0r zPWN-#XJC6GLEV5b=6@ zt@QSGG%|#Planfn2M(MwhC-sb+@@p(54KlQ6L*MUP`K%ey}^4{UcPN%VL{R@3Y2RH zJ~AG?Cp9%Sa;7`C*+iHY&T_4J@hfMn%bjn#+`riu*yNyvJLHq= zcy}>`N=?xlxO@%|`P?#R%sIG)Xm~fAGLR6jkos%M$;0fz`pV6vwvus^qeai#TU#%m zW16PpZ=rq1Mn`i7ghxSr2Lk1HcMF$KHRwt979yBxX=$wq7QE)u2zvLl$Iism&)atT zthBs748e8geX!Aca{@{Kre5pS9OzAC$uFR7#__K+ERW2?J|M=zJ_+da_eE%V>V;W}&0g3=XN2h`F_^zjqP z>5*hBWi}*jmzW{w8c++n29*;xpoqyzSq{ecx^$Z_BD46@WI2t`%irGvrP>k_DPpo2 zFB-}g>w?D`^yiu`ugnR~>BMxnjTJBPJvM5*0wc>yY?2^AKy0fPkObQ{71{ryx39gn z`D($Nv55&^7v$>d>hp#L$p;wSbp77Zg!eDRzpbtsq_=&oy5srew#&@-<5CcjY^yW_5W*;OtIXQJ^ z8UZ&G&Prap4ZFF=@9<&|VV5XeHJaw^sGjb;RE=Kjry6W*Y#@=yBtPW3c9NEl=XmybaaR;`(bzKx9%NeGqGF}5bYRy%h39R669F-X4NCR zQ=0kh-Q5sY`&3=Q5dU3K;y}J91k^SBO7un)Q=M}yU8uMOik9EYsgJJE5xJZ{tpZ<9 zeMI4+N_o6Jk1^i4<{e0=Oj^6*W})B`VdO+Qs$l|6T0hUrloA7;@jx4cG`W)VlJBP! zt>KdUQI-u4*?zRqO8)hwQgZ@VQFAl#Y^J#C&b!DQj zsW=q>95}PLF2&q#wn+wWcLn-9=D?L+yfZ$%F$egCoLc^ln{58bjmj@nBO{1IEW^Px z(9Ho4y~=4C-ARnIY(sGVg@9;hiuHe&r+uY^&&U%R=PPHt?{QC)eri(f+`uyKcY3eGxh*4QtJ%ks;KvcaYwGm?05a*xHDglJ` zpNSCFDgesSUDnYE00JsPuex!10waI@IE(BO9gOTcUBvatwNuaO34{@4@wdn$nF6E~ z**+QA50Y}nPZwvP>D*DxGJ;4<^DENTnssLhNVulQu z6e-zGB+^3V{ri@#u6v|9aK^=*_g(Kse(2i=7Q1*_j_|$9o0X?tFS5N>b@tQXo;(e0 zUrhz!^@>Ix$kLgp^GjCD5yVQtP}Omr`bT7Ky<*~B;j!00?&$SqNA=ffIIR3?aSArP z9wG97HhJpEuF}v^ky9O@_g^>}T+*j_4t>RbT%UbU9*=V_$gc=B@50>t%R9G?zkYAY Y!t-*%g~_*rl;0msBEiwR3h&4IA9Cf~g#Z8m literal 0 HcmV?d00001 diff --git a/WebExtensions/Firefox/icons/socket-active.png b/WebExtensions/Firefox/icons/socket-active.png new file mode 100644 index 0000000000000000000000000000000000000000..55bb63ebe531b3a60703899debc192ec6f7f048c GIT binary patch literal 7389 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 literal 0 HcmV?d00001 diff --git a/WebExtensions/Firefox/icons/socket-inactive.png b/WebExtensions/Firefox/icons/socket-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..c05a74c4e0df59eaa0553905b40e3a9ad434231f GIT binary patch literal 7038 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 O2GLa2RjE?83i}^0rFU}x literal 0 HcmV?d00001 diff --git a/WebExtensions/Firefox/manifest.json b/WebExtensions/Firefox/manifest.json new file mode 100644 index 0000000..5f0d994 --- /dev/null +++ b/WebExtensions/Firefox/manifest.json @@ -0,0 +1,31 @@ +{ + "name": "Tai Sentry", + "description": "Tai网页浏览数据统计拓展", + "version": "0.1", + "manifest_version": 2, + + "icons": { + "48": "icon48.png", + "128": "icon128.png" + }, + + "browser_action": { + "default_icon": "icons/socket-inactive.png" + }, + + "background": { + "scripts": ["background.js"] + }, + + "permissions": ["tabs"], + + "browser_specific_settings": { + "gecko": { + "id": "me@goodfish.site", + "strict_min_version": "142.0", + "data_collection_permissions": { + "required": ["none"] + } + } + } +} \ No newline at end of file diff --git a/WebExtensions/Firefox/web-ext-artifacts/tai_sentry-0.1.zip b/WebExtensions/Firefox/web-ext-artifacts/tai_sentry-0.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..458be6d118dc6397a07982375c9687c1784e038d GIT binary patch literal 29709 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 literal 0 HcmV?d00001