您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Link Checker. Hit escape to check whether one-click hoster links are online or offline.
当前为
// ==UserScript== // @name Highlight OCH links // @namespace cuzi // @oujs:author cuzi // @description Link Checker. Hit escape to check whether one-click hoster links are online or offline. // @icon https://gf.qytechs.cn/system/screenshots/screenshots/000/003/868/original/och.png // @compatible firefox Greasemonkey // @compatible chrome Tampermonkey. Allow all domains on first run. // @homepageURL https://openuserjs.org/scripts/cuzi/Highlight_OCH_links // @require https://openuserjs.org/src/libs/cuzi/RequestQueue.js // @require https://openuserjs.org/src/libs/cuzi/OCH_List.js // @grant GM_xmlhttpRequest // @connect * // @version 6 // @include * // @exclude *.yahoo.* // @exclude *.google.* // @exclude *.youtube.* // @exclude *.bing.com* // @exclude *duckduckgo.com* // ==/UserScript== var rq; (function() { "use strict"; // Maximal number of links that are checked (per website) var MAXREQUESTS = 1000; // Maximal number of links that are checked in parallel (per website) var MAXPARALLELCONNECTIONS = 16; // Maximal number of DOM nodes that are examined. Decrease this number on slow machines. var MAXTEXTNODES = 10000; /* // Export var mypatterns = []; var mynames = []; var myurls = []; for(var key in OCH) { var o = OCH[key]; if((""+o.check).length > 30) { // If check function implemented mypatterns.push(o.pattern.toString()); mynames.push("'"+key+"'"); myurls.push(" - ["+o.title+"]("+o.homepage+")"); } } alert(mypatterns.join(",\n")); alert(mynames.join(",\n")); alert(myurls.join("\n")); */ var links = []; // [ { hoster: "", url: "", element: DOMNode} , ... ] rq = new RequestQueue(MAXPARALLELCONNECTIONS, MAXREQUESTS); function linkOffline(link) { link.element.style.backgroundColor = "rgba(255, 0, 20, 0.5)"; link.element.dataset.linkValidatedAs = "offline"; } function linkOnline(link) { link.element.style.backgroundColor = "rgba(70, 255 ,0, 0.5)"; link.element.dataset.linkValidatedAs = "online"; } function linkWaiting(link) { link.element.style.backgroundColor = "rgba(255, 150, 80, 0.4)"; } function handleResult(link,result,errorstring) { if(result === 1) { linkOnline(link); } else if(result === 0) { linkOffline(link); } else if(result == -1) { link.element.style.backgroundColor = "blue"; link.element.title = errorstring; console.log(errorstring); } else { console.log("handleResult(link,result,errorstring) wrong resultcode: "+result); } } function matchHoster(str) { // Return name of first hoster that matches, otherwise return false for(var name in OCH) { for(let i = 0; i < OCH[name].pattern.length; i++) { if(OCH[name].pattern[i].test(str)) { return name; } } } return false; } function findLinks() { links = []; // Normalize hoster object: Replace single patterns with arrays [RegExp] for(var name in OCH) { if(!Array.isArray(OCH[name].pattern)) { OCH[name].pattern = [ OCH[name].pattern ]; } } // Find all text nodes that contain "http://" var nodes = []; var walk = document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,{ acceptNode: function(node) { if(node.parentNode.href || node.parentNode.parentNode.href || node.parentNode.parentNode.parentNode.href) return NodeFilter.FILTER_REJECT; if(node.parentNode.tagName == "TEXTAREA" || node.parentNode.parentNode.tagName == "TEXTAREA") return NodeFilter.FILTER_REJECT; if(node.data.match(/(\s|^)https?:\/\/\w+/)) return NodeFilter.FILTER_ACCEPT; } },false); var node = walk.nextNode(); while(node) { nodes.push(node); node = walk.nextNode(); } // For each found text nodes check whether the URL is a valid OCH URL for(let i = 0; i < nodes.length && i < MAXTEXTNODES; i++) { if("" === nodes[i].data) { continue; } var httpPosition = nodes[i].data.indexOf("http"); if(httpPosition == -1) { continue; } var urlnode; if(httpPosition > 0) { urlnode = nodes[i].splitText(httpPosition); // Split leading text } else { urlnode = nodes[i]; } var stop = urlnode.data.match(/$|\s/)[0]; // Find end of URL if("" !== stop) { // If empty string, we found $ end of string var nextnode = urlnode.splitText(urlnode.data.indexOf(stop)); // Split trailing text if("" !== nextnode.data && nextnode.data.indexOf("http") != -1) {// The trailing text might contain another URL nodes.push(nextnode); } } // Check whether the URL is a OCH. If so, create an <a> element var url = urlnode.data; var mh = matchHoster(url); if(mh !== false) { var a = document.createElement("a"); a.href = url; a.appendChild(urlnode.parentNode.replaceChild(a, urlnode)); links.push( { 'hoster' : mh, 'url' : url, 'element' : a }); } } // Find actual <a> links var al = document.getElementsByTagName('a'); for(let i = 0; i < al.length; i++) { if(al[i].dataset.linkValidatedAs) { continue; // Link was already checked } var mH = matchHoster(al[i].href); if(mH !== false) { links.push( { 'hoster' : mH, 'url' : al[i].href, 'element' : al[i] }); } } return links.length; } function checkLinks() { // Check all links by calling the hoster's check function for(let i = 0; i < links.length; i++) { if(links[i] && OCH[links[i].hoster].check && typeof(OCH[links[i].hoster].check) === 'function') { linkWaiting(links[i]); OCH[links[i].hoster].check(links[i],handleResult); } } } var doit = true; document.addEventListener('keydown',function(ev) { if (ev.keyCode == 27) { if(doit) { // Highlight links and check them var n = findLinks(); if(n > 0 ) checkLinks(); } else { // Abort all requests rq.abort(); } doit = !doit; } },false); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址