您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
用自定义UA的XHR请求图片+删除广告
// ==UserScript== // @name 简书火狐优化 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 用自定义UA的XHR请求图片+删除广告 // @match https://www.jianshu.com/* // @grant GM_xmlhttpRequest // @grant unsafeWindow // @connect * // @run-at document-start // @license MIT // ==/UserScript== // 配置参数 const CUSTOM_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 27194'; // 自定义User-Agent const Attributes = ['src', 'data-src', 'data-original-src']; function getImageSource(img) { for (let attr of Attributes) { const value = img.getAttribute(attr); if (value) { return value; } } return null; // 如果都没有找到有效的值 } function errorhandle(event) { event.stopImmediatePropagation(); const imgElement = event.target; replaceImageWithXHR(imgElement); } // 用XHR请求替换图片 function replaceImageWithXHR(imgElement) { const url = getImageSource(imgElement) imgElement.alt = "加载中..." console.log('检测到错误,正在加载图片:', url); GM_xmlhttpRequest({ method: 'GET', url: url, headers: { 'User-Agent': CUSTOM_UA }, responseType: 'blob', onload: function (response) { if (response.status === 200) { const blob = response.response; const imageUrl = URL.createObjectURL(blob); imgElement.src = imageUrl; console.log('图片替换成功:', url); } else { console.error('XHR请求失败:', response.status, url); } }, onerror: function (error) { console.error('XHR请求错误:', error, url); } }); } (function () { 'use strict'; // 使用 MutationObserver 监听新添加的图片 const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { if (mutation.type === 'childList') { mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { // 检查是否是元素节点 if (node.tagName === 'IMG') { replaceImageWithXHR(node); node.addEventListener('error', errorhandle, true); } // 如果是包含图片的容器,继续检查子元素 const imgs = node.querySelectorAll('img'); imgs.forEach(img => { replaceImageWithXHR(img); img.addEventListener('error', errorhandle, true); }); } }); } }); }); unsafeWindow.document.addEventListener('DOMContentLoaded', (event) => { const images = unsafeWindow.document.querySelectorAll('img'); images.forEach(img => { replaceImageWithXHR(img); img.addEventListener('error', errorhandle, true); }); if (unsafeWindow.location.href.includes("/p/")) { unsafeWindow.document.addEventListener('scroll', (event) => { event.stopImmediatePropagation(); //屏蔽广告 }, true); } const elementsWithClassA = document.querySelectorAll('.image-loading'); elementsWithClassA.forEach(element => { element.classList.remove('image-loading'); });//屏蔽他自己加载的脚本 // 保存原始的 add 方法 const originalAdd = unsafeWindow.DOMTokenList.prototype.add; // 重写 add 方法 unsafeWindow.DOMTokenList.prototype.add = function (...classes) { // 检查是否包含 'a' 或 'b' const shouldBlock = classes.some(className => className === 'image-loading' || className === 'image-view-error' ); // 如果检测到 'a' 或 'b',则不执行 if (shouldBlock) { console.log('Blocked classList.add for classes:', classes); return; // 阻止执行 } // 否则正常执行原始方法 return originalAdd.apply(this, classes); }; // 开始监听 DOM 变化 observer.observe(unsafeWindow.document.body, { childList: true, subtree: true, }); }); })();