起因 天塌了,我一直是使用右键打开帖子,难怪话题浏览数酷酷往下掉。 - 搞七捻三 - LINUX DO

因为习惯使用新标签打开每一个L站的帖子浏览,最近突然发现自己的浏览话题数居然不达标了,但是我基本都是高强度猛猛刷L站的,这下可难受了,3级要不保了。于是使用AI把自己的油猴脚本更新了一下,目前可以正常增加话题浏览数了。
// ==UserScript==
// @name Linux.do 新标签打开话题并记录浏览量
// @namespace local-linuxdo
// @version 3.0.0
// @description Linux.do 话题强制新标签打开,并在后台标签页补发 Discourse 浏览追踪请求
// @author sansan048
// @match https://linux.do/*
// @match https://idcflare.com/*
// @run-at document-start
// @grant none
// ==/UserScript==
(() => {
"use strict";
/**
* Part 1:
* 在列表页、搜索页、通知菜单等位置,强制话题链接从新标签打开
*/
document.addEventListener(
"click",
function (e) {
const selector = `
.topic-list a.title,
.topic-list a.raw-topic-link,
.search-results .topic-title,
.user-menu .notification a,
.user-menu .quick-access-panel li a
`;
const link = e.target.closest(selector);
if (!link) return;
// 排除菜单里的 tab / button,避免点通知分类按钮也新开标签
if (link.classList.contains("btn")) return;
const href = link.href;
if (!href) return;
// 只处理 linux.do 内部链接
if (!href.startsWith("https://linux.do/")) return;
// 只处理话题页链接,避免用户菜单里的设置、个人页等也被新开
const url = new URL(href);
if (!url.pathname.startsWith("/t/")) return;
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
window.open(href, "_blank", "noopener");
},
true
);
/**
* Part 2:
* 如果当前页面本身是话题页,并且是后台新标签打开,
* 则补发 Discourse track view 请求。
*/
const topicId = getTopicId(location.pathname);
if (!topicId) return;
const storageKey = `linuxdo-track-view:${topicId}:${location.pathname}`;
function isBackgroundTab() {
return document.visibilityState === "hidden" || !document.hasFocus();
}
function trackTopicViewOnce() {
// 已补发过就不再重复请求
if (sessionStorage.getItem(storageKey)) return;
// 前台标签页交给 Discourse 原生逻辑,不干预
if (!isBackgroundTab()) return;
sessionStorage.setItem(storageKey, String(Date.now()));
fetch(`/t/${topicId}.json?track_visit=true&forceLoad=true`, {
method: "GET",
credentials: "include",
cache: "no-store",
headers: {
Accept: "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
// 关键请求头:让 Discourse 识别这是一次话题浏览追踪
"Discourse-Present": "true",
"Discourse-Track-View": "true",
"Discourse-Track-View-Topic-Id": topicId
}
})
.then((response) => {
const info = {
topicId,
status: response.status,
trackView: response.headers.get("x-discourse-trackview"),
browserPageView: response.headers.get("x-discourse-browserpageview")
};
console.debug("[linux.do track view patch]", info);
// 请求失败时允许后续重试
if (!response.ok) {
sessionStorage.removeItem(storageKey);
}
})
.catch((error) => {
sessionStorage.removeItem(storageKey);
console.error("[linux.do track view patch]", error);
});
}
// document-start 时尝试一次
trackTopicViewOnce();
// 后台标签页 visibilityState 有时初始化较慢,延迟再试几次
setTimeout(trackTopicViewOnce, 300);
setTimeout(trackTopicViewOnce, 1200);
setTimeout(trackTopicViewOnce, 2500);
function getTopicId(pathname) {
const parts = pathname.split("/").filter(Boolean);
// /t/12345
if (parts[0] === "t" && /^\d+$/.test(parts[1] || "")) {
return parts[1];
}
// /t/slug/12345
if (parts[0] === "t" && /^\d+$/.test(parts[2] || "")) {
return parts[2];
}
return null;
}
})();
可以继续愉快的猛猛刷L站了 ^-^