-
Notifications
You must be signed in to change notification settings - Fork 42
Open
Labels
Description
非常喜欢您的插件,可视化效果做得太漂亮了!不过,设置中说火狐不支持统计本地文件阅读时间,这让它的功能对我来说缺失了重要一环。我问了问ChatGPT,也许能供您参考?
下面我用 Firefox / WebExtensions(Manifest V2/MV3 通用) 的角度,给你说明能做到什么、做不到什么、以及可行的实现方案。
你想做的事情分两部分:
- 读取用户在浏览器中打开的本地文件名(file:/// 路径)
- 统计每个标签页的浏览时间
一、能否读取本地文件名?
结论:可以,但只限于你能访问到 tab.url,并且用户必须手动授予 Host 权限。
Firefox 对 file:// 有额外保护,扩展 默认不能访问本地文件的 URL。
你必须要求用户启用:
about:config → privacy.file_unique_origin = false
"permissions": ["tabs"],
"host_permissions": [
"file:///*"
]然后要用户去扩展详情 → 权限 → “允许访问文件 URL”。
获取文件名示例
browser.tabs.query({}).then(tabs => {
tabs.forEach(t => {
if (t.url.startsWith("file://")) {
console.log("本地文件路径:", t.url);
}
});
});这就能得到类似:
file:///C:/Users/.../example.pdf
file:///D:/books/a.html
二、如何统计浏览时间?
核心原则
浏览时间=某标签页在前台停留的时长。
关键事件有:
tabs.onActivated(前台标签变化)windows.onFocusChanged(浏览器失焦/获焦)tabs.onUpdated(URL改变时重置计时)
最小可运行示例(后台脚本 background.js)
let activeTabId = null;
let activeStart = null;
let stats = {}; // tabId → milliseconds
function startTiming(tabId) {
activeTabId = tabId;
activeStart = Date.now();
}
function stopTiming() {
if (activeTabId !== null && activeStart !== null) {
const duration = Date.now() - activeStart;
stats[activeTabId] = (stats[activeTabId] || 0) + duration;
console.log(`Tab ${activeTabId} 浏览时间累计:${stats[activeTabId]} ms`);
}
activeTabId = null;
activeStart = null;
}
// 切换活动标签
browser.tabs.onActivated.addListener(activeInfo => {
stopTiming();
startTiming(activeInfo.tabId);
});
// 浏览器窗口是否聚焦
browser.windows.onFocusChanged.addListener(windowId => {
if (windowId === browser.windows.WINDOW_ID_NONE) {
stopTiming(); // 失焦
} else {
browser.tabs.query({ active: true, windowId }).then(tabs => {
if (tabs[0]) startTiming(tabs[0].id);
});
}
});
// 当页面刷新/导航时
browser.tabs.onUpdated.addListener((tabId, changeInfo) => {
if (changeInfo.status === "loading" && tabId === activeTabId) {
stopTiming();
startTiming(tabId);
}
});三、如何确保只统计 PDF/HTML 的本地文件?
判断扩展的条件是 url:
if (url.startsWith("file://") && (url.endsWith(".pdf") || url.endsWith(".html"))) {
// 可以记录
}四、你要做的扩展需要哪些权限?
{
"manifest_version": 3,
"name": "Local File Usage Stats",
"version": "1.0",
"permissions": ["tabs", "storage"],
"host_permissions": [
"file:///*"
],
"background": {
"service_worker": "background.js"
}
}用户必须手动点 “允许访问文件 URL”,否则扩展无法读取本地文件路径。
五、注意:不能读取真实文件内容,只能看到路径
Firefox 扩展 不能访问真实磁盘内容,不能读取 PDF 内容,只能得到:
- URL(即 file:// 路径)
- tab.title(如果有)
这样不会自动泄露敏感数据,也符合法律要求。
六、完整流程总结
- 扩展声明
tabs和file:///*host 权限 - 让用户手动开启“允许访问文件 URL”
- 后台脚本监听页面激活与焦点变化,计算浏览时间
- 通过
tab.url获取本地文件路径 - 把统计数据存到
browser.storage.local