您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Emulate the Greasemonkey GM_* functions for other browsers.
// ==UserScript== // @run-at document-start // @name 1. Greasemonkey Emulation // @description Emulate the Greasemonkey GM_* functions for other browsers. // @version 2.0 // @author Lil Devil // @attribution based on version 1.4.5 by ale5000 http://userscripts.org/scripts/show/88932 // @namespace http://www.lildevil.org/greasemonkey/ // @include http://* // @include https://* // @filename aab-greasemonkey-emulation.user.js // @filename-IE aab-greasemonkey-emulation.ieuser.js // @filename-opera aab-greasemonkey-emulation.js // @uniquescriptname greasemonkey_emulation // @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html // ==/UserScript== (function() { // Settings, can be changed var enable_GM_registerMenuCommand = true, override_GM_registerMenuCommand = false, show_global_config_menu_item = false, enable_opera_scriptStorage = true, use_alert_as_fallback = true; // Internal variables, do not change var version = "2.0"; var unique_script_name = "greasemonkey_emulation"; var opera_obj = window.opera, hostname = location.hostname; var rnd = ( Math.floor(Math.random() * 100) + 1 ); var chrome = (navigator.userAgent.indexOf("Chrome") != -1), midori = (navigator.userAgent.indexOf("Midori") != -1); var unsfw = null, storage = null, storage_used = false, cross_domain_values = false, opera_script_storage_active = false; if(opera_obj && enable_opera_scriptStorage) // http://www.opera.com/docs/userjs/specs/#scriptstorage { try { storage = opera_obj.scriptStorage; opera_script_storage_active = true; } catch(e) {} } if(!storage) { opera_script_storage_active = false; if(window.localStorage) { storage = localStorage; if(opera_obj) opera_obj.postError("Go on \"opera:config#PersistentStorage|UserJSStorageQuota\" and set a quota different from 0 like for example 5120 to enable window.opera.scriptStorage"); } else if(window.globalStorage) storage = globalStorage[hostname]; } if((typeof unsafeWindow) != "undefined") unsfw = unsafeWindow; else { unsfw = window; unsafeWindow = unsfw; } var base_obj, userscripts; var default_toString = function(){ return undefined; }; if(opera_obj) base_obj = opera_obj; else base_obj = window; if((typeof base_obj.userscripts) == "undefined") { userscripts = new Object(); userscripts.toString = default_toString; base_obj.userscripts = userscripts; if(!opera_obj && !unsfw.userscripts) unsfw.userscripts = userscripts; } else userscripts = base_obj.userscripts; if(userscripts.GME) { userscripts.GME.GM_log("Double execution. Browser bug!!!"); return; } // https://bugs.launchpad.net/midori/+bug/707166 userscripts.GME = new Object(); var gm_extensions = userscripts.GME; if((typeof GM_log) != "undefined") // Firefox gm_extensions.GM_log = GM_log; else { var opera_postError = null, pro_log_present = false, console_enabled = false; if(opera_obj) opera_postError = opera_obj.postError; else if((typeof PRO_log) != "undefined") pro_log_present = true; else if((typeof console) == "object") console_enabled = true; gm_extensions.GM_log = function(message, displayed_script_name) { if(displayed_script_name != undefined) message = displayed_script_name + ":\n" + message; if(opera_postError) // Opera opera_postError(message); else if(pro_log_present) // Internet Explorer PRO_log(message); else if(console_enabled) // Google Chrome - Midori try{ console.log(message); } catch(e){ if(use_alert_as_fallback) alert(message); } else if(use_alert_as_fallback) // Fallback to an alert if other methods fail alert(message); }; } var native_getsetvalues_functions = false, is_GM_deleteValue_bultin = false, is_GM_listValues_bultin = false; gm_extensions.GM_deleteValue = function(name, unique_script_name) { if(!name) return false; if(gm_extensions.GM_getValue(name, undefined, unique_script_name) === undefined) return; gm_extensions.GM_setValue(name, "", unique_script_name); try{ gm_extensions.GM_setValue(name, undefined, unique_script_name); } catch(e){} }; gm_extensions.GM_listValues = function() { return []; }; // Dummy var get_full_name = function(name, unique_script_name) // unique_script_name is optional but recommended { if(unique_script_name != undefined) return "UserJS_" + unique_script_name + "_" + name; else return "UserJS__" + name; }; if((typeof GM_setValue) != "undefined" && GM_setValue.toString().indexOf("not supported") == -1) // Firefox { cross_domain_values = true; native_getsetvalues_functions = true; var _GM_getValue = GM_getValue, _GM_setValue = GM_setValue, _GM_deleteValue = null, _GM_listValues = null; gm_extensions.GM_getValue = function(name, default_value, unique_script_name) { if(!name) return; return _GM_getValue(get_full_name(name, unique_script_name), default_value); }; gm_extensions.GM_setValue = function(name, value, unique_script_name) { if(!name) return false; _GM_setValue(get_full_name(name, unique_script_name), value); }; if((typeof GM_deleteValue) != "undefined") { is_GM_deleteValue_bultin = true; _GM_deleteValue = GM_deleteValue; gm_extensions.GM_deleteValue = function(name, unique_script_name) { if(!name) return false; _GM_deleteValue(get_full_name(name, unique_script_name)); }; } if((typeof GM_listValues) != "undefined") { is_GM_listValues_bultin = true; _GM_listValues = GM_listValues; gm_extensions.GM_listValues = _GM_listValues; // ToDO } } else { var get_recoverable_string = function(value) { var type = (typeof value); if(type == "boolean") return "" + value; if(type == "number") { if(isNaN(value)) return "Number.NaN"; if(value == Number.POSITIVE_INFINITY) return "Number.POSITIVE_INFINITY"; if(value == Number.NEGATIVE_INFINITY) return "Number.NEGATIVE_INFINITY"; return "" + value; } if(type == "string") { var tmp = escape(value); if(value == tmp) return "'" + value + "'"; return "unescape('" + tmp + "')"; } if(type == "null" || (type == "object" && value == null)) return "null"; if(type == "date") return "new Date(" + value.getTime() + ")"; alert("Unsupported value in GM_set: " + value); return "{error: 'Unsupported value.'}"; }; if((typeof PRO_setValue) != "undefined") // Internet Explorer { cross_domain_values = true; gm_extensions.GM_getValue = function(name, default_value, unique_script_name) { if(!name) return; var value = PRO_getValue(get_full_name(name, unique_script_name), default_value); if(value == default_value) return default_value; try { eval("value = " + unescape(value)); } catch(e) { return default_value; } // If the value is equal to default, delete it so it won't waste space if(value == default_value) gm_extensions.GM_deleteValue(name, unique_script_name); return value; }; gm_extensions.GM_setValue = function(name, value, unique_script_name) { if(!name) return false; PRO_setValue(get_full_name(name, unique_script_name), escape(get_recoverable_string(value))); }; gm_extensions.GM_deleteValue = function(name, unique_script_name) { if(!name) return false; if((typeof PRO_deleteValue) != "undefined") PRO_deleteValue(get_full_name(name, unique_script_name)); else PRO_setValue(get_full_name(name, unique_script_name), ""); }; if((typeof PRO_listValues) != "undefined") gm_extensions.GM_listValues = PRO_listValues; // ToDO } else if(storage) { storage_used = true; if(opera_script_storage_active) cross_domain_values = true; gm_extensions.GM_getValue = function(name, default_value, unique_script_name) { if(!name) return; var value = storage.getItem(get_full_name(name, unique_script_name)); if(value == null) return default_value; try { eval("value = " + unescape(value)); } catch(e) { return default_value; } // If the value is equal to default, delete it so it won't waste space if(value == default_value) gm_extensions.GM_deleteValue(name, unique_script_name); return value; }; gm_extensions.GM_setValue = function(name, value, unique_script_name) { if(!name) return false; storage.setItem(get_full_name(name, unique_script_name), escape(get_recoverable_string(value))); }; gm_extensions.GM_deleteValue = function(name, unique_script_name) { if(!name) return false; storage.removeItem(get_full_name(name, unique_script_name)); }; gm_extensions.GM_listValues = function(unique_script_name) { var list = [], count = 0, storage_length = storage.length, search = null, skip_length = 0; if(storage_length == undefined) return []; if(unique_script_name != undefined) search = "UserJS_" + unique_script_name + "_"; else { search = "UserJS__"; gm_extensions.GM_log("You should avoid using GM_listValues without unique_script_name."); } skip_length = search.length; for(var i = 0; i < storage_length; i++) { name = storage.key(i); if(name.indexOf(search) == 0) { list[count] = name.substring(skip_length); count++; } } return list; }; } /*else if(window.google && google.gears){ google.gears.factory.create('beta.database'); }*/ else { gm_extensions.GM_getValue = function(name, default_value, unique_script_name) { if(!name) return; var full_name = escape(get_full_name(name, unique_script_name)); var cookies = document.cookie.split("; "); var cookies_length = cookies.length, one_cookie; for(var i = 0; i < cookies_length; i++) { one_cookie = cookies[i].split("="); if(one_cookie[0] == full_name) { var value; try { eval("value = "+unescape(one_cookie[1])); } catch(e) { return default_value; } // If the value is equal to default, delete it so it won't waste space if(value == default_value) gm_extensions.GM_deleteValue(name, unique_script_name); return value; } } return default_value; }; var life_time = 157680000000; // 31536000 * 5 * 1000 gm_extensions.GM_setValue = function(name, value, unique_script_name, action) { if(!name) return false; if(action == "delete") action = -10; else action = life_time; document.cookie = escape(get_full_name(name, unique_script_name))+"="+escape(get_recoverable_string(value))+";expires="+( new Date( (new Date()).getTime() + action ) ).toGMTString()+";path=/"; }; gm_extensions.GM_deleteValue = function(name, unique_script_name) { return gm_extensions.GM_setValue(name, "", unique_script_name, "delete"); }; gm_extensions.GM_listValues = function() { return []; }; // ToDO } } gm_extensions.GM_areStoredValuesCrossDomain = function() { return cross_domain_values; }; if((typeof GM_addStyle) != "undefined") // Firefox gm_extensions.GM_addStyle = GM_addStyle; else if((typeof PRO_addStyle) != "undefined") // Internet Explorer gm_extensions.GM_addStyle = PRO_addStyle; else { gm_extensions.GM_addStyle = function(css_string) { var head = document.getElementsByTagName("head"), stylesheet = document.createElement("style"); stylesheet.type = "text/css"; stylesheet.appendChild(document.createTextNode(css_string)); if(head) head[0].appendChild(stylesheet); else document.documentElement.insertBefore(stylesheet, document.documentElement.firstChild); }; } gm_extensions.GM_renameMenuCommand = function(){}; // Dummy if((typeof GM_registerMenuCommand) != "undefined" && GM_registerMenuCommand.toString().indexOf("not supported") == -1 && !override_GM_registerMenuCommand) // Firefox gm_extensions.GM_registerMenuCommand = GM_registerMenuCommand; else if((typeof PRO_registerMenuCommand) != "undefined" && !override_GM_registerMenuCommand) // Internet Explorer gm_extensions.GM_registerMenuCommand = PRO_registerMenuCommand; else if(!enable_GM_registerMenuCommand) gm_extensions.GM_registerMenuCommand = function(){}; // Dummy else { gm_extensions.GM_registerMenuCommand = function(caption, command_func, access_key) { if (arguments.length === 5) { // GM 0.9.1 & earlier - http://wiki.greasespot.net/GM_registerMenuCommand access_key = arguments[4]; } gm_menu.add_item(caption, command_func, access_key); }; gm_extensions.GM_renameMenuCommand = function(old_caption, new_caption, new_access_key) { var gm_menu_list = document.getElementById("gme_menu"), matching_menu_item, re = new RegExp("^" + old_caption + "(\\s\\(.\\))?$", "i"); // find menu item with old_caption for (var i=0, len=gm_menu_list.childNodes.length; i<len; i++) { var this_caption = gm_menu_list.childNodes[i].textContent || gm_menu_list.childNodes[i].innerText; if (re.test(this_caption)) { matching_menu_item = gm_menu_list.childNodes[i]; break; } } if (matching_menu_item) { gm_menu.add_access_key(matching_menu_item, new_caption, new_access_key, i); return true; } else { gm_extensions.GM_log('caption: "' + old_caption +'" not found in GM_renameMenuCommand.'); return false; } }; var gm_menu = {}; gm_menu.add_access_key = function(obj, menu_text, access_char, skip) { var menu_updated = false; if ((typeof access_char == "string") && (access_char.length > 0)) { access_char = access_char.substr(0,1).toUpperCase(); var gm_menu_list = obj.parentNode, keycode = access_char.charCodeAt(0), keycode_in_use = false, menu_label = menu_text; // see if another menu item uses the same keycode for (var i=0, len=gm_menu_list.childNodes.length; i<len; i++) { if ((i !== skip) && (gm_menu_list.childNodes[i].getAttribute("accesskeycode") == keycode)) { keycode_in_use = true; break; } } if (!keycode_in_use) { var reg_exp = new RegExp("(" + access_char + ")", "i"); menu_label = menu_text.replace(reg_exp, "<u>$1</u>"); if (menu_label == menu_text) { menu_label += " (<u>" + access_char + "</u>)"; } obj.innerHTML = menu_label; obj.setAttribute("accesskeycode", keycode); menu_updated = true; } } if (!menu_updated) { obj.innerHTML = menu_text; obj.removeAttribute("accesskeycode"); } }; var node_contains = function(outer, innie) { if (outer.contains) { return outer.contains(innie); // a node is considered to contain itself } else if (outer.compareDocumentPosition) { var bitmask = outer.compareDocumentPosition(innie); return ((bitmask === 0) || // innie "is equal to" outer !!(bitmask & 16)); // innie "is contained by" outer } return false; // unknown }; gm_menu.create = function() { gm_menu.icon = document.getElementById("gme_menu_icon"); if (gm_menu.icon) return; // another extension has already created the menu var menu_icon = 'data:image/png;base64,' + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/o' + 'L2nkwAAARNJREFUOMut07ErxGEcx/HXzyFlkIUYDCKTRVZksjIRmWQwMFqfe64MJoPBKINNMd5gNOgMsi' + 'gr+QOU6EJneU7X5Y6Obz09Pd+e7/v7/Xzqm+Xz+Yo/RDuEELJWimOMlba/dP+aoI7aiW0sYQQ5POIchRD' + 'CfVMADrGMV0ym3B7WMIWxhoAYY2/qDF0JUkyTwNtPEgZR9SXDDmYxgA5c1wPqTbzDGcrpvYgHlHCBmxjj' + 'RMMJQgjvWKiRlMNq8iXDKDaw3siDeRQwjGecYBO76EvfPppJOMI4utGPuRBCJUmoRqkZoJjuFxxgOsbYg' + '6GUv8RxM8AKtnCVZJziFk8pPxNCKNcWfGfifjq/iv/ZhRhjyyv9CYEvRESFg9k9AAAAAElFTkSuQmCC'; // http://webdesign.about.com/od/colorcharts/l/blsystemcolors.htm gm_extensions.GM_addStyle( "#gme_menu_icon { z-index:900000;" + " height:16px; width:16px; position:fixed; right:0; bottom:0;" + " background-color:transparent; }" + "#gme_menu_icon { cursor:pointer; }" + "#gme_menu_icon.open, #gme_menu_icon.closed {" + " background:url('" + menu_icon + "') no-repeat center center; }" + "#gme_menu_icon.open { background-color:Highlight; }" + "#gme_menu_icon.closed:hover { background-color:Highlight; }" + "#gme_menu_icon.open ul { display:block; }" + "#gme_menu { display:none; width:auto; padding:2px; margin:0; position:fixed;" + " background-color:Menu; right:0; bottom:15px; border:1px solid ThreeDShadow;" + " -moz-box-shadow:0px 2px 4px rgba(0,0,0,0.5);" + " -webkit-box-shadow:0px 2px 4px rgba(0,0,0,0.5);" + " box-shadow:0px 2px 4px rgba(0,0,0,0.5); }" + ".gme_menu_item { background-color:Menu; color:MenuText;" + " list-style-type:none; padding:0 10px; white-space:pre;" + " font:11px sans-serif; text-align:left; }" + "#gme_menu li.hover { background-color:Highlight; color:HighlightText; }"); gm_menu.icon = document.createElement("div"); gm_menu.icon.id = "gme_menu_icon"; var gm_menu_list = document.createElement("ul"); gm_menu_list.id = "gme_menu"; gm_menu.icon.appendChild(gm_menu_list); var doc_body = document.body || document.documentElement.lastChild || document.documentElement; // HTML.body || HTML.body || HTML doc_body.appendChild(gm_menu.icon); var is_open_query = function() { return (gm_menu.icon.className == "open"); }; var simulate_click = function(obj) { // the menu item may have been added by another invocation of this script // so when an access_key or enter is pressed, the only way to call the // command_func is to trigger the click event on the menu item. if (obj.dispatchEvent) { var evt = document.createEvent("MouseEvents"); evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); obj.dispatchEvent(evt); } else if (obj.fireEvent) { obj.fireEvent("onclick"); } }; var window_mousedown_event = function(e) { if (!e) e = window.event; var targ = (e.target || e.srcElement); if (targ.nodeType == 3) targ = targ.parentNode; // Safari if (!node_contains(gm_menu.icon, targ)) { // not over menu if (is_open_query()) gm_menu.close(); } else //if (targ.className.indexOf("gme_menu_item") >= 0) { if (targ.nodeName == "LI") { // over a menu item - prevent text selection within menu if (e.preventDefault) e.preventDefault(); e.returnValue = false; } else { // over some other part of the menu if (e.stopPropagation) e.stopPropagation(); e.cancelBubble = true; if (is_open_query()) gm_menu.close(); else gm_menu.open(); } }; var window_blur_event = function() { if (is_open_query()) gm_menu.close(); }; /* http://asquare.net/javascript/tests/KeyCode.html http://www.quirksmode.org/js/keys.html http://unixpapa.com/js/key.html */ var window_key_event = function(e) { // Note: In the keydown and keyup events you will get the keycode of the letters // always in uppercase // but in the keypress events you will get them in the same case the user typed them. if (!e) e = window.event; var keyCode = e.keyCode || e.which; if (keyCode == 0) return; // Unknown key if (is_open_query()) { // while the menu is open, prevent all keypresses from doing anything else if (e.preventDefault) e.preventDefault(); e.returnValue = false; var gm_menu_list = document.getElementById("gme_menu"), numItems = gm_menu_list.childNodes.length, menu_item; if (keyCode == 38) { // up arrow // find which item is currently highlighted menu_item = gm_menu.highlighted_item_query(); // un-highlight the item gm_menu.highlight_item(menu_item, false); // get the next item up if (menu_item && menu_item.previousSibling) { menu_item = menu_item.previousSibling; } else { menu_item = gm_menu_list.lastChild; } // highlight the new item gm_menu.highlight_item(menu_item, true); } else if (keyCode == 40) { // down arrow // find which item is currently highlighted menu_item = gm_menu.highlighted_item_query(); // un-highlight the item gm_menu.highlight_item(menu_item, false); // get the next item down if (menu_item && menu_item.nextSibling) { menu_item = menu_item.nextSibling; } else { menu_item = gm_menu_list.firstChild; } // highlight the new item gm_menu.highlight_item(menu_item, true); } else if (keyCode == 27) { // esc gm_menu.close(); } else if (keyCode == 13) { // enter menu_item = gm_menu.highlighted_item_query(); gm_menu.close(); simulate_click(menu_item); } else { // see if one of the menu items uses this keycode var menu_item_to_handle; for (var i=0; i<numItems; i++) { if (gm_menu_list.childNodes[i].hasAttribute("accesskeycode") && gm_menu_list.childNodes[i].getAttribute("accesskeycode") == keyCode) { menu_item_to_handle = gm_menu_list.childNodes[i]; break; } } if (menu_item_to_handle) { gm_menu.highlight_item(gm_menu.highlighted_item_query(), false); gm_menu.highlight_item(menu_item_to_handle, true); window.setTimeout(function() { gm_menu.close(); simulate_click(menu_item_to_handle); }, 100); } } } else { // menu is not open if ((keyCode == 220) && e.ctrlKey) { // ctrl+\ gm_menu.open(); if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } } }; var prevent_selection = function(e) { if (!e) e = window.event; if (e.preventDefault) e.preventDefault(); e.returnValue = false; }; if (document.addEventListener) { document.addEventListener("mousedown", window_mousedown_event, false); document.addEventListener("keydown", window_key_event, false); window.addEventListener ("blur", window_blur_event, false); } else { gm_menu.icon.attachEvent("onselectstart", gm_menu.prevent_selection); document.attachEvent ("onmousedown", window_mousedown_event); document.attachEvent ("onkeydown", window_key_event); window.attachEvent ("onblur", window_blur_event); } }; /* http://www.quirksmode.org/dom/events/index.html http://www.quirksmode.org/js/events_properties.html */ gm_menu.add_item = function(caption, command_func, access_key) { gm_menu.create(); var gm_menu_list = document.getElementById("gme_menu"), gm_menu_item = document.createElement("li"); gm_menu_item.innerHTML = caption; gm_menu_item.className = "gme_menu_item"; gm_menu_list.appendChild(gm_menu_item); gm_menu.add_access_key(gm_menu_item, caption, access_key); var click_event = function(e) { if (!e) e = window.event; if (e.stopPropagation) e.stopPropagation(); e.cancelBubble = true; gm_menu.close(); if ("function" == typeof command_func) command_func(); }; var mouseover_event = function(e) { // find which item is currently highlighted (in case highlighted via keyboard) var item = gm_menu.highlighted_item_query(); // un-highlight that item gm_menu.highlight_item(item, false); // highlight this item if (!e) e = window.event; var targ = (e.target || e.srcElement); if (targ.nodeType == 3) targ = targ.parentNode; // Safari if (targ.nodeName != "LI") targ = targ.parentNode; // underlined access_key gm_menu.highlight_item(targ, true); }; var mouseout_event = function(e) { if (!e) e = window.event; var targ = (e.target || e.srcElement); if (targ.nodeType == 3) targ = targ.parentNode; // Safari if (targ.nodeName != "LI") targ = targ.parentNode; // underlined access_key gm_menu.highlight_item(targ, false); }; if (document.addEventListener) { gm_menu_item.addEventListener("mouseover", mouseover_event, false); gm_menu_item.addEventListener("mouseout", mouseout_event, false); gm_menu_item.addEventListener("click", click_event, false); } else { gm_menu_item.attachEvent("onmouseenter", mouseover_event); gm_menu_item.attachEvent("onmouseleave", mouseout_event); gm_menu_item.attachEvent("onclick", click_event); } }; gm_menu.close = function(e) { // find which item is currently highlighted var obj = gm_menu.highlighted_item_query(); // close the menu var gm_menu_icon = document.getElementById("gme_menu_icon"); if (gm_menu_icon) { gm_menu_icon.className = "closed"; } // un-highlight the item gm_menu.highlight_item(obj, false); return obj; }; gm_menu.open = function(e) { var gm_menu_icon = document.getElementById("gme_menu_icon"); if (gm_menu_icon) { gm_menu_icon.className = "open"; } }; gm_menu.highlight_item = function(obj, state) { if (obj) { obj.className = (state ? "gme_menu_item hover" : "gme_menu_item"); } }; gm_menu.highlighted_item_query = function() { var gm_menu_list = document.getElementById("gme_menu"); for (var i=0, len=gm_menu_list.childNodes.length; i<len; i++) { if (gm_menu_list.childNodes[i].className.indexOf(" hover") > 0) { return gm_menu_list.childNodes[i]; } } }; } var GlobalConfiguration = function() { var global_variables = {"Script managment":[], "Unknown script":[], "Web page":[]}; var output = ""; if(storage_used) { var storage_length = storage.length, name, value, pos; if(storage_length != undefined) for(var i = 0; i < storage_length; i++) { name = storage.key(i); value = storage.getItem(name); if(name.indexOf("UserJS_") != 0) global_variables["Web page"][(global_variables["Web page"].length)] = [name, value]; else { name = name.substring(7); if(name.indexOf("Script_managment-") == 0) global_variables["Script managment"][(global_variables["Script managment"].length)] = [name.substring(17), value]; else { pos = name.indexOf("_"); if(pos == 0) global_variables["Unknown script"][(global_variables["Unknown script"].length)] = [name.substring(1), value]; else { var temp = name.substring(0, pos); if(!global_variables[temp]) global_variables[temp] = []; global_variables[temp][(global_variables[temp].length)] = [name.substring(pos+1), value]; } } } } output += "Cross-domain values => " + cross_domain_values + "<br>"; output += "opera.scriptStorage active => " + opera_script_storage_active + "<br>"; output += "window.localStorage => " + (!!window.localStorage) + "<br><br>"; if(storage_length == undefined) output += "Warning: Missing length property in the storage array.<br><br>"; var value, i, global_variables_script_length; for(var script_name in global_variables) { if(script_name == "Script managment") continue; for(i = 0, global_variables_script_length = global_variables[script_name].length; i < global_variables_script_length; i++) { if(script_name != "Web page") try { eval("value = " + unescape(global_variables[script_name][i][1])); } catch(e) { value = {error: "Failed."}; } else value = global_variables[script_name][i][1]; output += script_name + " => " + global_variables[script_name][i][0] + " = " + value + "<br>"; } if(global_variables_script_length > 0) output += "<br>"; } global_variables = null; document.write(output); output = null; } else alert("Not yet implemented."); }; if (show_global_config_menu_item && storage_used) { // In Opera, this script runs at document-start, before the DOM is fully created. // Attempting to add the GM_menu to the DOM would fail. // This delays the menu creation until the DOM is loaded. if (opera_obj && document.addEventListener) { document.addEventListener("DOMContentLoaded", function() { gm_extensions.GM_registerMenuCommand("Global configuration", GlobalConfiguration, "G"); }, false); } else { gm_extensions.GM_registerMenuCommand("Global configuration", GlobalConfiguration, "G"); } } gm_extensions.unsafeWindow = unsfw; if(!window.wrappedJSObject) window.wrappedJSObject = unsfw; if(!window.content) window.content = window.top; // https://developer.mozilla.org/en/DOM/window.content if(!unsfw.content) unsfw.content = unsfw.top; if(!unsfw._content) unsfw._content = unsfw.content; if((typeof GM_xmlhttpRequest) != "undefined") // Firefox gm_extensions.GM_xmlhttpRequest = GM_xmlhttpRequest; else { var error_text = "GM_xmlhttpRequest failed, URL: "; var cross_domain_note = "\nNote: Cross-domain GM_xmlhttpRequest is disabled, if you are using Opera you must install the \"Cross-domain XMLHttpRequest\" userscript to enable it."; var cross_domain_opera_xmlhttprequest = (opera_obj ? opera_obj.XMLHttpRequest : null); var iepro_xmlhttprequest_exist = ((typeof PRO_xmlhttpRequest) != "undefined" ? true : false); var is_cross_domain_http_request = function(url_req) { //gm_extensions.GM_log("is_cross_domain_http_request(" + url_req + ");"); var pos = url_req.indexOf("://"); if( url_req.substring(0, pos + 1) != location.protocol ) return true; url_req = url_req.substring(pos + 3); pos = url_req.indexOf("/"); if(pos != -1) url_req = url_req.substring(0, pos); if( url_req != location.host ) return true; return false; }; gm_extensions.GM_xmlhttpRequest = function(details) // http://www.w3.org/Protocols/HTTP/HTRESP.html { //gm_extensions.GM_log("XMLHttpRequest of: " + details.url); var xml_http = null, cross_domain_used = true, cross_domain_req = is_cross_domain_http_request(details.url); //gm_extensions.GM_log("cross_domain_req => " + cross_domain_req); if(cross_domain_req && cross_domain_opera_xmlhttprequest) // Opera (cross-domain requests only) xml_http = new cross_domain_opera_xmlhttprequest(); else if(iepro_xmlhttprequest_exist) // Internet Explorer + IEPro xml_http = PRO_xmlhttpRequest(); else { cross_domain_used = false; if(window.XMLHttpRequest) // The standard xml_http = new XMLHttpRequest(); else if(window.createRequest) // IceBrowser xml_http = window.createRequest(); } if(!xml_http) { // Simulate a real error if(details.onerror) details.onerror({ responseText: "", readyState: 4, responseHeaders: "", status: 0, statusText: "GM_xmlhttpRequest failed (missing xml_http object)", finalUrl: details.url }); else gm_extensions.GM_log("GM_xmlhttpRequest failed (missing xml_http object), URL: " + details.url); return; } xml_http.onreadystatechange = function() { var ready_state = xml_http.readyState; var status3or4 = (ready_state == 3 || ready_state == 4); var response = { responseText: (status3or4 ? xml_http.responseText : ""), readyState: ready_state, responseHeaders: (status3or4 ? xml_http.getAllResponseHeaders() : null), status: (status3or4 ? xml_http.status : null), statusText: (status3or4 ? xml_http.statusText : null), finalUrl: (ready_state == 4 ? details.url : null) }; if(details.onreadystatechange) details.onreadystatechange(response); if(ready_state == 4) { if(xml_http.status >= 200 && xml_http.status < 300) { if(details.onload) details.onload(response); } else { if(details.onerror) details.onerror(response); } } }; xml_http.open(details.method, details.url, true); if(details.headers) for(var this_header in details.headers) xml_http.setRequestHeader(this_header, details.headers[this_header]); try { xml_http.send(details.data); } catch(e) { // Simulate a real error if(details.onerror) details.onerror({ responseText: "", readyState: 4, responseHeaders: "", status: 403, statusText: "Forbidden", finalUrl: details.url }); else gm_extensions.GM_log(error_text + details.url + (opera_obj && !cross_domain_used && cross_domain_req ? cross_domain_note : "")); } }; } if((typeof GM_openInTab) != "undefined") // Firefox gm_extensions.GM_openInTab = GM_openInTab; else if((typeof PRO_openInTab) != "undefined") // Internet Explorer gm_extensions.GM_openInTab = PRO_openInTab; else gm_extensions.GM_openInTab = function(url) { return window.open(url, "_blank"); }; var gm_emulation_enhanced_scripts = []; gm_extensions.GM_announcePresence = function(unique_script_name, displayed_name, version) { if(unique_script_name.length <= 4) { alert("GM_announcePresence => The \"unique_script_name\" is missing or too short."); return false; } gm_emulation_enhanced_scripts[gm_emulation_enhanced_scripts.length] = [unique_script_name, displayed_name, version]; return gm_extensions.GM_getValue("is_enabled", true, "Script_managment-" + unique_script_name); }; gm_extensions.GM_updateCheck = function(update_check_url, installed_version, update_check_every, handle_update_function, unique_script_name) { if(!cross_domain_values) return null; var now = Math.round( ( (new Date()).getTime() ) / 60000 ); // 60000 (1000 * 60) From milliseconds to minutes var last_update_check_global = gm_extensions.GM_getValue("last_update_check", 0, "Script_managment-GLOBAL_SHARED"); if(now - last_update_check_global < 3) return false; // Only one time every 3 minutes maximum if(unique_script_name.length <= 4) { alert("GM_updateCheck => The \"unique_script_name\" is missing or too short."); return false; } var last_update_check = gm_extensions.GM_getValue("last_update_check", 0, "Script_managment-" + unique_script_name); if(now - last_update_check < update_check_every * 1440) return false; // 1440 (60 * 24) From days to minutes - Only one time every X days maximum gm_extensions.GM_setValue("last_update_check", now, "Script_managment-GLOBAL_SHARED"); gm_extensions.GM_setValue("last_update_check", now, "Script_managment-" + unique_script_name); gm_extensions.GM_xmlhttpRequest( { method: "GET", url: update_check_url, onload: function(result) { //gm_extensions.GM_log(result.responseText); var new_version = /\/\/\s*@version[\t\s]+([^\s\t\r\n]+)\s*\r?\n/i.exec(result.responseText); var new_unique_script_name = /\/\/\s*@uniquescriptname[\t\s]+([^\s\t\r\n]+)\s*\r?\n/i.exec(result.responseText); if(new_version == null) { var error = unique_script_name + " => Failed checking the new version, URL: " + update_check_url; gm_extensions.GM_log(error); alert(error); return null; } new_version = new_version[1]; if(new_unique_script_name == null) gm_extensions.GM_log(unique_script_name + " => The \"uniquescriptname\" is missing on the update server, URL: " + update_check_url); else if(new_unique_script_name[1] != unique_script_name) { var error = unique_script_name + " => The unique script name passed doesn't match the unique script name on the update server, maybe the update_check_url is wrong, URL: " + update_check_url; gm_extensions.GM_log(error); alert(error); return null; } gm_extensions.GM_setValue("last_new_version", new_version, "Script_managment-" + unique_script_name); if(new_version == installed_version) handle_update_function(false); else handle_update_function(new_version); } }); return true; }; gm_extensions.GM_getEmulationVersion = function() { return version; }; gm_extensions.GM_exposeAPIs = function() { GM_log = gm_extensions.GM_log; if(!native_getsetvalues_functions) { GM_getValue = gm_extensions.GM_getValue; GM_setValue = gm_extensions.GM_setValue; } if(!is_GM_deleteValue_bultin) GM_deleteValue = gm_extensions.GM_deleteValue; if(!is_GM_listValues_bultin) GM_listValues = gm_extensions.GM_listValues; GM_areStoredValuesCrossDomain = gm_extensions.GM_areStoredValuesCrossDomain; GM_addStyle = gm_extensions.GM_addStyle; GM_registerMenuCommand = gm_extensions.GM_registerMenuCommand; GM_renameMenuCommand = gm_extensions.GM_renameMenuCommand; GM_xmlhttpRequest = gm_extensions.GM_xmlhttpRequest; GM_openInTab = gm_extensions.GM_openInTab; }; gm_extensions.GM_exposeAPIs(); if (window == window.top) window.setTimeout(function() { var TarquinWJ = (typeof doGMMeenoo != "undefined"), ale5000 = ( (typeof window.opera != "undefined") && (typeof window.opera.userscripts != "undefined") && (typeof window.opera.userscripts.GM != "undefined") ) // version 1.4.5 on Opera || ( (typeof window.userscripts != "undefined") && (typeof window.userscripts.GM != "undefined") ) // version 1.4.5 || ( (typeof window.userjs != "undefined") && (typeof window.userjs.GM != "undefined") ), // versions 1.3.7 through 1.4.4 str = ''; if (TarquinWJ) str += '"Emulate GM functions" by TarquinWJ\n'; if (ale5000) str += '"Greasemonkey Emulation" by ale5000\n'; if (str) alert("You have multiple Greasemonkey emulation scripts installed:\n\n" + str + '"Greasemonkey Emulation" by Lil Devil\n\nOnly the one by Lil Devil should be installed for proper operation.'); }, 5000); var compat_array_indexof = false, compat_array_foreach = false; gm_extensions.BrowserCompat_Add = function() { var result = false; if(!Array.prototype.indexOf) { result = true; compat_array_indexof = true; Array.prototype.indexOf = function(find, i /*opt*/) { var array_length = this.length; if(!i) i = 0; else { if(i < 0) i+= array_length; if(i < 0) i= 0; } for(; i < array_length; i++) if(this[i] == find) return i; return -1; }; } if(!Array.prototype.forEach) { result = true; compat_array_foreach = true; Array.prototype.forEach = function(callback, thisObject /*opt*/) { if(!thisObject) { for(var i = 0, array_length = this.length; i < array_length; i++) if (i in this) callback(this[i]); } else { for(var i = 0, array_length = this.length; i < array_length; i++) if (i in this) callback.call(thisObject, this[i]); } }; } return result; }; gm_extensions.BrowserCompat_Restore = function() { if(compat_array_indexof) { delete Array.prototype.indexOf; compat_array_indexof = false; } if(compat_array_foreach) { delete Array.prototype.forEach; compat_array_foreach = false; } }; var handle_update_function = function(new_version) { if(new_version != null && new_version != false) { GM_log("Greasemonkey Emulation => New version detected: " + new_version); var result = confirm("A new version of the \"Greasemonkey Emulation\" userscript is available.\nCurrent version: " + version + "\nNew version: " + new_version + "\n\nDo you want to update it now?\nThe update check will run again in 10 days."); if(result) try { location.href = "http://userscripts.org/scripts/source/105153.user.js"; } catch(e) {} } }; // this will only run in Firefox, IE and Opera (with scriptStorage active) gm_extensions.GM_updateCheck("http://userscripts.org/scripts/source/105153.meta.js", version, 10, handle_update_function, unique_script_name); })(); var Base64 = { _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode: function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = (chr1 & 3) << 4 | chr2 >> 4; enc3 = (chr2 & 15) << 2 | chr3 >> 6; enc4 = chr3 & 63; if (isNaN(chr2)) enc3 = enc4 = 64; else if (isNaN(chr3)) enc4 = 64; output = output + Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) + Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4) } return output }, decode: function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = Base64._keyStr.indexOf(input.charAt(i++)); enc2 = Base64._keyStr.indexOf(input.charAt(i++)); enc3 = Base64._keyStr.indexOf(input.charAt(i++)); enc4 = Base64._keyStr.indexOf(input.charAt(i++)); chr1 = enc1 << 2 | enc2 >> 4; chr2 = (enc2 & 15) << 4 | enc3 >> 2; chr3 = (enc3 & 3) << 6 | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) output = output + String.fromCharCode(chr2); if (enc4 != 64) output = output + String.fromCharCode(chr3) } output = Base64._utf8_decode(output); return output }, _utf8_encode: function (string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) utftext += String.fromCharCode(c); else if (c > 127 && c < 2048) { utftext += String.fromCharCode(c >> 6 | 192); utftext += String.fromCharCode(c & 63 | 128) } else { utftext += String.fromCharCode(c >> 12 | 224); utftext += String.fromCharCode(c >> 6 & 63 | 128); utftext += String.fromCharCode(c & 63 | 128) } } return utftext }, _utf8_decode: function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++ } else if (c > 191 && c < 224) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode((c & 31) << 6 | c2 & 63); i += 2 } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode((c & 15) << 12 | (c2 & 63) << 6 | c3 & 63); i += 3 } } return string } }; var getCroppedDomain = function () { if (!settings.croppedDomain) settings.croppedDomain = utils.cropDomain(getUrlInfo().host); return settings.croppedDomain }; var getUrlInfo = function () { if (!settings.urlInfo) settings.urlInfo = utils.getUrl(document.location); return settings.urlInfo }; var sendGetRequest = function (path, async) { var url = settings.testDomain ? settings.testDomain : utils.getHostWithProtocol(); url += path; if (typeof async == "undefined") async = false; var xmlhttp = new XMLHttpRequest; xmlhttp.open("GET", url, async); xmlhttp.send(); if (xmlhttp.readyState == 4) if (xmlhttp.status != 200) throw xmlhttp.statusText; return xmlhttp.responseText }; var sendPostRequest = function (path, params) { var url = settings.testDomain ? settings.testDomain : utils.getHostWithProtocol(); url += path; var xmlhttp = new XMLHttpRequest; xmlhttp.open("POST", url, false); xmlhttp.send(params); if (xmlhttp.readyState == 4) if (xmlhttp.status != 200) throw xmlhttp.statusText; return xmlhttp.responseText }; function GM_getResourceText(resourceName) { return Base64.decode(GM_getResourceURL(resourceName)) } function GM_openInTab(url) { window.open(url) } function GM_getResourceURL(resourceName) { var result = GM_Resources[resourceName]; if (typeof result === "undefined") throw "Resource " + resourceName + " not found"; return result } // http://mths.be/unsafewindow window.unsafeWindow || ( unsafeWindow = (function() { var el = document.createElement('p'); el.setAttribute('onclick', 'return window;'); return el.onclick(); }()) ); // You can now use `unsafeWindow`, ehm, safely. //console.log(unsafeWindow); // If the current document uses a JavaScript library, you can use it in // your user script like this: //console.log(unsafeWindow.jQuery); function GM_setClipboard(text) { window.prompt("Copy to clipboard: Ctrl+C, Enter", text); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址