您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
快来填满我吧
当前为
// ==UserScript== // @name linux.do弹幕 // @namespace linux.do弹幕氛围 // @version 0.6.2 // @description 快来填满我吧 // @author nulluser // @match https://linux.do/* // @icon https://linux.do/uploads/default/optimized/1X/3a18b4b0da3e8cf96f7eea15241c3d251f28a39b_2_180x180.png // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; // 创建弹幕容器 const danmuContainer = document.createElement('div'); danmuContainer.id = 'danmu-container'; danmuContainer.style.position = 'fixed'; danmuContainer.style.left = '0'; danmuContainer.style.bottom = '0'; danmuContainer.style.width = '260px'; // 容器宽度 danmuContainer.style.height = '100%'; danmuContainer.style.zIndex = '9999'; danmuContainer.style.overflow = 'hidden'; document.body.appendChild(danmuContainer); // 弹幕数组 let danmus = []; // 添加弹幕 function addDanmu(text) { const danmu = document.createElement('div'); danmu.className = 'danmu'; danmu.textContent = text; danmu.style.position = 'absolute'; danmu.style.whiteSpace = 'nowrap'; danmu.style.color = getRandomColor(); // 随机颜色 danmu.style.fontSize = '20px'; danmu.style.fontWeight = 'bold'; danmu.style.left = getRandomPx(); danmu.style.bottom = '0'; // 弹幕从底部进入 danmu.style.writingMode = 'vertical-lr'; // 文字竖直显示 danmu.style.transform = 'translateX(-100%)'; // 初始位置在容器外 danmuContainer.appendChild(danmu); // 弹幕动画 const pageHeight = document.documentElement.scrollHeight || document.body.scrollHeight; const duration = Math.random() * (pageHeight * 10) + pageHeight * 15; // 随机动画持续时间,基于页面高度 danmu.animate([ { transform: `translateY(-${pageHeight}px)` } // 向上移动直到消失 ], { duration: duration, iterations: 1, easing: 'linear' }).finished.then(() => danmu.remove()); // 更新弹幕位置 updateDanmuPositions(); } // 更新弹幕位置,防止重叠 function updateDanmuPositions() { let lastBottom = 0; // 初始化上一个弹幕的底部位置 danmus.forEach(danmu => { danmu.style.bottom = `${lastBottom}px`; lastBottom = parseFloat(danmu.style.bottom) + danmu.offsetHeight + 20; // 更新下一个弹幕的位置 }); } // 生成随机颜色 function getRandomColor() { const letters = '0123456789ABCDEF'; let color = '#'; for (let i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; } // 获取弹幕数据 function fetchDanmuData() { const currentUrl = window.location.href; const jsonUrl = currentUrl.endsWith('.json') ? currentUrl : currentUrl + '.json'; fetch(jsonUrl) .then(response => response.json()) .then(data => { if (data && data.post_stream && data.post_stream.posts) { const posts = data.post_stream.posts; let postIndex = 1; // 从第二条开始 function addDanmuWithDelay() { if (postIndex < posts.length) { const post = posts[postIndex++]; const cookedContent = post.cooked.replace(/<[^>]*>?/gm, ''); // 移除HTML标签 addDanmu(cookedContent); setTimeout(addDanmuWithDelay, 1000); // 每次添加后间隔0.2秒 } } addDanmuWithDelay(); // 开始添加弹幕 } }) .catch(error => { console.error('Error fetching danmu data:', error); }); } // 假设 addDanmu 函数已经定义,它负责添加弹幕到页面上 // 生成随机位置 function getRandomPx() { const randomNumber = Math.floor(Math.random() * 10) + 1; // 生成1到5的随机数 return randomNumber * 20 + 'px'; // 添加单位px并返回 } // 每隔一段时间添加一个新的弹幕 setInterval(() => { addDanmu('吾皇万岁!'); addDanmu('欢迎来到Linux.do!'); addDanmu('始皇牛牛牛!'); addDanmu('快来填满我吧!'); addDanmu('吾皇万睡!'); }, 10000); fetchDanmuData(); setInterval(() => {fetchDanmuData(); }, 20000); function monitorTopicURLChange(callback) { const urlPattern = /^(https:\/\/linux\.do\/t\/topic\/\d+).*$/; // 正则表达式匹配基本URL let lastMatch = location.href.match(urlPattern); new MutationObserver(() => { const currentMatch = location.href.match(urlPattern); if (currentMatch && (!lastMatch || currentMatch[1] !== lastMatch[1])) { lastMatch = currentMatch; callback(currentMatch[1]); } }).observe(document, { subtree: true, childList: true }); } // 使用示例 monitorTopicURLChange(newBaseURL => { fetchDanmuData(); }); observer.observe(document.body, { childList: true, subtree: true }); window.addEventListener('load', fetchDanmuData); // 监听弹幕容器的大小变化,更新弹幕位置 new ResizeObserver(updateDanmuPositions).observe(danmuContainer); })();