Last active
April 28, 2026 03:10
-
-
Save kaixinol/c1426b3a5f3fadb7a13999eb63ab0a7a to your computer and use it in GitHub Desktop.
Bilibili 账户已注销修正
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name Bilibili 账号已注销修正 | |
| // @name:zh-CN Bilibili 账号已注销修正 | |
| // @namespace http://tampermonkey.net/ | |
| // @version 2.8.1.post | |
| // @license MIT | |
| // @description 修正Bilibili 账户已注销的主页链接,修改为 https://www.bilibili.com/list/$UID | |
| // @description:zh-CN 修正Bilibili 账户已注销的主页链接,修改为 https://www.bilibili.com/list/$UID | |
| // @author Kaesinol | |
| // @match https://*.bilibili.com/* | |
| // @grant GM.notification | |
| // @grant GM.openInTab | |
| // @grant GM.getValue | |
| // @grant GM.setValue | |
| // @run-at document-end | |
| // @icon https://www.gstatic.com/android/keyboard/emojikitchen/20220506/u1f47b/u1f47b_u1f5d1-ufe0f.png | |
| // @downloadURL https://update.greasyfork.org/scripts/528706/Bilibili%20%E8%B4%A6%E5%8F%B7%E5%B7%B2%E6%B3%A8%E9%94%80%E4%BF%AE%E6%AD%A3.user.js | |
| // @updateURL https://update.greasyfork.org/scripts/528706/Bilibili%20%E8%B4%A6%E5%8F%B7%E5%B7%B2%E6%B3%A8%E9%94%80%E4%BF%AE%E6%AD%A3.meta.js | |
| // ==/UserScript== | |
| async function showBetaInviteOnce() { | |
| const KEY = 'biliFix_beta_invited_v3'; | |
| try { | |
| if (window.top !== window) return; | |
| } catch { | |
| return; | |
| } | |
| if (await GM.getValue(KEY)) return; | |
| await GM.setValue(KEY, true); | |
| GM.notification({ | |
| title: '内测邀请', | |
| text: '嗨,目前3.0beta版已经发布,我们诚邀你进行这个版本的内测。', | |
| timeout: 8000, | |
| image: 'https://www.gstatic.com/android/keyboard/emojikitchen/20220506/u1f47b/u1f47b_u1f5d1-ufe0f.png', | |
| onclick: () => { | |
| GM.openInTab( | |
| 'https://github.com/kaixinol/bilibili-account-deletion-correction/releases', | |
| { active: true } | |
| ); | |
| } | |
| }); | |
| } | |
| (async () => { | |
| await showBetaInviteOnce(); | |
| })(); | |
| (function () { | |
| "use strict"; | |
| window.addEventListener( | |
| "biliFix:request-api", | |
| (e) => typeof e.detail === "function" && e.detail({ uidToShortId }), | |
| ); | |
| const DEAD_USERNAME = "账号已注销"; | |
| function estimateRegisterTime(uid) { // 来源: https://www.bilibili.com/read/cv35787158 | |
| const n = BigInt(uid); | |
| const len = uid.length; | |
| if (len === 15 || len === 16) { | |
| return "≈ 2022-03-21 之后(15/16位UID时代)"; | |
| } | |
| if (len === 10) return "≈ 2020-10-29 之后(10位UID时代)"; | |
| const ranges = [ | |
| [1n, 15n, "2009-06-24"], | |
| [16n, 20n, "2009-06-25"], | |
| [21n, 23n, "暂无资料"], | |
| [24n, 25n, "2009-06-26"], | |
| [26n, 26n, "2009-06-28"], | |
| [27n, 27n, "2009-06-29"], | |
| [28n, 29n, "2009-07-06"], | |
| [30n, 83n, "2009-07-09"], | |
| [84n, 84n, "2009-07-11"], | |
| [85n, 91n, "2009-07-12"], | |
| [92n, 528n, "2009-07-13"], | |
| [529n, 1543n, "2009-07-14"], | |
| [1544n, 5697n, "2009-07-15 ~ 2009-12-13"], | |
| [5698n, 5707n, "2009-12-14"], | |
| [5708n, 5711n, "2009-12-15"], | |
| [5712n, 5714n, "2009-12-16"], | |
| [5715n, 9999n, "2010-01-01 ~ 2010-02-05"], | |
| [10000n, 44186n, "2010-02-05 ~ 2010-06-25"], | |
| [44187n, 78765n, "2010-06-26 ~ 2010-12-23"], | |
| [78766n, 99999n, "2011-01-03 ~ 2011-02-03"], | |
| [100001n, 259332n, "2011-02-03 ~ 2011-12-16"], | |
| [259333n, 680417n, "2012-01-01 ~ 2012-12-26"], | |
| [680418n, 960021n, "2013-01-01 ~ 2013-05-02"], | |
| [1111111n, 2954623n, "2013-05-02 ~ 2013-12-31"], | |
| [2954624n, 7532842n, "2014-01-01 ~ 2014-12-31"], | |
| [7532843n, 9999999n, "2015-01-01 ~ 2015-05-01"], | |
| [10000000n, 20593642n, "2015-05-01 ~ 2015-12-31"], | |
| [20593643n, 73886290n, "2016-01-01 ~ 2016-12-31"], | |
| [73886291n, 99999999n, "2017-01-01 ~ 2017-03-31"], | |
| [100000000n, 272960616n, "2017-03-31 ~ 2017-12-31"], | |
| [272960617n, 393942207n, "2018-01-01 ~ 2018-12-31"], | |
| [393942208n, 490696435n, "2019-01-01 ~ 2019-12-31"], | |
| [490696436n, 703223216n, "2020-01-01 ~ 2020-10-29"], | |
| ]; | |
| for (const [min, max, date] of ranges) { | |
| if (n >= min && n <= max) return date; | |
| } | |
| return "未知时间"; | |
| } | |
| function processLinks() { | |
| const rules = { | |
| "space.bilibili.com/\\d+/favlist": { | |
| query: "div.bili-video-card__subtitle a", | |
| }, | |
| "space.bilibili.com/\\d+/relation/*": { | |
| query: "a.relation-card-info__uname", | |
| }, | |
| "www.bilibili.com/(video|list)/": { | |
| type: "intercept", | |
| query: [ | |
| ".up-detail-top a", | |
| "a.staff-name", | |
| "div.basic-desc-info a.mention-user", | |
| ], | |
| }, | |
| "search.bilibili.com": { | |
| query: ".bili-video-card__info--owner", | |
| }, | |
| "www.bilibili.com/opus/\\d+": { | |
| type: "override", | |
| query: ".opus-module-author:not([data-processed])", | |
| }, | |
| }; | |
| Object.entries(rules).forEach(([host, { query, type }]) => { | |
| if (RegExp(host).test(location.href)) { | |
| const queries = Array.isArray(query) ? query : [query]; | |
| queries.forEach((q) => { | |
| document.querySelectorAll(q).forEach((el) => { | |
| handleElement(el, type); | |
| }); | |
| }); | |
| } | |
| }); | |
| } | |
| function uidToShortId(n) { | |
| n = BigInt(n); | |
| const chars = | |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"; | |
| let res = ""; | |
| while (n > 0n) { | |
| res = chars[Number(n % 64n)] + res; | |
| n /= 64n; | |
| } | |
| return res || "A"; | |
| } | |
| function handleElement(tag, type = "normal") { | |
| let text = null; | |
| let regular = true; | |
| if ( | |
| ["space.bilibili.com", "search.bilibili.com", "bilibili.com/opus"] | |
| .some( | |
| (prefix) => | |
| (location.hostname + location.pathname).includes( | |
| prefix, | |
| ), | |
| ) | |
| ) { | |
| text = tag.text.split(" ").filter((s) => s.trim() !== "")[0]; | |
| regular = false; | |
| } else { | |
| text = tag.text; | |
| } | |
| const str = text.trim(); | |
| if (str === DEAD_USERNAME || str === `@${DEAD_USERNAME}`) { | |
| const match = type === "override" | |
| ? true | |
| : tag.href.match(/\/(\d+)\??/); | |
| tag.style.fontStyle = "italic"; | |
| // ===== override(动态获取 uid)===== | |
| if (match && type === "override") { | |
| const uid = window.__INITIAL_STATE__?.detail?.basic?.uid ?? | |
| window.__INITIAL_STATE__?.detail?.modules?.find( | |
| (m) => m.module_author, | |
| )?.module_author?.mid; | |
| if (!uid) return; | |
| makeLinkPreview(tag, `https://www.bilibili.com/list/${uid}`); | |
| tag.addEventListener( | |
| "click", | |
| (e) => { | |
| e.preventDefault(); | |
| window.open( | |
| `https://www.bilibili.com/list/${uid}`, | |
| "_blank", | |
| ); | |
| }, | |
| { capture: true }, | |
| ); | |
| tag.querySelector(".opus-module-author__name").text = str + | |
| uidToShortId(uid); | |
| tag.setAttribute("data-processed", "true"); | |
| return; | |
| } | |
| // ===== 普通处理 ===== | |
| if (match) { | |
| if (regular) { | |
| tag.text = tag.text.trim() + uidToShortId(match[1]); | |
| } else { | |
| tag.text = tag.text.replace( | |
| str, | |
| str + uidToShortId(match[1]), | |
| ); | |
| } | |
| } | |
| if ( | |
| tag.scrollWidth > tag.clientWidth || | |
| tag.scrollHeight > tag.clientHeight | |
| ) { | |
| tag.title = tag.textContent; | |
| if (tag.textContent.includes(" · ")) { | |
| tag.textContent = tag.textContent.replace( | |
| / · 收藏于\d+-\d+-\d+$/, | |
| "", | |
| ); | |
| } | |
| } | |
| // ===== 跳转处理 ===== | |
| if (match && type === "normal") { | |
| tag.href = `https://www.bilibili.com/list/${match[1]}`; | |
| } else if (match && type === "intercept") { | |
| makeLinkPreview( | |
| tag, | |
| `https://www.bilibili.com/list/${match[1]}`, | |
| ); | |
| } | |
| const time = estimateRegisterTime(match[1]); | |
| if (!tag.dataset.regTimeAdded) { | |
| tag.setAttribute("data-reg-time", time); | |
| tag.title = tag.title | |
| ? tag.title + "\n注册时间推测: " + time | |
| : "注册时间推测: " + time; | |
| tag.dataset.regTimeAdded = "1"; | |
| } | |
| } | |
| } | |
| function makeLinkPreview(el, url) { | |
| if (el.dataset.linkPreview === "1") return; | |
| el.dataset.linkPreview = "1"; | |
| const proxy = document.createElement("span"); | |
| Object.assign(proxy.style, { | |
| position: "absolute", | |
| top: "0", | |
| left: "0", | |
| width: "100%", | |
| height: "100%", | |
| display: "block", | |
| cursor: "pointer", | |
| zIndex: "10", | |
| }); | |
| if (getComputedStyle(el).position === "static") { | |
| el.style.position = "relative"; | |
| } | |
| proxy.addEventListener("click", (e) => { | |
| e.preventDefault(); | |
| e.stopPropagation(); | |
| window.open(url, "_blank", "noopener,noreferrer"); | |
| }); | |
| el.appendChild(proxy); | |
| } | |
| function processCommentRenderers(elements) { | |
| elements.forEach((renderer) => { | |
| const bili = renderer.shadowRoot.querySelector( | |
| "bili-comment-renderer", | |
| ); | |
| const userInfo = bili.shadowRoot.querySelector( | |
| "bili-comment-user-info", | |
| ); | |
| const user = userInfo.shadowRoot.querySelector("#user-name a"); | |
| if (user) handleElement(user); | |
| function processRichTextLinks(richText) { | |
| richText.shadowRoot | |
| .querySelector("bili-rich-text") | |
| .shadowRoot.querySelectorAll('a[data-type="mention"]') | |
| .forEach((a) => { | |
| if (a.textContent.trim() === "@账号已注销") { | |
| handleElement(a); | |
| } | |
| }); | |
| } | |
| processRichTextLinks(bili); | |
| const replies = renderer.shadowRoot.querySelector( | |
| "bili-comment-replies-renderer", | |
| ); | |
| const replyNodes = replies.shadowRoot.querySelectorAll( | |
| "bili-comment-reply-renderer", | |
| ); | |
| replyNodes.forEach((reply) => { | |
| const rUser = reply.shadowRoot | |
| .querySelector("bili-comment-user-info") | |
| .shadowRoot.querySelector("#user-name a"); | |
| if (rUser) handleElement(rUser); | |
| processRichTextLinks(reply); | |
| }); | |
| if (!replies.shadowRoot.textContent.trim()) { | |
| renderer.setAttribute("data-processed", "true"); | |
| return; | |
| } | |
| }); | |
| } | |
| function processComments() { | |
| const startElement = document.querySelector("bili-comments"); | |
| if (startElement && startElement.shadowRoot) { | |
| const allElements = startElement.shadowRoot.querySelectorAll( | |
| "bili-comment-thread-renderer:not([data-processed])", | |
| ); | |
| processCommentRenderers(allElements); | |
| } | |
| } | |
| function tick() { | |
| processComments(); | |
| processLinks(); | |
| } | |
| // 初始执行 + 持续轮询 | |
| tick(); | |
| setInterval(tick, 2000); | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment