🏠 Home 

GMLibrary

GMLibary

สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/456410/1131251/GMLibrary.js

  1. // ==UserScript==
  2. // @name GMLibrary
  3. // @namespace https://greasyfork.org/users/28298
  4. // @version 1.6
  5. // @description GMLibary
  6. // @author Jerry
  7. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  8. // @grant GM_setClipboard
  9. // @grant GM_download
  10. // @grant GM_addStyle
  11. // @grant GM_notification
  12. // @grant GM_xmlhttpRequest
  13. // @noframes
  14. // @license GNU GPLv3
  15. // ==/UserScript==
  16. // match violentmonkey supports * anywhere in url
  17. // GM_notification requires macOS to turn on notification for browser
  18. // https://violentmonkey.github.io/api/gm/
  19. // https://www.tampermonkey.net/documentation.php?ext=dhdg
  20. /**
  21. * Finds all elements in the entire page matching `selector`, even if they are in shadowRoots.
  22. * Just like `querySelectorAll`, but automatically expand on all child `shadowRoot` elements.
  23. * @see https://stackoverflow.com/a/71692555/2228771
  24. */
  25. function querySelectorAllShadows(selector, el = document.body) {
  26. // recurse on childShadows
  27. const childShadows = Array.from(el.querySelectorAll('*')).
  28. map(el => el.shadowRoot).filter(Boolean);
  29. // console.log('[querySelectorAllShadows]', selector, el, `(${childShadows.length} shadowRoots)`);
  30. const childR###lts = childShadows.map(child => querySelectorAllShadows(selector, child));
  31. // fuse all r###lts into singular, flat array
  32. const r###lt = Array.from(el.querySelectorAll(selector));
  33. return r###lt.concat(childR###lts).flat();
  34. }
  35. function findx(xpath) {
  36. // e.g., findx('//select[@title="R###lts Per Page"]')
  37. // returns null if not found
  38. return document.evaluate(xpath, document, null, XPathR###lt.ANY_TYPE, null).iterateNext();
  39. }
  40. function triggerevent(element,event) {
  41. // e.g., triggerevent (page,'change')
  42. let changeEvent = new Event(event);
  43. element.dispatchEvent(changeEvent);
  44. }
  45. function addbutton(text,func,top,left,width,height) {
  46. //top, left, [width[, height]] in px
  47. // e.g., width 100px, height 25px
  48. // https://stackoverflow.com/a/1535421/2292993
  49. if (window.top != window.self) {
  50. return;
  51. } //don't run on frames or iframes
  52. let btn = document.createElement("button");
  53. btn.innerHTML = text;
  54. document.body.appendChild(btn);
  55. btn.addEventListener("click", func);
  56. btn.style.cssText = "border-radius: 5px; border:1px solid black; background-color:#D3D3D3; color:black";
  57. btn.style.position = 'absolute';
  58. btn.style.top = top+'px';
  59. btn.style.left = left+'px';
  60. if (width !== undefined) {btn.style.width = width+'px';}
  61. if (height !== undefined) {btn.style.height = height+'px';}
  62. console.log("top: " + top + 'px' + " left: " + left + 'px');
  63. }
  64. // must call with await in async function; otherwise not working
  65. function asleep(ms) {
  66. // setTimeout(()=>{console.log("Sleeping...");},3000);
  67. console.log("Sleeping " + ms)
  68. return new Promise(resolve => setTimeout(resolve, ms));
  69. }
  70. function sleep(millis) {
  71. var date = new Date();
  72. var curDate = null;
  73. do { curDate = new Date(); }
  74. while(curDate-date < millis);
  75. }
  76. function hget (url) {
  77. // https://wiki.greasespot.net/GM.xmlHttpRequest
  78. // https://stackoverflow.com/a/65561572/2292993
  79. return new Promise((resolve, reject) => {
  80. GM_xmlhttpRequest({
  81. method: "GET",
  82. url: url,
  83. // headers: {
  84. // "User-Agent": "Mozilla/5.0", // If not specified, navigator.userAgent will be used.
  85. // "Accept": "text/html" // If not specified, browser defaults will be used.
  86. // },
  87. onload: function(response) {
  88. var responseXML = null;
  89. if (!response.responseXML) {
  90. responseXML = new DOMParser()
  91. .parseFromString(response.responseText, "text/html");
  92. } else {
  93. responseXML = response.responseXML;
  94. }
  95. resolve(responseXML);
  96. // console.log([
  97. // response.status,
  98. // response.statusText,
  99. // response.readyState,
  100. // response.responseHeaders,
  101. // response.responseText,
  102. // response.finalUrl,
  103. // responseXML
  104. // ].join("\n"));
  105. },
  106. onerror: function(error) {
  107. reject(error);
  108. }
  109. });
  110. });
  111. }
  112. // https://github.com/zevero/simpleWebstorage
  113. /*
  114. Wonder how this works?
  115. Storage is the Prototype of both localStorage and sessionStorage.
  116. Got it?
  117. localStorage.set('myKey',{a:[1,2,5], b: 'ok'}); //can set a json Object
  118. localStorage.assign('myKey',{a:[6], c:42}); //shallow merge using Object.assign
  119. localStorage.has('myKey'); // --> true
  120. localStorage.get('myKey'); // --> {a:[6], b: 'ok', c:42}
  121. localStorage.keys(); // --> ['myKey']
  122. localStorage.remove('myKey'); // -
  123. native:
  124. localStorage.clear();
  125. localStorage.length;
  126. */
  127. Storage.prototype.set = function(key, obj) {
  128. var t = typeof obj;
  129. if (t==='undefined' || obj===null ) this.removeItem(key);
  130. this.setItem(key, (t==='object')?JSON.stringify(obj):obj);
  131. return obj;
  132. };
  133. Storage.prototype.get = function(key) {
  134. var obj = this.getItem(key);
  135. try {
  136. var j = JSON.parse(obj);
  137. if (j && typeof j === "object") return j;
  138. } catch (e) { }
  139. return obj;
  140. };
  141. Storage.prototype.assign = function(key, obj_merge) {
  142. var obj = this.get(key);
  143. if (typeof obj !== "object" || typeof obj_merge !== "object") return null;
  144. Object.assign(obj, obj_merge);
  145. return this.set(key,obj);
  146. };
  147. Storage.prototype.has = Storage.prototype.hasOwnProperty;
  148. Storage.prototype.remove = Storage.prototype.removeItem;
  149. Storage.prototype.keys = function() {
  150. return Object.keys(this.valueOf());
  151. };
  152. /* mousetrap v1.6.5 craig.is/killing/mice */
  153. /*
  154. https://github.com/ccampbell/mousetrap
  155. By default all keyboard events will not fire if you are inside of a textarea, input, or select to prevent undesirable things from happening.
  156. If you want them to fire you can add the class mousetrap to the element. <textarea name="message" class="mousetrap"></textarea>
  157. Supported Keys
  158. For modifier keys you can use shift, ctrl, alt, or meta.
  159. You can substitute option for alt and command for meta.
  160. Other special keys are backspace, tab, enter, return, capslock, esc, escape, space, pageup, pagedown, end, home, left, up, right, down, ins, del, and plus.
  161. Any other key you should be able to reference by name like a, /, $, *, or =.
  162. Mousetrap.bind('esc', function() { console.log('escape'); }, 'keyup');
  163. There is a third argument you can use to specify the type of event to listen for. It can be keypress, keydown or keyup.
  164. It is recommended that you leave this argument out if you are unsure. Mousetrap will look at the keys you are binding and determine whether it should default to keypress or keydown.
  165. Mousetrap.bind(['command+k', 'ctrl+k'], function() {
  166. console.log('command k or control k');
  167. // return false to prevent default browser behavior
  168. // and stop event from bubbling
  169. return false;
  170. });
  171. Mousetrap.unbind
  172. Mousetrap.trigger
  173. Mousetrap.stopCallback
  174. Mousetrap.reset
  175. Mousetrap.handleKey
  176. Mousetrap.addKeycodes
  177. */
  178. (function(q,u,c){function v(a,b,g){a.addEventListener?a.addEventListener(b,g,!1):a.attachEvent("on"+b,g)}function z(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return n[a.which]?n[a.which]:r[a.which]?r[a.which]:String.fromCharCode(a.which).toLowerCase()}function F(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function w(a){return"shift"==a||"ctrl"==a||"alt"==a||
  179. "meta"==a}function A(a,b){var g,d=[];var e=a;"+"===e?e=["+"]:(e=e.replace(/\+{2}/g,"+plus"),e=e.split("+"));for(g=0;g<e.length;++g){var m=e[g];B[m]&&(m=B[m]);b&&"keypress"!=b&&C[m]&&(m=C[m],d.push("shift"));w(m)&&d.push(m)}e=m;g=b;if(!g){if(!p){p={};for(var c in n)95<c&&112>c||n.hasOwnProperty(c)&&(p[n[c]]=c)}g=p[e]?"keydown":"keypress"}"keypress"==g&&d.length&&(g="keydown");return{key:m,modifiers:d,action:g}}function D(a,b){return null===a||a===u?!1:a===b?!0:D(a.parentNode,b)}function d(a){function b(a){a=
  180. a||{};var b=!1,l;for(l in p)a[l]?b=!0:p[l]=0;b||(x=!1)}function g(a,b,t,f,g,d){var l,E=[],h=t.type;if(!k._callbacks[a])return[];"keyup"==h&&w(a)&&(b=[a]);for(l=0;l<k._callbacks[a].length;++l){var c=k._callbacks[a][l];if((f||!c.seq||p[c.seq]==c.level)&&h==c.action){var e;(e="keypress"==h&&!t.metaKey&&!t.ctrlKey)||(e=c.modifiers,e=b.sort().join(",")===e.sort().join(","));e&&(e=f&&c.seq==f&&c.level==d,(!f&&c.combo==g||e)&&k._callbacks[a].splice(l,1),E.push(c))}}return E}function c(a,b,c,f){k.stopCallback(b,
  181. b.target||b.srcElement,c,f)||!1!==a(b,c)||(b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation?b.stopPropagation():b.cancelBubble=!0)}function e(a){"number"!==typeof a.which&&(a.which=a.keyCode);var b=z(a);b&&("keyup"==a.type&&y===b?y=!1:k.handleKey(b,F(a),a))}function m(a,g,t,f){function h(c){return function(){x=c;++p[a];clearTimeout(q);q=setTimeout(b,1E3)}}function l(g){c(t,g,a);"keyup"!==f&&(y=z(g));setTimeout(b,10)}for(var d=p[a]=0;d<g.length;++d){var e=d+1===g.length?l:h(f||
  182. A(g[d+1]).action);n(g[d],e,f,a,d)}}function n(a,b,c,f,d){k._directMap[a+":"+c]=b;a=a.replace(/\s+/g," ");var e=a.split(" ");1<e.length?m(a,e,b,c):(c=A(a,c),k._callbacks[c.key]=k._callbacks[c.key]||[],g(c.key,c.modifiers,{type:c.action},f,a,d),k._callbacks[c.key][f?"unshift":"push"]({callback:b,modifiers:c.modifiers,action:c.action,seq:f,level:d,combo:a}))}var k=this;a=a||u;if(!(k instanceof d))return new d(a);k.target=a;k._callbacks={};k._directMap={};var p={},q,y=!1,r=!1,x=!1;k._handleKey=function(a,
  183. d,e){var f=g(a,d,e),h;d={};var k=0,l=!1;for(h=0;h<f.length;++h)f[h].seq&&(k=Math.max(k,f[h].level));for(h=0;h<f.length;++h)f[h].seq?f[h].level==k&&(l=!0,d[f[h].seq]=1,c(f[h].callback,e,f[h].combo,f[h].seq)):l||c(f[h].callback,e,f[h].combo);f="keypress"==e.type&&r;e.type!=x||w(a)||f||b(d);r=l&&"keydown"==e.type};k._bindMultiple=function(a,b,c){for(var d=0;d<a.length;++d)n(a[d],b,c)};v(a,"keypress",e);v(a,"keydown",e);v(a,"keyup",e)}if(q){var n={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",
  184. 18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},r={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},C={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},B={option:"alt",command:"meta","return":"enter",
  185. escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},p;for(c=1;20>c;++c)n[111+c]="f"+c;for(c=0;9>=c;++c)n[c+96]=c.toString();d.prototype.bind=function(a,b,c){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,c);return this};d.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};d.prototype.trigger=function(a,b){if(this._directMap[a+":"+b])this._directMap[a+":"+b]({},a);return this};d.prototype.reset=function(){this._callbacks={};
  186. this._directMap={};return this};d.prototype.stopCallback=function(a,b){if(-1<(" "+b.className+" ").indexOf(" mousetrap ")||D(b,this.target))return!1;if("composedPath"in a&&"function"===typeof a.composedPath){var c=a.composedPath()[0];c!==a.target&&(b=c)}return"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable};d.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};d.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(n[b]=a[b]);p=null};
  187. d.init=function(){var a=d(u),b;for(b in a)"_"!==b.charAt(0)&&(d[b]=function(b){return function(){return a[b].apply(a,arguments)}}(b))};d.init();q.Mousetrap=d;"undefined"!==typeof module&&module.exports&&(module.exports=d);"function"===typeof define&&define.amd&&define(function(){return d})}})("undefined"!==typeof window?window:null,"undefined"!==typeof window?document:null);