Files
user-scripts/423down-vip.js
T
nite 0438cfc97d fix: 服务端返回标题+正文,修复替换后标题丢失问题
- 423down-vip.js: 改为移除已有 meta/entry 和付费墙占位,插入服务端完整 HTML
- 版本号 1.0.0 → 1.1.0
2026-07-22 12:29:01 +08:00

110 lines
3.1 KiB
JavaScript

// ==UserScript==
// @name 423down VIP 资源获取
// @namespace https://www.nite07.com/
// @author Nite
// @homepageURL https://www.nite07.com/
// @match https://www.423down.com/*.html
// @connect 423.nite07.com
// @connect *.nite07.com
// @grant GM_xmlhttpRequest
// @run-at document-end
// @version 1.1.0
// @license MIT
// ==/UserScript==
(function () {
"use strict";
const API_ORIGIN = "https://423.nite07.com";
const ARTICLE_PATH_RE = /^\/(\d+)\.html$/;
const articleID = getArticleID(window.location.pathname);
if (!articleID) {
return;
}
replaceArticleHTML(articleID);
function getArticleID(pathname) {
const match = pathname.match(ARTICLE_PATH_RE);
return match ? match[1] : "";
}
function replaceArticleHTML(articleID) {
requestArticleHTML(articleID)
.then((html) => {
const contentDiv = document.querySelector("div.content");
if (!contentDiv) {
console.warn("[423down-proxy] 未找到正文容器,无法替换 HTML");
return;
}
// 移除已有的 meta(标题)和 entry(正文),避免重复
contentDiv
.querySelectorAll("div.meta, div.entry")
.forEach((el) => el.remove());
// 移除第一个子元素(付费墙占位 div,无 class)
const firstChild = contentDiv.firstElementChild;
if (firstChild && firstChild.tagName === "DIV" && !firstChild.className) {
firstChild.remove();
}
// 在 content 开头插入服务端返回的完整 HTML(含标题+正文)
contentDiv.insertAdjacentHTML("afterbegin", html);
console.info(`[423down-proxy] 已替换文章 ${articleID} 的正文 HTML`);
})
.catch((error) => {
console.error("[423down-proxy] 获取文章 HTML 失败:", error);
});
}
function requestArticleHTML(articleID) {
const url = `${API_ORIGIN}/?article_id=${encodeURIComponent(articleID)}`;
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url,
responseType: "json",
timeout: 30_000,
onload(response) {
if (response.status < 200 || response.status >= 300) {
reject(new Error(`HTTP ${response.status}`));
return;
}
const data = parseResponse(response);
if (!data || data.ok !== true || typeof data.html !== "string") {
reject(
new Error(data && data.error ? data.error : "接口响应格式不正确"),
);
return;
}
resolve(data.html);
},
onerror() {
reject(new Error("网络请求失败"));
},
ontimeout() {
reject(new Error("网络请求超时"));
},
});
});
}
function parseResponse(response) {
if (response.response && typeof response.response === "object") {
return response.response;
}
try {
return JSON.parse(response.responseText);
} catch (error) {
console.error("[423down-proxy] JSON 解析失败:", error);
return null;
}
}
})();