一帆视频去广告

一帆视频(曾用名 "iF 视频"、"多瑙")去广告

  1. // ==UserScript==
  2. // @name 一帆视频去广告
  3. // @description 一帆视频(曾用名 "iF 视频"、"多瑙")去广告
  4.  
  5. // @name:en iFVOD no AD
  6. // @description:en Remove AD on ify.tv (a.k.a. dnvod, iF VOD)
  7.  
  8. // @match https://*.iyf.tv/*
  9. // @match https://*.yifan.tv/*
  10. // @match https://*.yfsp.tv/*
  11. // @match https://*.aiyifan.tv/*
  12. // @grant none
  13. // @version 3.2.4
  14. // @author Jixun Moe<https://jixun.moe/>
  15. // @license BSD-3-Clause
  16. // @supportURL https://jixun.moe/userscript/ifun-noad#comments
  17. // @homepageURL https://jixun.moe/userscript/ifun-noad
  18. // @compatible Chrome ViolentMonkey
  19. // @run-at document-start
  20. // @namespace moe.jixun.dn-noad
  21. // ==/UserScript==
  22.  
  23. //// Injection Parameter ////
  24. const __DEBUG__ = false;
  25. const id = "jixun: have fun :D";
  26.  
  27. const M = {
  28. InitUser: "T1Vy",
  29. PermissionManager: "xMFu",
  30. StoreState: "AytR",
  31. Utility: "3My9",
  32. LegacyRouteLoader: "tyNb",
  33. RxJS: "lJxs",
  34. RequestHelper: "tWDZ",
  35. };
  36.  
  37. const moduleLoadList = new Set(Object.values(M));
  38.  
  39. //// Injection Parameter ////
  40.  
  41. const ArrProto = Array.prototype;
  42. const call = Function.prototype.call;
  43. const each = call.bind(ArrProto.forEach);
  44.  
  45. const injectStyle = () => {
  46. const s = document.createElement("style");
  47. s.textContent = `
  48. .cloppe {
  49. display: block !important;
  50. }
  51.  
  52. .video-player {
  53. height: unset!important;
  54. }
  55.  
  56. .playPageTop {
  57. min-height: unset!important;
  58. }
  59.  
  60. .danmu-center {
  61. min-height: 1005px !important;
  62. max-width: 300px !important;
  63. }
  64.  
  65. app-dn-user-menu-item.top-item,
  66. .nav-link-ctn > li:has(a[target="_blank"]),
  67. .dn-slider-main-container > .dn-slider-image-placeholder[target="_blank"],
  68. vg-pause-ads,
  69. .bl.ng-star-inserted,
  70. .ng-star-inserted.bb,
  71. app-gg-block, app-gg-block.d-block, .overlay-logo
  72. {
  73. display: none !important;
  74. }
  75. `.replace(/\s+/g, " ");
  76. document.head.appendChild(s);
  77. };
  78.  
  79. const defaultAvatar = "https://static.{Host}/upload/up/20170815000037.jpg";
  80. const fakeIp = Array.from(new Array(4), () => (Math.random() * 255) | 0).join(".");
  81. const fakeGid = 9527;
  82. const gidRegex = new RegExp(`gid=${fakeGid}(&|$)`);
  83.  
  84. const always = (v) => ({
  85. get: () => v,
  86. set: () => {},
  87. });
  88.  
  89. const hideCurrentModule = () => {
  90. const idx = webpackJsonp.findIndex((module) => module[1][id]);
  91. webpackJsonp.splice(idx, 1);
  92. };
  93.  
  94. const myHooks = [
  95. [
  96. /* iF-vod 去广告 */
  97. ],
  98. {
  99. [id]: function (module, exports, require) {
  100. injectStyle();
  101. hideCurrentModule();
  102.  
  103. const requireDefault = (name) => require(name).a;
  104.  
  105. const PermissionManager = requireDefault(M.PermissionManager);
  106. const StoreState = requireDefault(M.StoreState);
  107. const RequestHelper = requireDefault(M.RequestHelper);
  108. const Utility = requireDefault(M.Utility);
  109. const InitUser = requireDefault(M.InitUser);
  110.  
  111. PermissionManager.prototype.isValid = () => true;
  112.  
  113. Object.defineProperty(StoreState, "allVip", always(true));
  114. Object.defineProperty(StoreState, "hideAds", always(true));
  115. Object.defineProperty(StoreState, "disableNotify", always(true));
  116.  
  117. const utils = new Utility(window.document);
  118.  
  119. const appendUserInfo = RequestHelper.prototype.appendUserInfo;
  120. RequestHelper.prototype.appendUserInfo = function (url) {
  121. const data = appendUserInfo.call(this, url);
  122. for (const [k, v] of Object.entries(data)) {
  123. data[k] = v.replace(gidRegex, "gid=0$1");
  124. }
  125. return data;
  126. };
  127.  
  128. function updateUser(user) {
  129. if (!user) return;
  130. Object.defineProperty(user, "userName", always("某用户"));
  131. Object.defineProperty(user, "nickName", always("某用户"));
  132. Object.defineProperty(user, "endDays", always(1));
  133.  
  134. Object.defineProperty(user, "vipImage", always("jixun:normal-vip.png"));
  135. Object.defineProperty(user, "sex", always(9));
  136. Object.defineProperty(user, "nickName", always(""));
  137. Object.defineProperty(user, "experience", always(0));
  138. Object.defineProperty(user, "gold", always(0));
  139. Object.defineProperty(user, "nextLevel", always(99));
  140. Object.defineProperty(user, "gid", always(99));
  141.  
  142. Object.defineProperty(user, "lastIP", always(fakeIp));
  143. Object.defineProperty(user, "from", always("地球"));
  144. Object.defineProperty(user, "headImage", always(utils.GetHost(defaultAvatar)));
  145. }
  146.  
  147. // 过部分检测,如 2.0x 倍速
  148. // 但也有一些 VIP 功能不会弹窗提示而直接报错。
  149. function fixUser(user) {
  150. Object.defineProperty(user, "daysOfMembership", always(1));
  151.  
  152. // 若 gid 为 0 或 null,设定为预先设定好的 "假" gid。
  153. if (!user.token.gid) {
  154. user.token.gid = fakeGid;
  155. }
  156.  
  157. return user;
  158. }
  159.  
  160. const { fromValidateToken, fromGetAuthorizedUserInfo } = InitUser.prototype;
  161.  
  162. InitUser.prototype.fromValidateToken = function (user) {
  163. updateUser(user);
  164. return fixUser(fromValidateToken.apply(this, arguments));
  165. };
  166.  
  167. InitUser.prototype.fromGetAuthorizedUserInfo = function (user) {
  168. updateUser(user);
  169. return fixUser(fromGetAuthorizedUserInfo.apply(this, arguments));
  170. };
  171.  
  172. if (__DEBUG__) {
  173. window.__require__ = require;
  174. }
  175. },
  176. },
  177. ];
  178.  
  179. const webpackJsonp = (window.webpackJsonp = window.webpackJsonp || []);
  180. let prevPush = webpackJsonp.push;
  181. function webpackPushFilter(args) {
  182. if (moduleLoadList.size === 0) return;
  183. const [nextModuleId, modules] = args;
  184.  
  185. for (const key in modules) {
  186. moduleLoadList.delete(key);
  187. }
  188.  
  189. if (moduleLoadList.size == 0) {
  190. prevPush.call(webpackJsonp, [...myHooks, [[id, nextModuleId]]]);
  191.  
  192. // 还原环境
  193. window.webpackJsonp.push = prevPush;
  194. }
  195. }
  196. const myPush = function () {
  197. each(arguments, webpackPushFilter);
  198. return prevPush.apply(webpackJsonp, arguments);
  199. }.bind(webpackJsonp);
  200. if (Object.hasOwnProperty.call(webpackJsonp, "push")) {
  201. webpackJsonp.push = myPush;
  202. } else {
  203. let prevSlice = webpackJsonp.slice;
  204. webpackJsonp.slice = function () {
  205. prevPush = webpackJsonp.push;
  206. webpackJsonp.push = myPush;
  207. delete window.webpackJsonp.slice;
  208.  
  209. return prevSlice.apply(webpackJsonp, arguments);
  210. }.bind(webpackJsonp);
  211. }
  212.  
  213. window.webpackJsonp.forEach(webpackPushFilter);
  214.  
  215. // 过广告屏蔽检测
  216. try {
  217. Object.defineProperty(window, "isAdsBlocked", always(false));
  218. } catch (err) {
  219. delete window.isAdsBlocked;
  220. }

QingJ © 2025

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