Image Proxier

Replaces images from certain websites with a proxied version.

当前为 2018-08-16 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Image Proxier
  3. // @namespace https://github.com/GrumpyCrouton/Userscripts
  4. // @version 1.0
  5. // @description Replaces images from certain websites with a proxied version.
  6. // @author GrumpyCrouton
  7. // @match *://*/*
  8. // @grant none
  9. // ==/UserScript==
  10. (function() {
  11. 'use strict';
  12.  
  13. var replace_from = [
  14. 'stack.imgur.com',
  15. 'i.stack.imgur.com',
  16. 'graph.facebook.com',
  17. ];
  18.  
  19. var proxy_link = "//grumpycrouton.com/other/image_proxy/?url=";
  20.  
  21. var $ = window.jQuery;
  22.  
  23. $(function() {
  24. //runProxier();
  25. });
  26.  
  27. function runProxier() {
  28. $('img').each(function() {
  29. var image = $(this);
  30. if(!image.data('image_proxier_converted')) {
  31. image.attr('src', getProxyLink(image.attr('src')));
  32. image.attr('data-image_proxier_converted', 1);
  33. }
  34. });
  35. $('a').each(function() {
  36. var link = $(this);
  37. if(!link.data('image_proxier_converted')) {
  38. link.attr('href', getProxyLink(link.attr('href')));
  39. link.attr('data-image_proxier_converted', 1);
  40. }
  41. });
  42. }
  43.  
  44. function getProxyLink(givenLink) {
  45. if (givenLink) {
  46. if (replace_from.some(function(v) {
  47. return givenLink.indexOf(v) >= 0;
  48. })) {
  49. var new_link = proxy_link + encodeURIComponent(givenLink);
  50. console.log(new_link);
  51. return new_link;
  52. } else {
  53. return givenLink;
  54. }
  55. }
  56. }
  57.  
  58. (function(window) {
  59. var last = +new Date();
  60. var delay = 100; // default delay
  61.  
  62. // Manage event queue
  63. var stack = [];
  64.  
  65. function callback() {
  66. var now = +new Date();
  67. if (now - last > delay) {
  68. for (var i = 0; i < stack.length; i++) {
  69. stack[i]();
  70. }
  71. last = now;
  72. }
  73. }
  74.  
  75. // Public interface
  76. var onDomChange = function(fn, newdelay) {
  77. if (newdelay) delay = newdelay;
  78. stack.push(fn);
  79. };
  80.  
  81. // Naive approach for compatibility
  82. function naive() {
  83.  
  84. var last = document.getElementsByTagName('*');
  85. var lastlen = last.length;
  86. var timer = setTimeout(function check() {
  87.  
  88. // get current state of the document
  89. var current = document.getElementsByTagName('*');
  90. var len = current.length;
  91.  
  92. // if the length is different
  93. // it's fairly obvious
  94. if (len != lastlen) {
  95. // just make sure the loop finishes early
  96. last = [];
  97. }
  98.  
  99. // go check every element in order
  100. for (var i = 0; i < len; i++) {
  101. if (current[i] !== last[i]) {
  102. callback();
  103. last = current;
  104. lastlen = len;
  105. break;
  106. }
  107. }
  108.  
  109. // over, and over, and over again
  110. setTimeout(check, delay);
  111.  
  112. }, delay);
  113. }
  114.  
  115. //
  116. // Check for mutation events support
  117. //
  118.  
  119. var support = {};
  120.  
  121. var el = document.documentElement;
  122. var remain = 3;
  123.  
  124. // callback for the tests
  125. function decide() {
  126. if (support.DOMNodeInserted) {
  127. window.addEventListener("DOMContentLoaded", function() {
  128. if (support.DOMSubtreeModified) { // for FF 3+, Chrome
  129. el.addEventListener('DOMSubtreeModified', callback, false);
  130. } else { // for FF 2, Safari, Opera 9.6+
  131. el.addEventListener('DOMNodeInserted', callback, false);
  132. el.addEventListener('DOMNodeRemoved', callback, false);
  133. }
  134. }, false);
  135. } else if (document.onpropertychange) { // for IE 5.5+
  136. document.onpropertychange = callback;
  137. } else { // fallback
  138. naive();
  139. }
  140. }
  141.  
  142. // checks a particular event
  143. function test(event) {
  144. el.addEventListener(event, function fn() {
  145. support[event] = true;
  146. el.removeEventListener(event, fn, false);
  147. if (--remain === 0) decide();
  148. }, false);
  149. }
  150.  
  151. // attach test events
  152. if (window.addEventListener) {
  153. test('DOMSubtreeModified');
  154. test('DOMNodeInserted');
  155. test('DOMNodeRemoved');
  156. } else {
  157. decide();
  158. }
  159.  
  160. // do the dummy test
  161. var dummy = document.createElement("div");
  162. el.appendChild(dummy);
  163. el.removeChild(dummy);
  164.  
  165. // expose
  166. window.onDomChange = onDomChange;
  167. })(window);
  168.  
  169. onDomChange(function() {
  170. runProxier();
  171. });
  172.  
  173. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址