// ==UserScript== // @name Twitter/X (推特) t.co 直连 & 完整链接还原 // @name:en Twitter/X t.co Direct Link & Full URL // @namespace http://tampermonkey.net/ // @version 1.0 // @description 将推特推文中的 t.co 链接替换为实际显示的完整 URL(如果可行),并阻止 t.co 跳转跟踪,让点击直接访问目标网站。脚本能够还原被 Twitter 隐藏的完整链接文本。 // @description:en Bypasses the t.co redirection on Twitter/X, replacing the shortened links with the actual full URLs. It also restores truncated links (e.g., "example.com/lon...") to their full original form by retrieving the hidden text from the DOM. // @author Yekyos // @match https://twitter.com/* // @match https://x.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=twitter.com // @license MIT // @grant none // @run-at document-end // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 核心处理函数 function restoreLinks() { // 选择所有包含 t.co 的链接,且排除掉卡片类(带有图片的链接) const links = document.querySelectorAll('a[href*="t.co"]'); links.forEach(link => { // 1. 检查是否已处理,或是否为非文本链接(如卡片、图片容器) if (link.dataset.resolved || link.querySelector('div, img, video')) return; // 2. 获取链接的完整文本 // Twitter 将完整链接拆分为多个 span,部分 hidden,使用 textContent 可以获取所有文本 let rawText = link.textContent.trim(); // 3. 清洗文本:移除末尾的省略号 (unicode … 或 ...) let cleanUrl = rawText.replace(/…$/, '').replace(/\.\.\.$/, ''); // 4. 验证是否为有效 URL (简单判断 http 开头) if (cleanUrl.startsWith('http')) { // 标记已处理 link.dataset.resolved = "true"; // --- 修改跳转地址 --- link.href = cleanUrl; // --- 修改显示文本 --- // 强制显示完整链接,并处理换行防止破坏布局 link.innerText = cleanUrl; link.style.wordBreak = "break-all"; link.style.textDecoration = "underline"; // 加上下划线表示已修改 link.style.textDecorationColor = "rgba(29, 155, 240, 0.5)"; link.title = `Original: ${cleanUrl}`; // --- 阻止 Twitter 劫持 --- // 阻止事件冒泡,防止 Twitter 路由接管点击 link.addEventListener('click', (e) => { e.stopPropagation(); }, true); } }); } // 监听 DOM 变化 (Twitter 是 SPA,内容动态加载) const observer = new MutationObserver((mutations) => { restoreLinks(); }); observer.observe(document.body, { childList: true, subtree: true }); // 初始执行 restoreLinks(); })();