OpenGG.Clean.Player(Bae

通过替换swf播放器的方式来解决优酷的黑屏广告

  1. // ==UserScript==
  2. // @name OpenGG.Clean.Player(Bae
  3. // @author Anonymous
  4. // @description 通过替换swf播放器的方式来解决优酷的黑屏广告
  5. // @version 1.368.2
  6. // @namespace http://userscripts.org/users/Kawaiiushio
  7. // @icon http://extensiondl.maxthon.cn/skinpack/17276781/1366787326/icons/icon_48.png
  8. // @include http://*/*
  9. // @include https://*/*
  10. // @run-at document-start
  11. // ==/UserScript==
  12.  
  13. /*
  14. * === 说明 ===
  15. * 看到 Greasy Fork镜像 上没有这个脚本,于是从 userscripts.org 上搬运过来
  16. * 我只是搬运,别打我
  17. * 本脚本参考http://bbs.kafan.cn/thread-1514537-1-1.html 感谢卡饭大神
  18. * Chrome用户也可以使用Adkill and Media download这个扩展
  19. * 此脚本设计修改人员OpenGG Harv xplsy 15536900 yndoc KawaiiUshio 5B4B铅笔
  20. * Bilibili黑科技由FireAway提供 参考:http://userscripts.org/scripts/show/165424
  21. * Opera兼容部分由Gerald修改
  22. * In God,We Trust.
  23. * THX.
  24. */
  25.  
  26. /*
  27. * Love Jiani
  28. */
  29. (function() {
  30. Function.prototype.bind = function() {
  31. var fn = this, args = Array.prototype.slice.call(arguments), obj = args.shift();
  32. return function() {
  33. return fn.apply(obj, args.concat(Array.prototype.slice.call(arguments)));
  34. };
  35. };
  36.  
  37. function YoukuAntiAds() {}
  38. YoukuAntiAds.prototype = {
  39. _players: null,
  40. _rules: null,
  41. _done: null,
  42. get players() {
  43. if(!this._players) {
  44. this._players = {
  45. 'youku_loader': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/loader.swf',
  46. 'youku_player': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/player.swf',
  47. 'ku6': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/ku6.swf',
  48. 'ku6_out': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/ku6_out.swf',
  49. 'iqiyi': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/iqiyi.swf',
  50. 'iqiyi5': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/iqiyi5.swf',
  51. 'iqiyi_out': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/iqiyi_out.swf',
  52. 'tudou': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/tudou.swf',
  53. 'tudou_olc': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/olc_8.swf',
  54. 'tudou_sp': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/sp.swf',
  55. 'letv': 'https://git.oschina.net/kawaiiushio/antiad/raw/master/letv.swf'
  56. };
  57. }
  58. return this._players;
  59. },
  60. get rules() {
  61. if(!this._rules) {
  62. this._rules = {
  63. 'youku_loader': {
  64. 'find': /^http:\/\/static\.youku\.com(\/v[\d\.]+)?\/v\/swf\/loader\.swf/i,
  65. 'replace': this.players['youku_loader']
  66. },
  67. 'youku_player': {
  68. 'find': /^http:\/\/static\.youku\.com(\/v[\d\.]+)?\/v\/swf\/q?player[^\.]*\.swf(\?.*)?/i,
  69. 'replace': this.players['youku_loader'] + '$2'
  70. },
  71. 'youku_out': {
  72. 'find': /^http:\/\/player\.youku\.com\/player\.php\/.*sid\/([\w=]+).*(\/v)?\.swf.*/i,
  73. 'replace': this.players['youku_loader'] + '?showAd=0&VideoIDS=$1'
  74. },
  75. 'ku6': {
  76. 'find': /^http:\/\/player\.ku6cdn\.com\/default\/.*\/\d+\/player\.swf/i,
  77. 'replace': this.players['ku6']
  78. },
  79. 'ku6_out': {
  80. 'find': /^http:\/\/player\.ku6\.com\/(inside|refer)\/([^\/]+)\/v\.swf.*/i,
  81. 'replace': this.players['ku6_out'] + '?vid=$2'
  82. },
  83. 'iqiyi': {
  84. 'find': /^http:\/\/www\.iqiyi\.com\/player\/\d+\/player\.swf/i,
  85. 'replace': this.players['iqiyi']
  86. },
  87. 'iqiyi_out': {
  88. 'find': /^http:\/\/(player|dispatcher)\.video\.i?qiyi\.com\/(.*[\?&]vid=)?([^\/&]+).*/i,
  89. 'replace': this.players['iqiyi_out'] + '?vid=$3'
  90. },
  91. 'tudou': {
  92. 'find': /^http:\/\/js\.tudouui\.com\/.*player[^\.]*\.swf/i,
  93. 'replace': this.players['tudou']
  94. },
  95. 'tudou_out': {
  96. 'find': /^http:\/\/www\.tudou\.com\/.*(\/v\.swf)?/i,
  97. 'replace': this.players['tudou_olc'] + '?tvcCode=-1&swfPath=' + this.players['tudou_sp']
  98. },
  99. 'letv': {
  100. 'find': /http:\/\/.*letv[\w]*\.com\/(.*\/(?!live)((v2)?[\w]{4}|swf)player[^\.]*|[\w]*cloud)\.swf/i,
  101. 'replace': this.players['letv']
  102. },
  103. 'letv_out': {
  104. 'find': /http:\/\/.*letv\.com\/player\/swfplayer\.swf(\?.*)/i,
  105. 'replace': this.players['letv'] + '$1'
  106. }
  107. }
  108. }
  109. return this._rules;
  110. },
  111. get done() {
  112. if(!this._done) {
  113. this._done = new Array();
  114. }
  115. return this._done;
  116. },
  117. initPreHandlers: function() {
  118. this.rules['iqiyi']['preHandle'] = function(elem, find, replace, player) {
  119. if(document.querySelector('span[data-flashplayerparam-flashurl]')) {
  120. replace = this.players['iqiyi5'];
  121. }
  122. this.reallyReplace.bind(this, elem, find, replace)();
  123. }
  124. this.rules['iqiyi_out']['preHandle'] = function(elem, find, replace, player) {
  125. var match = player.match(/(autoplay)=[^&]+/ig);
  126. if(match) {
  127. replace += '&' + match.join('&');
  128. }
  129. this.reallyReplace.bind(this, elem, find, replace)();
  130. }
  131. this.rules['tudou_out']['preHandle'] = function(elem, find, replace, player) {
  132. var fn = this;
  133. var isFx = /firefox/i.test(navigator.userAgent);
  134. GM_xmlhttpRequest({
  135. method: isFx ? 'HEAD' : 'GET',
  136. url: isFx ? player : 'https://query.yahooapis.com/v1/public/yql?format=json&q=' + encodeURIComponent('use"https://haoutil.googlecode.com/svn/trunk/firefox/tudou_redirect.yql.xml" as tudou; select * from tudou where url="' + player + '" and referer="' + window.location.href + '"'),
  137. onload: function(response) {
  138. var finalUrl = (isFx ? response.finalUrl : response.responseText);
  139. var match = finalUrl.match(/(iid|youkuid|resourceid|autoplay|snap_pic)=[^&]+/ig);
  140. if(match && !/error/i.test(finalUrl)) {
  141. replace += '&' + match.join('&');
  142. fn.reallyReplace.bind(fn, elem, find, replace)();
  143. }
  144. }
  145. });
  146. }
  147. },
  148. addAnimations: function() {
  149. var style = document.createElement('style');
  150. style.type = 'text/css';
  151. style.innerHTML = 'object,embed{\
  152. -webkit-animation-duration:.001s;-webkit-animation-name:playerInserted;\
  153. -ms-animation-duration:.001s;-ms-animation-name:playerInserted;\
  154. -o-animation-duration:.001s;-o-animation-name:playerInserted;\
  155. animation-duration:.001s;animation-name:playerInserted;}\
  156. @-webkit-keyframes playerInserted{from{opacity:0.99;}to{opacity:1;}}\
  157. @-ms-keyframes playerInserted{from{opacity:0.99;}to{opacity:1;}}\
  158. @-o-keyframes playerInserted{from{opacity:0.99;}to{opacity:1;}}\
  159. @keyframes playerInserted{from{opacity:0.99;}to{opacity:1;}}';
  160. document.getElementsByTagName('head')[0].appendChild(style);
  161. },
  162. animationsHandler: function(e) {
  163. if(e.animationName === 'playerInserted') {
  164. this.replace(e.target);
  165. }
  166. },
  167. replace: function(elem) {
  168. if(this.done.indexOf(elem) != -1) return;
  169. this.done.push(elem);
  170.  
  171. var player = elem.data || elem.src;
  172. if(!player) return;
  173.  
  174. var i, find, replace, isReplacing = false;
  175. for(i in this.rules) {
  176. find = this.rules[i]['find'];
  177. if(find.test(player)) {
  178. replace = this.rules[i]['replace'];
  179. if('function' === typeof this.rules[i]['preHandle']) {
  180. isReplacing = true;
  181. this.rules[i]['preHandle'].bind(this, elem, find, replace, player)();
  182. }
  183. if(!isReplacing) {
  184. this.reallyReplace.bind(this, elem, find, replace)();
  185. }
  186. break;
  187. }
  188. }
  189. },
  190. reallyReplace: function(elem, find, replace) {
  191. elem.data && (elem.data = elem.data.replace(find, replace)) || elem.src && ((elem.src = elem.src.replace(find, replace)) && (elem.style.display = 'block'));
  192. this.reloadPlugin(elem);
  193. },
  194. reloadPlugin: function(elem) {
  195. var nextSibling = elem.nextSibling;
  196. var parentNode = elem.parentNode;
  197. parentNode.removeChild(elem);
  198. var newElem = elem.cloneNode(true);
  199. this.done.push(newElem);
  200. if(nextSibling) {
  201. parentNode.insertBefore(newElem, nextSibling);
  202. } else {
  203. parentNode.appendChild(newElem);
  204. }
  205. },
  206. init: function() {
  207. this.initPreHandlers();
  208.  
  209. var handler = this.animationsHandler.bind(this);
  210.  
  211. document.body.addEventListener('webkitAnimationStart', handler, false);
  212. document.body.addEventListener('msAnimationStart', handler, false);
  213. document.body.addEventListener('oAnimationStart', handler, false);
  214. document.body.addEventListener('animationstart', handler, false);
  215.  
  216. this.addAnimations();
  217. }
  218. };
  219.  
  220. new YoukuAntiAds().init();
  221. })();

QingJ © 2025

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