您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds 'no access' or safety warnings to Google search results
// ==UserScript== // @name Google Search Link Checker // @namespace http://tampermonkey.net/ // @version 1.4 // @description Adds 'no access' or safety warnings to Google search results // @author Bui Quoc Dung // @match https://www.google.com/search* // @grant GM_xmlhttpRequest // @connect * // ==/UserScript== (function () { 'use strict'; async function checkLinkStatus(url) { return new Promise((resolve) => { GM_xmlhttpRequest({ method: "HEAD", url, timeout: 5000, onload: res => { resolve((res.status >= 200 && res.status < 400) || [0, 403, 405, 429].includes(res.status)); }, onerror: (error) => { resolve(!!(error && error.status === 0 && error.finalUrl)); }, ontimeout: () => { resolve(false); } }); }); } async function checkSafetyStatus(url) { try { const hostname = new URL(url).hostname; const apiUrl = `https://check.getsafeonline.org/check/${hostname}?inputUrl=${hostname}`; return new Promise((resolve) => { GM_xmlhttpRequest({ method: "GET", url: apiUrl, timeout: 10000, onload: res => { if (res.status >= 200 && res.status < 300) { const parser = new DOMParser(); const doc = parser.parseFromString(res.responseText, 'text/html'); const warningElement = doc.querySelector('div.font-light.text-2xl.mt-6 span.text-primary-red.font-bold'); if (warningElement) { resolve(warningElement.textContent.trim()); } else { resolve(null); } } else { resolve(null); } }, onerror: () => resolve(null), ontimeout: () => resolve(null) }); }); } catch (e) { console.error("Could not parse URL for safety check:", url, e); return Promise.resolve(null); } } function processLink(link) { if (!link || link.dataset.statusChecked) return; link.dataset.statusChecked = 'true'; const url = link.href; if (!url || url.startsWith('javascript:') || url.startsWith('#')) return; const container = link.closest('.MjjYud'); if (!container || container.querySelector('.access-safety-info')) return; const description = container.querySelector('.VwiC3b'); if (!description) return; const infoDiv = document.createElement('div'); infoDiv.className = 'access-safety-info'; infoDiv.style.marginTop = '4px'; infoDiv.style.fontSize = '1em'; infoDiv.style.display = 'flex'; infoDiv.style.flexWrap = 'wrap'; infoDiv.style.gap = '8px'; description.parentElement.appendChild(infoDiv); checkLinkStatus(url).then(accessible => { if (!accessible) { const tag = document.createElement('span'); tag.textContent = '[no access]'; tag.style.color = 'orange'; infoDiv.appendChild(tag); } }); checkSafetyStatus(url).then(safetyText => { if (safetyText) { const tag = document.createElement('span'); tag.textContent = `[${safetyText}]`; tag.style.color = 'red'; infoDiv.appendChild(tag); } }); } let scanTimeoutId = null; function scanLinksDebounced() { clearTimeout(scanTimeoutId); scanTimeoutId = setTimeout(() => { document.querySelectorAll('div.MjjYud a:has(h3)').forEach(processLink); }, 300); } const observer = new MutationObserver(mutations => { for (const m of mutations) { for (const node of m.addedNodes) { if (node.nodeType === 1 && (node.querySelector?.('div.MjjYud a:has(h3)') || node.matches?.('.MjjYud'))) { scanLinksDebounced(); return; } } } }); const container = document.getElementById('center_col') || document.getElementById('rcnt') || document.body; observer.observe(container, { childList: true, subtree: true }); let lastURL = location.href; setInterval(() => { if (location.href !== lastURL) { lastURL = location.href; setTimeout(scanLinksDebounced, 1000); } }, 1000); if (document.readyState === 'loading') { window.addEventListener('DOMContentLoaded', () => setTimeout(scanLinksDebounced, 1000)); } else { setTimeout(scanLinksDebounced, 1000); } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址