您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
unlock lpsg video access. may need to manually switch video format since I can't figure that part out. Also load all images ASAP instead of having to scroll to them. Also added a button on top left to hide user info, so you can browse the page more quickly.
// ==UserScript== // @name unlock lpsg videos // @namespace MBing // @version 7.0 // @description unlock lpsg video access. may need to manually switch video format since I can't figure that part out. Also load all images ASAP instead of having to scroll to them. Also added a button on top left to hide user info, so you can browse the page more quickly. // @author MBing // @match https://www.lpsg.com/threads* // @icon https://www.google.com/s2/favicons?sz=64&domain=lpsg.com // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; // 控制是否继续切换后缀 let shouldContinue = true; var volume=0.05; var autoSwitchInterval=2500 //创建放按钮的区域 createControlDiv(); //替换不能播放的视频 replaceUnplayableVideos(); //第三个标题栏 createSkipInfoLabel(); //增加纯文字页自动翻页选择框 createCheckboxToAutoJumpTextOnlyPage(); //增加向前翻页选择框 createCheckboxToAutoJumpBackward(); //增加隐藏纯文字帖子按钮 createCheckboxToHideTextOnlyPost(); //第一个标题栏 createUserInfoLabel(); //增加隐藏用户信息按钮 createCheckboxToHideUserInfo(); //点击空白处折叠div createCheckboxToFoldDiv(); //第二个标题栏 createPicLabel(); //把附件的图片改为全部显示而非填满 createCheckboxToChangeAttaImgDisplay(); //每行显示一张图片 createCheckboxToDisplayOnePicPerLine(); //限制图片最大大小 createCheckboxToLimitImgSize(); //滚动到最后时自动跳转到下一页 //scrollToNextPage(); //点击空白处折叠div function createCheckboxToFoldDiv(){ /* ----------- 常量与工具 ----------- */ const STORAGE_KEY = 'TM_messageFoldEnabled'; const ORIGINAL_HEIGHT = 'data-original-height'; /* 读取开关状态 */ let enabled = localStorage.getItem(STORAGE_KEY) === 'true'; /* ----------- 创建固定 checkbox ----------- */ // 创建复选框 const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'fold-div-checkbox'; checkbox.style.marginLeft = '5px'; checkbox.checked = enabled; // 创建复选框标签 const label = document.createElement('label'); label.htmlFor = 'fold-div-checkbox'; label.textContent = 'Click Empty Space Below To Collapse Post'; // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(checkbox); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); /* ----------- 折叠/恢复单个节点 ----------- */ function fold(inner) { if (inner.classList.contains('folded')) return;// 已折叠 const content = inner.querySelector('.message-content.js-messageContent'); /* 记录原始高度 */ if (!inner.hasAttribute(ORIGINAL_HEIGHT)) { inner.setAttribute(ORIGINAL_HEIGHT, window.getComputedStyle(inner).height); } inner.style.height = '500px'; inner.style.backgroundColor = '#6ba65e59'; //inner.style.backgroundColor = '#fff'; inner.style.overflowY = 'hidden'; if (content) content.style.overflowY = 'hidden'; inner.classList.add('folded'); inner.scrollIntoView({ behavior: 'smooth', block: 'start' }); } function restore(inner) { if (!inner.classList.contains('folded')) return; const content = inner.querySelector('.message-content.js-messageContent'); inner.style.height = inner.getAttribute(ORIGINAL_HEIGHT) || ''; inner.style.backgroundColor = ''; inner.style.overflowY = ''; if (content) content.style.overflowY = ''; inner.classList.remove('folded'); } /* ----------- 绑定 / 解绑 ----------- */ function bindToggle(inner) { if (inner._foldClickHandler) return; // 已绑定 const handler = function (ev) { if (ev.target !== inner) return; if (inner.classList.contains('folded')) { restore(inner); } else { fold(inner); } }; inner.addEventListener('click', handler); inner._foldClickHandler = handler; } function unbindToggle(inner) { if (!inner._foldClickHandler) return; inner.removeEventListener('click', inner._foldClickHandler); delete inner._foldClickHandler; restore(inner); } /* ----------- 全量启用 / 禁用 ----------- */ function enableFeature() { document.querySelectorAll('.message-inner').forEach(bindToggle); } function disableFeature() { document.querySelectorAll('.message-inner').forEach(unbindToggle); } /* ----------- 动态节点支持 ----------- */ const mo = new MutationObserver(() => { if (!enabled) return; document.querySelectorAll('.message-inner:not([data-toggle-ready])') .forEach(bindToggle); }); /* ----------- 开关变化处理 ----------- */ checkbox.addEventListener('change', () => { enabled = checkbox.checked; localStorage.setItem(STORAGE_KEY, enabled); if (enabled) { enableFeature(); mo.observe(document.body, { childList: true, subtree: true }); } else { mo.disconnect(); disableFeature(); document.querySelectorAll('.message-inner').forEach(unbindToggle); } }); /* ----------- 初始化 ----------- */ if (enabled) { enableFeature(); mo.observe(document.body, { childList: true, subtree: true }); } } //创建放按钮的区域 function createControlDiv(){ /* // 创建一个固定在左上角的div const controlDiv = document.createElement('div'); controlDiv.id = 'custom-control-div'; controlDiv.style.position = 'fixed'; controlDiv.style.top = '5px'; controlDiv.style.left = '5px'; controlDiv.style.zIndex = '9999'; controlDiv.style.padding = '5px'; controlDiv.style.border = '1px solid #ccc'; controlDiv.style.borderRadius = '5px'; controlDiv.style.fontSize = '14px'; controlDiv.style.backgroundColor = '#a18705'; controlDiv.style.color = 'white'; // 将div添加到页面中 document.body.appendChild(controlDiv); */ // 创建一个折叠的 div const foldableDiv = document.createElement('div'); foldableDiv.id = 'foldableDiv'; foldableDiv.style.transition = 'height 0.5s ease'; // 平滑过渡效果 foldableDiv.style.overflow = 'hidden'; // 隐藏超出部分 foldableDiv.style.cursor = 'pointer'; // 鼠标指针样式 //foldableDiv.style.height = '30px'; // 默认高度为 30px,作为提示区域 foldableDiv.style.position = 'fixed'; foldableDiv.style.top = '5px'; foldableDiv.style.left = '5px'; foldableDiv.style.maxWidth = '250px'; foldableDiv.style.zIndex = '999'; foldableDiv.style.padding = '8px'; foldableDiv.style.border = '1px solid #ccc'; foldableDiv.style.borderRadius = '5px'; foldableDiv.style.fontSize = '14px'; foldableDiv.style.fontWeight = 'bold'; foldableDiv.style.backgroundColor = '#a18705'; foldableDiv.style.color = 'white'; // 创建内容 const controlDiv = document.createElement('div'); controlDiv.id = 'custom-control-div'; //controlDiv.style.padding = '5px'; controlDiv.style.display = 'none'; // 默认隐藏内容 //controlDiv.textContent = '这是折叠的内容,鼠标悬停时显示。'; // 创建提示区域 const hint = document.createElement('div'); //hint.style.padding = '5px'; hint.style.textAlign = 'center'; hint.style.color = 'white'; //hint.style.fontWeight = 'bold'; hint.textContent = 'Extra Enhancements'; // 将内容和提示区域添加到折叠的 div 中 foldableDiv.appendChild(controlDiv); foldableDiv.appendChild(hint); // 将折叠的 div 添加到页面中 document.body.appendChild(foldableDiv); // 鼠标悬停时展开 foldableDiv.addEventListener('mouseover', () => { foldableDiv.style.height = 'auto'; // 展开 controlDiv.style.display = 'block'; // 显示内容 hint.style.display = 'none'; // 隐藏提示区域 }); // 鼠标移开时折叠 foldableDiv.addEventListener('mouseout', () => { //foldableDiv.style.height = '30px'; // 折叠 controlDiv.style.display = 'none'; // 隐藏内容 hint.style.display = 'block'; // 显示提示区域 }); } //限制图片最大大小 function createCheckboxToLimitImgSize(){ // 用于存储用户的选择状态 const maxImgWidthKey = 'maxImgWidthKey'; // 检查localStorage中是否存在maxImgWidthKey变量,若不存在则初始化为"" if (localStorage.getItem(maxImgWidthKey) === null) { localStorage.setItem(maxImgWidthKey, ''); } // 创建一个标签 const label = document.createElement('label'); label.textContent = 'Pic Max Width:'; label.style.marginLeft = '27px'; // 创建一个输入框 const input = document.createElement('input'); input.id = 'max-width-input'; input.type = 'text'; input.style.width = '50px'; input.style.marginLeft = '5px'; input.style.background = 'transparent'; // 透明背景 input.style.border = 'none'; // 移除边框 input.style.borderBottom = '1px solid #fff'; // 下划线样式 input.style.outline = 'none'; // 移除焦点时的边框 input.style.color = '#4f4e4e'; // 输入文字颜色 input.style.fontWeight = 'bold'; //input.style.fontSize = '14px'; // 字体大小 input.style.textAlign = 'center'; // 文字居中 input.addEventListener('change', function() { const value = input.value.trim(); const images = document.querySelectorAll('.message-cell.message-cell--main img:not(.smilie)'); //const images = document.querySelectorAll('.bbImageWrapper.js-lbImage img'); if (value === '') { // 如果输入框为空,移除最大宽度限制 images.forEach(img => img.style.maxWidth = ''); localStorage.setItem(maxImgWidthKey, value); } else if (!isNaN(value) && value > 0) { // 如果输入的是数字,设置最大宽度 images.forEach(img => img.style.maxWidth = value + 'px'); localStorage.setItem(maxImgWidthKey, value); console.log("改变了图片最大尺寸"); } else { // 如果输入的不是数字,清除输入框 input.value = ''; } }); // 初始状态设置 input.value=getMaxImgWidth(); // 创建一个 change 事件 const changeEvent = new Event('change', { bubbles: true, cancelable: true }); // 触发 change 事件 input.dispatchEvent(changeEvent); // 动态获取最大宽度 function getMaxImgWidth() { return localStorage.getItem(maxImgWidthKey); } // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(label); containerDiv.appendChild(input); controlDiv.appendChild(containerDiv); } //第一个标题栏 function createUserInfoLabel(){ // 创建复选框标签 const label = document.createElement('label'); label.textContent = 'User Info Area'; label.style.color = '#ffee9d'; // 输入文字颜色 // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); } //第二个标题栏 function createPicLabel(){ // 创建复选框标签 const label = document.createElement('label'); label.textContent = 'Better Pic Display'; label.style.color = '#ffee9d'; // 输入文字颜色 // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); } //第三个标题栏 function createSkipInfoLabel(){ // 创建复选框标签 const label = document.createElement('label'); label.textContent = 'Skip Useless Stuff'; label.style.color = '#ffee9d'; // 输入文字颜色 // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); } //每行显示一张图片 function createCheckboxToDisplayOnePicPerLine(){ // 创建复选框 const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'one-pic-per-line-checkbox'; checkbox.style.marginLeft = '5px'; // 创建复选框标签 const label = document.createElement('label'); label.htmlFor = 'one-pic-per-line-checkbox'; label.textContent = 'One Pic Per Line'; // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(checkbox); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); // 为复选框添加事件监听 checkbox.addEventListener('change', function() { switchPicDisplayState(); if (this.checked) { displayOnePic();//勾选每行一张图 } else { displayMultiPics();//取消勾选恢复原状 } }); // 用于存储用户的选择状态 const onePicKey = 'onePicKey'; // 初始状态设置 if (getOnePicState()) { checkbox.checked = true; displayOnePic(); } else { checkbox.checked = false; } // 动态获取当前是否显示大图 function getOnePicState() { return localStorage.getItem(onePicKey) === 'true'; } // 动态切换是否显示大图 function switchPicDisplayState(){ const newState = !getOnePicState(); // 获取新的状态 // 更新本地存储 localStorage.setItem(onePicKey, newState.toString()); } // 勾选时,把媒体改成display:block function displayOnePic(){ //document.querySelectorAll('.bbImageWrapper, .bbMediaWrapper').forEach(function (el) { document.querySelectorAll('.bbImageWrapper,.inserted-img, .bbImage, .bbMediaWrapper').forEach(function (el) { el.style.display = 'block'; }); } // 取消勾选时,把媒体改成display:inline-block function displayMultiPics(){ //document.querySelectorAll('.bbImageWrapper, .bbMediaWrapper').forEach(function (el) { document.querySelectorAll('.bbImageWrapper,.inserted-img, .bbImage, .bbMediaWrapper').forEach(function (el) { el.style.display = 'inline-block'; }); } } //把附件的图片改为全部显示而非填满 function createCheckboxToChangeAttaImgDisplay(){ /* //显示所有附件图片全部内容 // 获取所有 .file-preview img 元素 const images = document.querySelectorAll('.file-preview img'); // 遍历并修改 object-fit 属性 images.forEach(img => { img.style.objectFit = 'contain'; }); */ // 创建复选框 const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'attachment-pic-checkbox'; checkbox.style.marginLeft = '5px'; // 创建复选框标签 const label = document.createElement('label'); label.htmlFor = 'attachment-pic-checkbox'; label.textContent = 'Enlarge Attachment Pics'; // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(checkbox); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); // 为复选框添加事件监听 checkbox.addEventListener('change', function() { switchBigPreviewState(); if (this.checked) { displayBigPreview();//勾选展示大图 } else { delBigPreview();//取消勾选删除大图 } }); // 用于存储用户的选择状态 const bigPreviewKey = 'bigPreviewKey'; // 初始状态设置 if (getBigPreviewState()) { checkbox.checked = true; displayBigPreview(); } else { checkbox.checked = false; } // 动态获取当前是否显示大图 function getBigPreviewState() { return localStorage.getItem(bigPreviewKey) === 'true'; } // 动态切换是否显示大图 function switchBigPreviewState(){ const newState = !getBigPreviewState(); // 获取新的状态 // 更新本地存储 localStorage.setItem(bigPreviewKey, newState.toString()); } // 勾选时,为每个section中的a元素创建img并插入 function displayBigPreview(){ const insertedImgs=document.querySelectorAll('img.inserted-img'); if(insertedImgs.length > 0){ insertedImgs.forEach(img => { img.style.display = ''; }); }else{ document.querySelectorAll('section.message-attachments').forEach(section => { section.querySelectorAll('a.file-preview.js-lbImage').forEach(link => { const img = document.createElement('img'); img.src = link.href; img.alt = 'Inserted Image'; let maxWidth = localStorage.getItem("maxImgWidthKey"); if (maxWidth !== null && maxWidth !="") { img.style.maxWidth = maxWidth+"px"; // 设置图片宽度,可根据需要调整 } img.style.height = 'auto'; img.style.margin = '5px'; img.classList.add('inserted-img'); // 添加标记类名方便后续删除 section.appendChild(img); }); }); } const attaList = document.querySelectorAll('ul.attachmentList'); attaList.forEach(atta => { atta.style.display = 'none'; }); } // 取消勾选时,删除所有标记的img元素 function delBigPreview(){ document.querySelectorAll('img.inserted-img').forEach(img => { img.style.display = 'none'; }); const attaList = document.querySelectorAll('ul.attachmentList'); attaList.forEach(atta => { atta.style.display = ''; }); } } //隐藏用户信息的部分 function createCheckboxToHideUserInfo(){ // 用于存储用户的选择状态 const hideUserInfoKey = 'hideUserInfo'; // 动态获取当前的隐藏状态 function getIsUserInfoHidden() { return localStorage.getItem(hideUserInfoKey) === 'true'; } // 动态切换当前的隐藏状态 function switchIsUserInfoHidden(){ const newState = !getIsUserInfoHidden(); // 获取新的状态 // 更新本地存储 localStorage.setItem(hideUserInfoKey, newState.toString()); } // 创建复选框 const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'hide-userinfo'; checkbox.style.marginLeft = '5px'; // 创建复选框标签 const label = document.createElement('label'); label.htmlFor = 'hide-userinfo'; label.textContent = 'Hide User Info'; // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(checkbox); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); // 为复选框添加事件监听 checkbox.addEventListener('change', function() { toggleVisibility(); }); // 初始状态设置 if (getIsUserInfoHidden()) { checkbox.checked = true; document.querySelectorAll('.message-userExtras').forEach(element => { element.style.display = 'none'; }); } else { checkbox.checked = false; } // 切换隐藏状态的函数 function toggleVisibility() { const newState = !getIsUserInfoHidden(); // 获取新的状态 // 更新本地存储 localStorage.setItem(hideUserInfoKey, newState.toString()); // 更新元素的显示状态 document.querySelectorAll('.message-userExtras').forEach(element => { element.style.display = newState ? 'none' : ''; }); } } //用于控制向前跳还是向后跳 function createCheckboxToAutoJumpBackward(){ // 检查localStorage中是否存在autoJumpBackward变量,若不存在则初始化为false if (localStorage.getItem('autoJumpBackward') === null) { localStorage.setItem('autoJumpBackward', 'false'); } // 创建一个勾选框 const checkbox2 = document.createElement('input'); checkbox2.type = 'checkbox'; checkbox2.id = 'autoJumpBackward'; checkbox2.style.marginLeft = '5px'; // 根据localStorage的值设置勾选框的初始状态 if (localStorage.getItem('autoJumpBackward') === 'true') { checkbox2.checked = true; } else { checkbox2.checked = false; } // 创建一个标签用于描述勾选框 const label2 = document.createElement('label'); label2.htmlFor = 'autoJumpBackward'; label2.textContent = 'Skip Backward'; // 创建一个div装他们 const containerDiv = document.createElement('div'); containerDiv.id = 'autoJumpContainer'; containerDiv.style.marginLeft = '10px'; // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(checkbox2); containerDiv.appendChild(label2); controlDiv.appendChild(containerDiv); // 添加事件监听器,更新localStorage的值 checkbox2.addEventListener('change', function() { localStorage.setItem('autoJumpBackward', this.checked ? 'true' : 'false'); }); } //用于控制是否跳转纯文字页面 function createCheckboxToAutoJumpTextOnlyPage(){ // 检查localStorage中是否存在autoJumpTextOnlyPage变量,若不存在则初始化为false if (localStorage.getItem('autoJumpTextOnlyPage') === null) { localStorage.setItem('autoJumpTextOnlyPage', 'false'); } // 创建一个勾选框 const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'autoJumpCheckbox'; checkbox.style.marginLeft = '5px'; // 根据localStorage的值设置勾选框的初始状态 if (localStorage.getItem('autoJumpTextOnlyPage') === 'true') { checkbox.checked = true; } else { checkbox.checked = false; } // 创建一个标签用于描述勾选框 const label = document.createElement('label'); label.htmlFor = 'autoJumpCheckbox'; label.textContent = 'Autoskip Textonly Pages'; // 创建一个div装他们 const containerDiv = document.createElement('div'); containerDiv.id = 'autoJumpcontainer2'; containerDiv.style.marginLeft = '10px'; // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); containerDiv.appendChild(checkbox); containerDiv.appendChild(label); controlDiv.appendChild(containerDiv); // 添加事件监听器,更新localStorage的值 checkbox.addEventListener('change', function() { localStorage.setItem('autoJumpTextOnlyPage', this.checked ? 'true' : 'false'); }); } //隐藏没有图片或视频的post function createCheckboxToHideTextOnlyPost(){ // 用于存储用户的选择状态 const hideTextOnlyKey = 'hideTextOnlyPost'; // 检查localStorage中是否存在autoJumpTextOnlyPage变量,若不存在则初始化为false if (localStorage.getItem(hideTextOnlyKey) === null) { localStorage.setItem(hideTextOnlyKey, 'false'); } // 创建一个勾选框 const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'hideTextOnlyPostCheckbox'; checkbox.style.marginLeft = '5px'; // 根据localStorage的值设置勾选框的初始状态 if (getTextIsHidden()) { checkbox.checked = true; HideTextOnlyPosts(); } else { checkbox.checked = false; ShowAllPosts(); } // 创建一个标签用于描述勾选框 const label = document.createElement('label'); label.htmlFor = 'hideTextOnlyPostCheckbox'; label.textContent = 'Hide Textonly Post'; // 创建一个div装他们 const containerDiv = document.createElement('div'); // 将复选框和标签添加到div中 const controlDiv = document.getElementById('custom-control-div'); const subDiv = document.getElementById('autoJumpcontainer2'); containerDiv.appendChild(checkbox); containerDiv.appendChild(label); controlDiv.insertBefore(containerDiv, subDiv); // 添加事件监听器,更新localStorage的值 checkbox.addEventListener('change', function() { toggleTextOnlyPost(); }); // 动态获取当前的隐藏状态 function getTextIsHidden() { return localStorage.getItem(hideTextOnlyKey) === 'true'; } // 切换隐藏状态的函数 function toggleTextOnlyPost() { const newState = !getTextIsHidden(); // 获取新的状态 // 更新本地存储 localStorage.setItem(hideTextOnlyKey, newState.toString()); // 更新元素的显示状态 if(newState){ HideTextOnlyPosts(); }else{ ShowAllPosts(); } } //隐藏只有文字的帖子 function HideTextOnlyPosts() { //显示额外选项 const container = document.getElementById('autoJumpContainer'); container.style.display = ''; const container2 = document.getElementById('autoJumpcontainer2'); container2.style.display = ''; // 获取所有符合条件的article元素 const articles = document.querySelectorAll('article.message.message--post.js-post.js-inlineModContainer'); var textPostCount=0; var nonTextPostCount=0; articles.forEach(article => { // 获取每个article中的message-content元素 const content = article.querySelector('.message-content.js-messageContent'); if (content) { // 检查message-content中是否存在video元素 const hasVideo = content.querySelector('video') !== null; // 检查message-content中是否存在iframe元素 const hasIframe = content.querySelector('iframe') !== null; // 检查message-content中是否存在非emoji的img元素 var hasValidImage = Array.from(content.querySelectorAll('img')).some(img => { // 检查img元素的class属性是否包含"emoji"字样 return !img.className.includes('smilie'); }); //如果想连图片也跳过,用下面这句 //hasValidImage=false; // 如果没有视频且没有非emoji的图片,则隐藏整个article if (!hasVideo && !hasValidImage&& !hasIframe) { textPostCount+=1; article.style.display = 'none'; }else{ nonTextPostCount+=1; } } }); //如果是纯文字页面,自动跳转下一页 if(nonTextPostCount==0){ setTimeout(autoClickNextPage, 1000); } console.log("隐藏了"+textPostCount+"篇"); } //显示所有帖子 function ShowAllPosts() { //隐藏额外选项 const container = document.getElementById('autoJumpContainer'); container.style.display = 'none'; const container2 = document.getElementById('autoJumpcontainer2'); container2.style.display = 'none'; // 获取所有符合条件的article元素 const articles = document.querySelectorAll('article.message.message--post.js-post.js-inlineModContainer'); articles.forEach(article => { article.style.display = ''; }); } // 自动跳转下一页 function autoClickNextPage() { // 获取勾选框 const checkbox = document.getElementById('autoJumpCheckbox'); if (!checkbox) { console.warn('未找到勾选框,脚本无法运行。'); return; } const checkbox2 = document.getElementById('autoJumpBackward'); if (!checkbox2) { console.warn('未找到往前翻勾选框,脚本无法运行。'); return; } // 如果勾选框被选中 if (checkbox.checked) { // 查找页面上第一个class="pageNav-jump pageNav-jump--next"的<a>元素 var nextLink; if(checkbox2.checked){ nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--prev'); }else{ nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--next'); } if (nextLink) { console.log('自动点击下一页按钮'); nextLink.click(); // 模拟点击 } else { console.warn('未找到下一页按钮'); } } } } //替换视频的部分 function replaceUnplayableVideos(){ var easterEggPoster = document.getElementsByClassName("video-easter-egg-poster"); var videoDiv=[]; var imageUrl; var newDiv; var baseVideoUrl; if(easterEggPoster.length==0){ //console.log("官方时间,无需替换"); //把官方时间的视频放大然后静音 enlargeAndMuteVideo(); return; }else if(easterEggPoster.length>5){ autoSwitchInterval=5000; } //替换预览照片为视频播放器 for (let i=easterEggPoster.length-1;i>-1;i--){ let videoUrl imageUrl =easterEggPoster[i].children[0].src; videoUrl=imageUrl.replace("attachments/posters","video").replace("/lsvideo/thumbnails","lsvideo/videos").replace(".jpg",".mp4"); videoDiv[i]=`<video onloadstart="this.volume=${volume}" style="width:800px; max-height: 750px;" controls=\"\" data-xf-init=\"video-init\" data-poster=\"${imageUrl}\" class=\"\" style=\"\" poster=\"${imageUrl}\"><source data-src=\"${videoUrl}\" src=\"${videoUrl}\"><div class=\"bbMediaWrapper-fallback\">Your browser is not able to display this video.</div></video>`; //videoDiv[i]=`<video controls=\"\" data-xf-init=\"video-init\" data-poster=\"${imageUrl}\" class=\"\" style=\"\" poster=\"${imageUrl}\"><source data-src=\"${videoUrl}\" src=\"${videoUrl}\"><div class=\"bbMediaWrapper-fallback\">Your browser is not able to display this video.</div></video>`; newDiv = document.createElement("div"); newDiv.setAttribute("class","newVideoDiv"); newDiv.innerHTML=videoDiv[i]; easterEggPoster[i].parentElement.parentElement.append(newDiv); //console.log("正在插入第几条:"+i+",url:"+videoUrl) easterEggPoster[i].parentElement.parentElement.append(createButton("mov",i)); easterEggPoster[i].parentElement.parentElement.append(createButton("m4v",i)); easterEggPoster[i].parentElement.parentElement.append(createButton("mp4",i)); } //删除easterEggPoster for (let i=easterEggPoster.length-1;i>-1;i--){ easterEggPoster[i].parentElement.parentElement.removeChild(easterEggPoster[i].parentElement); } //删除video-easter-egg-blocker var easterEggBlocker = document.getElementsByClassName("video-easter-egg-blocker"); for (let i=easterEggBlocker.length-1;i>-1;i--){ easterEggBlocker[i].parentElement.removeChild(easterEggBlocker[i]); } //删除video-easter-egg-overlay var easterEggOverlay = document.getElementsByClassName("video-easter-egg-overlay"); for (let i=easterEggOverlay.length-1;i>-1;i--){ easterEggOverlay[i].parentElement.removeChild(easterEggOverlay[i]); } /** //调小音量 var allVideoPlayers = document.getElementsByTagName('video'); for (let i=allVideoPlayers.length-1;i>-1;i--){ allVideoPlayers[i].volume = volume; } **/ //把官方时间的视频放大然后静音 enlargeAndMuteVideo(); // 延时后开始检查视频 setTimeout(checkVideosAndUpdate, autoSwitchInterval); } //创建按钮 function createButton(format,entryId){ var inp; inp = document.createElement("input"); inp.type = "button"; inp.value = format; inp.id = entryId; inp.addEventListener('click', function () { //点击任何手动切换后缀按钮,即停止自动切换后缀 shouldContinue = false; //console.log('停止切换后缀'); //切换后缀 var oldUrl = document.getElementsByClassName("newVideoDiv")[this.id].innerHTML; document.getElementsByClassName("newVideoDiv")[this.id].innerHTML=oldUrl.replaceAll("mp4",format).replaceAll("m4v",format).replaceAll("mov",format); }); return inp; } // 定义一个函数,用于遍历所有 video 元素并检查其 readyState function checkVideosAndUpdate() { // 如果点击了停止按钮,则不再继续执行 if (!shouldContinue) return; // 获取页面上所有的 video 元素 const videoElements = document.querySelectorAll('video'); let allLoaded = true; let failCount=0; // 遍历所有 video 元素 videoElements.forEach(videoElement => { // 获取当前视频的 readyState const state = videoElement.readyState; // 如果视频的 readyState 不是 4(HAVE_ENOUGH_DATA),说明视频还没有加载完成 if (state !== 4) { failCount+=1; allLoaded = false; // 获取视频中的所有 source 标签 const sources = videoElement.querySelectorAll('source'); sources.forEach(source => { // 获取当前 source 的 src 和 data-src 属性 const currentSrc = source.src || source.getAttribute('data-src'); // 根据原视频格式替换为对应的新格式 let newSrc = currentSrc; if (currentSrc.endsWith('.mp4')) { newSrc = currentSrc.replace('.mp4', '.mov'); } else if (currentSrc.endsWith('.mov')) { newSrc = currentSrc.replace('.mov', '.m4v'); } else if (currentSrc.endsWith('.m4v')) { newSrc = currentSrc.replace('.m4v', '.mp4'); } // 更新 source 的 src 和 data-src 属性为新的链接 //console.log(`替换视频链接: ${currentSrc} 为 ${newSrc}`); source.src = newSrc; source.setAttribute('data-src', newSrc); }); // 重新加载视频 videoElement.load(); } }); // 如果还有未加载完成的 video,则延时 2 秒再次执行 if (!allLoaded) { //console.log(failCount+"条视频加载失败,稍后切换后缀重试"); setTimeout(checkVideosAndUpdate, autoSwitchInterval); } else { //console.log("所有视频都已加载完成!"); } } //把官方时间的视频放大然后静音 function enlargeAndMuteVideo(){ // 获取页面上所有的 video 元素 const videos = document.querySelectorAll('video'); var count=0; videos.forEach(video => { const parent = video.parentElement; // 检查父元素的 className 是否不是 'newVideoDiv' if (parent.className !== 'newVideoDiv') { count+=1; // 设置 video 的样式 video.style.width = '800px'; video.style.maxHeight = '750px'; // 设置 video 的音量为 0 video.volume = volume; // 将 video 提升到父元素的同级位置,并放在父元素前面 parent.before(video); parent.remove(); } }); console.log("放大了"+count+"个视频"); //把包着video的div的宽度也设置大点 const elements = document.querySelectorAll('div.bbMediaWrapper.bbMediaWrapper--inline'); elements.forEach(el => { el.style.width = '800px'; }); } //滚动到最后自动换页 function scrollToNextPage(){ let timeoutId = null; // 用于存储定时器的ID window.addEventListener('scroll', function() { // 清除之前的定时器 if (timeoutId) { clearTimeout(timeoutId); } // 获取页面的总高度 var totalHeight = document.documentElement.scrollHeight; // 获取当前窗口的高度 var windowHeight = window.innerHeight; // 获取当前滚动的位置 var scrollPosition = window.pageYOffset + windowHeight; // 判断是否滚动到页面底部 if (scrollPosition >= totalHeight) { // 设置一个定时器,在等待后点击下一页 timeoutId = setTimeout(autoClickNextPage, 1000); } }); // 自动跳转下一页 function autoClickNextPage() { const checkbox2 = document.getElementById('autoJumpBackward'); if (!checkbox2) { console.warn('未找到往前翻勾选框,脚本无法运行。'); return; } // 查找页面上第一个class="pageNav-jump pageNav-jump--next"的<a>元素 var nextLink; if(checkbox2.checked){ nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--prev'); }else{ nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--next'); } if (nextLink) { console.log('自动点击下一页按钮'); nextLink.click(); // 模拟点击 } else { console.warn('未找到下一页按钮'); } } } })();