Assassinate Ad Block Blockers

You know those annoying content blockers that demand you remove your AdBlock so you can read the content? This script removes them by force. Please note, this is not automatically universal like AdBlock Plus. It operates on a per-site basis that the author must add.

当前为 2022-12-24 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Assassinate Ad Block Blockers
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.61
  5. // @description You know those annoying content blockers that demand you remove your AdBlock so you can read the content? This script removes them by force. Please note, this is not automatically universal like AdBlock Plus. It operates on a per-site basis that the author must add.
  6. // @author Kxmode
  7. // @run-at document-idle
  8. // @license Creative Commons, Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
  9. // @match *://*.businessinsider.com/*
  10. // @match *://*.cnbc.com/*
  11. // @match *://*.cnn.com/*
  12. // @match *://*.curbed.com/*
  13. // @match *://*.dailymail.co.uk/*
  14. // @match *://*.eurogamer.net/*
  15. // @match *://*.forbes.com/*
  16. // @match *://*.fortune.com/*
  17. // @match *://*.foxbusiness.com/*
  18. // @match *://*.gamesradar.com/*
  19. // @match *://gamerant.com/*
  20. // @match *://*.houstonchronicle.com/*
  21. // @match *://*.inquirer.com/*
  22. // @match *://*.insider.com/*
  23. // @match *://*.kbb.com/*
  24. // @match *://*.latimes.com/*
  25. // @match *://*.makeuseof.com/*
  26. // @match *://markets.businessinsider.com/*
  27. // @match *://www.medpagetoday.com/*
  28. // @match *://www.mercurynews.com/*
  29. // @match *://metro.co.uk/*
  30. // @match *://*.nationalgeographic.com/*
  31. // @match *://*.nbcnews.com/*
  32. // @match *://*.nymag.com/*
  33. // @match *://*.nytimes.com/*
  34. // @match *://*.newyorker.com/*
  35. // @match *://*.rottentomatoes.com/*
  36. // @match *://*.sfchronicle.com/*
  37. // @match *://*.sfgate.com/*
  38. // @match *://*.thecut.com/*
  39. // @match *://*.thedailybeast.com/*
  40. // @match *://*.vg247.com/*
  41. // @match *://*.vulture.com/*
  42. // @match *://*.washingtonpost.com/*
  43. // @match *://*.wired.com/*
  44. // ==/UserScript==
  45.  
  46. /* jshint esversion: 6 */
  47. /* eslint-disable */
  48.  
  49. // Loads jQuery and triggers a callback function when jQuery has finished loading
  50. function addJQuery(callback) {
  51. let script = document.createElement('script');
  52. script.setAttribute('src', '//ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js');
  53. script.addEventListener('load', function() { callback(); }, false);
  54. document.body.appendChild(script);
  55. }
  56.  
  57. // The main script
  58. function main() {
  59. let currentStatus1, currentStatus2, currentStatus3, currentStatus4,
  60. currentStatus5, currentStatus6, currentStatus7, currentStatus8,
  61. currentStatus9, currentStatus10;
  62. let okayToProcess = true;
  63. let isLooped = false;
  64.  
  65. const $ = (unsafeWindow || window).$;
  66. const URL_HOSTNAME = window.location.hostname;
  67.  
  68. // For domains that uses a specific service blocking AdBlockers
  69. const STANDARD_BLOCKER_DOMAINS = [ 'www.vg247.com',
  70. 'www.gamesradar.com',
  71. 'www.cnn.com'].map(String);
  72.  
  73. // For domains that follow a nonstandard or custom way of blocking AdBlockers
  74. const ABNORMAL_BLOCKER_DONAINS = [ 'www.makeuseof.com',
  75. 'www.businessinsider.com',
  76. 'www.thedailybeast.com',
  77. 'www.nytimes.com',
  78. 'cooking.nytimes.com',
  79. 'www.forbes.com',
  80. 'www.dailymail.co.uk',
  81. 'www.washingtonpost.com',
  82. 'www.insider.com',
  83. 'www.latimes.com',
  84. 'www.nationalgeographic.com',
  85. 'www.sfchronicle.com',
  86. 'seekingalpha.com',
  87. 'www.eurogamer.net',
  88. 'www.usatoday.com',
  89. 'markets.businessinsider.com',
  90. 'www.vulture.com',
  91. 'nymag.com',
  92. 'www.thecut.com',
  93. 'www.curbed.com',
  94. 'metro.co.uk',
  95. 'fortune.com',
  96. 'www.nbcnews.com',
  97. 'www.inquirer.com',
  98. 'www.houstonchronicle.com',
  99. 'www.rottentomatoes.com',
  100. 'editorial.rottentomatoes.com',
  101. 'www.fresnobee.com',
  102. 'www.kbb.com',
  103. 'www.foxbusiness.com',
  104. 'www.newyorker.com',
  105. 'gamerant.com',
  106. 'www.sfgate.com',
  107. 'www.wired.com',
  108. 'www.cnbc.com',
  109. 'www.medpagetoday.com',
  110. 'www.mercurynews.com'].map(String);
  111.  
  112. // For domains that typically launch third-party modals for random stuff like sign-ups
  113. const AUXILIARY_BLOCKER_DOMAINS = [ 'www.gamesradar.com'].map(String);
  114.  
  115. const DOMAIN = {
  116. 'BusinessInsider': ABNORMAL_BLOCKER_DONAINS[1],
  117. 'BusinessInsiderMarkets': ABNORMAL_BLOCKER_DONAINS[15],
  118. 'CNBC': ABNORMAL_BLOCKER_DONAINS[34],
  119. 'CNN': STANDARD_BLOCKER_DOMAINS[2],
  120. 'Curbed': ABNORMAL_BLOCKER_DONAINS[19],
  121. 'DailyMail': ABNORMAL_BLOCKER_DONAINS[6],
  122. 'EuroGamer': ABNORMAL_BLOCKER_DONAINS[13],
  123. 'Forbes': ABNORMAL_BLOCKER_DONAINS[5],
  124. 'Fortune': ABNORMAL_BLOCKER_DONAINS[21],
  125. 'FoxBusiness': ABNORMAL_BLOCKER_DONAINS[29],
  126. 'FresnoBee': ABNORMAL_BLOCKER_DONAINS[27],
  127. 'GameRant': ABNORMAL_BLOCKER_DONAINS[31],
  128. 'GamesRadar': STANDARD_BLOCKER_DOMAINS[1],
  129. 'GamesRadarAuxiliary': AUXILIARY_BLOCKER_DOMAINS[0],
  130. 'HoustonChronicle': ABNORMAL_BLOCKER_DONAINS[24],
  131. 'Inquirer': ABNORMAL_BLOCKER_DONAINS[23],
  132. 'Insider': ABNORMAL_BLOCKER_DONAINS[8],
  133. 'KelleyBlueBook': ABNORMAL_BLOCKER_DONAINS[28],
  134. 'LATimes': ABNORMAL_BLOCKER_DONAINS[9],
  135. 'MakeUseOf': ABNORMAL_BLOCKER_DONAINS[0],
  136. 'MedPageToday': ABNORMAL_BLOCKER_DONAINS[35],
  137. 'MercuryNews': ABNORMAL_BLOCKER_DONAINS[36],
  138. 'MetroUK': ABNORMAL_BLOCKER_DONAINS[20],
  139. 'NationalGeographic': ABNORMAL_BLOCKER_DONAINS[10],
  140. 'NBCNews': ABNORMAL_BLOCKER_DONAINS[22],
  141. 'NewYorker': ABNORMAL_BLOCKER_DONAINS[30],
  142. 'NewYorkTimes': ABNORMAL_BLOCKER_DONAINS[3],
  143. 'NewYorkTimesCooking': ABNORMAL_BLOCKER_DONAINS[4],
  144. 'NYMag': ABNORMAL_BLOCKER_DONAINS[17],
  145. 'RottenTomatoes': ABNORMAL_BLOCKER_DONAINS[25],
  146. 'RottenTomatoesEditorial': ABNORMAL_BLOCKER_DONAINS[26],
  147. 'SeekingAlpha': ABNORMAL_BLOCKER_DONAINS[12],
  148. 'SFChronicle': ABNORMAL_BLOCKER_DONAINS[11],
  149. 'SFGate': ABNORMAL_BLOCKER_DONAINS[32],
  150. 'TheCut': ABNORMAL_BLOCKER_DONAINS[18],
  151. 'TheDailyBeast': ABNORMAL_BLOCKER_DONAINS[2],
  152. 'USAToday': ABNORMAL_BLOCKER_DONAINS[14],
  153. 'VG247': STANDARD_BLOCKER_DOMAINS[0],
  154. 'Vulture': ABNORMAL_BLOCKER_DONAINS[16],
  155. 'WashingtonPost': ABNORMAL_BLOCKER_DONAINS[7],
  156. 'Wired': ABNORMAL_BLOCKER_DONAINS[33],
  157. }
  158.  
  159. function SpecialNinjaJavaScriptKiller() {
  160. let runSpecialProcess = false;
  161.  
  162. if (ABNORMAL_BLOCKER_DONAINS.indexOf(URL_HOSTNAME) > -1) {
  163. switch(URL_HOSTNAME) {
  164. case DOMAIN.SFChronicle: SFChronicle(); runSpecialProcess = true; break;
  165. case DOMAIN.Inquirer: Inquirer(isLooped); runSpecialProcess = true; break;
  166. case DOMAIN.MedPageToday: MedPageToday(); runSpecialProcess = true; break;
  167. case DOMAIN.MercuryNews: MercuryNews(isLooped); runSpecialProcess = true; break;
  168. case DOMAIN.WashingtonPost: WashingtonPost(); runSpecialProcess = true; break;
  169. }
  170. }
  171.  
  172. if (runSpecialProcess) {
  173. startingRemovalMessage('The Assassinate Ad Block Blockers script is doing its jobs. Please wait a few seconds. 🚦');
  174.  
  175. $('script').remove();
  176. $('iframe').remove();
  177. $('#Injected-By-Assassinate-Ad-Block-Blockers').remove();
  178. RemoveHtmlComments();
  179. $('.fancybox-overlay').remove();
  180.  
  181. successRemovalMessage();
  182. }
  183. }
  184.  
  185. SpecialNinjaJavaScriptKiller();
  186.  
  187. function startingRemovalMessage(message) {
  188. $('body').prepend(`<div id="Injected-By-Assassinate-Ad-Block-Blockers" style="background-color: #D8070E; font-weight: bold; color: white; text-align: center; margin: auto; padding: 10px; position: relative; z-index: 9999999999 !important; top: 220px;"><style>#Injected-By-Assassinate-Ad-Block-Blockers img { width: unset; }</style><img src="https://i.imgur.com/velCxDX.gif" style="display: inline-block; vertical-align: middle;" /> <span>${ message }</span></div>`);
  189. }
  190.  
  191. function successRemovalMessage() {
  192. $('#Injected-By-Assassinate-Ad-Block-Blockers').attr('style','background-color: green; font-weight: bold; color: white; text-align: center; margin: auto; padding: 10px; position: relative; z-index: 9999999999 !important; transition: .5s; top: 220px;');
  193. $('#Injected-By-Assassinate-Ad-Block-Blockers').find('img').attr('src','https://i.imgur.com/i5e5xp0.gif');
  194. $('#Injected-By-Assassinate-Ad-Block-Blockers').find('span').text('Success 😎. Enjoy!');
  195. }
  196.  
  197. /*
  198. * Author: https://stackoverflow.com/a/33366171
  199. * License: Creative Commons, Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
  200. * Beta development
  201. */
  202. function clearCookies() {
  203. var cookies = document.cookie.split("; ");
  204. for (var c = 0; c < cookies.length; c++) {
  205. var d = window.location.hostname.split(".");
  206. while (d.length > 0) {
  207. var cookieBase = encodeURIComponent(cookies[c].split(";")[0].split("=")[0]) + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' + d.join('.') + ' ;path=';
  208. var p = location.pathname.split('/');
  209. document.cookie = cookieBase + '/';
  210. while (p.length > 0) {
  211. document.cookie = cookieBase + p.join('/');
  212. p.pop();
  213. };
  214. d.shift();
  215. }
  216. }
  217. }
  218.  
  219. /*
  220. * Author: https://stackoverflow.com/a/66698063
  221. * License: Creative Commons, Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
  222. * Beta development
  223. */
  224. function clearCookiesVanillaJS() {
  225. document.cookie.replace(
  226. /(?<=^|;).+?(?=\=|;|$)/g,
  227. name => location.hostname
  228. .split(/\.(?=[^\.]+\.)/)
  229. .reduceRight((acc, val, i, arr) => i ? arr[i]='.'+val+acc : (arr[i]='', arr), '')
  230. .map(domain => document.cookie=`${name}=;max-age=0;path=/;domain=${domain}`)
  231. );
  232. }
  233.  
  234. function BreakJavaScript() {
  235. console.log('%c 👍 Assassinate Ad Block Blockers — The following is not an error. Simply a way to abort JavaScript execution on this webpage.', 'background: #0b801d; color: #fff;');
  236. throw new Error('JavaScript purposely broken by Assassinate Ad Block Blockers');
  237. }
  238.  
  239. function RemoveHtmlComments() {
  240. $('*').contents().each(function() {
  241. if (this.nodeType === Node.COMMENT_NODE) $(this).remove();
  242. });
  243. }
  244.  
  245. /* A utility function, for Greasemonkey scripts, that detects and handles DOM mutation.
  246. * Author: https://gist.github.com/BrockA/2625891
  247. * License: Creative Commons, Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
  248. *
  249. * Dependency: jQuery
  250. * Usage example:
  251. * waitForKeyElements (
  252. * "div.comments", commentCallbackFunction
  253. * );
  254. *
  255. * Page-specific function to do what we want when the node is found.
  256. * Usage example:
  257. * function commentCallbackFunction (jNode) {
  258. * jNode.text ("This comment changed by waitForKeyElements().");
  259. * }
  260. *
  261. * selectorTxt <string> Required: The jQuery selector string that specifies the desired element(s).
  262. * actionFunction <string> Required: The code to run when elements are found. It is passed a jNode to the matched element.
  263. * bWaitOnce <bool> Optional: If false, will continue to scan for new elements even after the first match is found.
  264. * iframeSelector <string> Optional: If set, identifies the iframe to search.
  265. */
  266. function waitForTargetElements (selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
  267. let targetNodes, btargetsFound;
  268.  
  269. if (typeof iframeSelector == "undefined")
  270. targetNodes = $(selectorTxt);
  271. else
  272. targetNodes = $(iframeSelector).contents().find(selectorTxt);
  273.  
  274. if (targetNodes && targetNodes.length > 0) {
  275. btargetsFound = true;
  276. // Target node(s) found. Iterate through each and act if they are new.
  277. targetNodes.each ( function () {
  278. let jThis = $(this);
  279. let alreadyFound = jThis.data ('alreadyFound') || false;
  280.  
  281. if (!alreadyFound) {
  282. // Call the payload function
  283. let cancelFound = actionFunction (jThis);
  284. if (cancelFound)
  285. btargetsFound = false;
  286. else
  287. jThis.data ('alreadyFound', true);
  288. }
  289. });
  290. } else {
  291. btargetsFound = false;
  292. }
  293.  
  294. // Get the timer-control variable for this selector
  295. let controlObj = waitForTargetElements.controlObj || {};
  296. let controlKey = selectorTxt.replace (/[^\w]/g, "_");
  297. let timeControl = controlObj [controlKey];
  298.  
  299. // Now set or clear the timer as appropriate
  300. if (btargetsFound && bWaitOnce && timeControl) {
  301. // The only condition where we need to clear the timer
  302. clearInterval (timeControl);
  303. delete controlObj [controlKey];
  304. } else {
  305. // Set a timer, if needed
  306. if ( ! timeControl) {
  307. timeControl = setInterval ( function () {
  308. waitForTargetElements ( selectorTxt, actionFunction, bWaitOnce, iframeSelector);
  309. }, 300);
  310. controlObj [controlKey] = timeControl;
  311. }
  312. }
  313. waitForTargetElements.controlObj = controlObj;
  314. }
  315.  
  316. // Sledgehammer 2.0 prototype
  317. function removeDOMElement(node) { node.remove(); }
  318.  
  319. // General
  320. function standardRemoval() {
  321. const IS_HTML_BLOCKED = $('html').attr('style');
  322. const IS_BODY_BLOCKED = $('body').attr('style');
  323. const IS_HTML_CLASS_BLOCKED = $('html').hasClass('sp-message-open');
  324.  
  325. if (IS_HTML_BLOCKED !== undefined || IS_BODY_BLOCKED !== undefined || IS_HTML_CLASS_BLOCKED)
  326. {
  327. clearInterval(currentStatus1);
  328. // We're on a page that is blocked
  329.  
  330. $('html').removeAttr('style');
  331. $('body').removeAttr('style');
  332. $('html').removeClass('sp-message-open');
  333.  
  334. switch(URL_HOSTNAME)
  335. {
  336. case DOMAIN.VG247:
  337. $('[class*="sp_veil"]').remove();
  338. $('[id*="sp_message_id"]').remove();
  339. break;
  340. }
  341. }
  342.  
  343. console.clear();
  344. }
  345.  
  346. // Site specific
  347. function BusinessInsider() {
  348. $('.tp-modal').remove();
  349. $('.tp-backdrop').remove();
  350. $('body').removeClass('tp-modal-open');
  351. $('.dialog-base').remove();
  352. }
  353. function CNBC(isLooped) {
  354. $('iframe').remove();
  355. $('script').remove();
  356. $('html').removeAttr('style');
  357. $('body').removeAttr('style');
  358. $('#checkout-container').remove();
  359. $('.ArticleGate-proGate').remove();
  360. $("h3:contains('using an adblocker')").parent().parent().parent().parent().remove();
  361.  
  362. if (typeof isLooped !== 'undefined') {
  363. if (!isLooped) {
  364. const ELEMENT = $('.ArticleBody-extraData').find('[class*="-data"]');
  365. const CONTENT_ARRAY = ELEMENT.text().split(' ');
  366. const PARAGRAPH_WORD_COUNT = 100;
  367. const PARENT_ELEMENT = ELEMENT.parents('.ArticleBody-articleBody');
  368. let articleContent = '', index = 0;
  369.  
  370. for (let word of CONTENT_ARRAY) {
  371. articleContent += `${ word } `;
  372. if (index === PARAGRAPH_WORD_COUNT) {
  373. articleContent += '<br/><br/>';
  374. index = 0;
  375. }
  376. index++;
  377. }
  378.  
  379. PARENT_ELEMENT.append(`<div style='line-height: 1.6em;'>${ articleContent }</div>`);
  380. }
  381. }
  382. }
  383. function CNN() {
  384. $('.ad-slot-header').remove();
  385. $('#ad-feedback__modal-overlay').remove();
  386. }
  387. function Curbed() {
  388. $('html').attr('style', 'overflow-y: unset;');
  389. $('body').attr('style', 'position: unset; width: 1100px; margin: 0 auto;');
  390. $('.article .article-header, .article .article-header.inline').attr('style', 'margin: unset;');
  391. $('.article .lede-image-wrapper.inline.horizontal').attr('style', 'margin: unset;');
  392. $('#paywall-reader-interface').remove();
  393. $('#cliff-takeover').remove();
  394. $('.tertiary').attr('style','');
  395. }
  396. function TheCut() {
  397. $('html').removeAttr('style');
  398. $('body').removeAttr('style');
  399. $('#paywall-reader-interface').remove();
  400. $('#cliff-takeover').remove();
  401. $('.tertiary').attr('style','');
  402. BreakJavaScript();
  403. }
  404. function TheDailyBeast() {
  405. $('.tp-modal').remove();
  406. $('.tp-backdrop').remove();
  407. $('body').removeClass('tp-modal-open');
  408. $('[id*="offer-0-"]').remove();
  409. $('[displayname*="PianoTag"]').remove();
  410. $('[src*="tinypass.min.js"]').remove();
  411. $('#piano_bottom_ribbon_wrapper').remove();
  412. $('iframe').remove();
  413. $('body').removeAttr('style');
  414. $('#bottom_ribbon_modal_wrapper').remove();
  415. $('.StoryPage.is-locked').removeClass('is-locked');
  416. $('#bottom_ribbon_modal_expand_wrapper').remove();
  417. $('.PageTopAd').remove();
  418. $('.FooterAd').remove();
  419.  
  420. $('#Injected-By-Assassinate-Ad-Block-Blockers').remove();
  421. console.clear();
  422. console.log('%c 😎 Assassinate Ad Block Blockers — Blocker code removed', 'background: #0b801d; color: #fff;');
  423. }
  424. function DailyMail() {
  425. $('iframe').remove();
  426. $('#chromelessPlayer').remove();
  427. $('.billboard-container.watermark').remove();
  428. $('.adHolder.watermark').remove();
  429. $('.mpu_puff_wrapper.watermark').remove();
  430. $('script').remove();
  431. }
  432. function EuroGamer() {
  433. $('html').removeAttr('style');
  434. $('html').removeClass('sp-message-open');
  435. $('body').removeAttr('style');
  436. $('[class*="sp_veil"]').remove();
  437. $('[id*="sp_message_id"]').remove();
  438. }
  439. function Forbes() {
  440. $('.top-ad-container').remove();
  441. $('.tp-modal').remove();
  442. $('.tp-backdrop.tp-active').remove();
  443. $('body').removeAttr('class');
  444. $('.page-loaded').remove();
  445. $('.article-fixed[_nghost-c11]').attr('style', 'position: unset;');
  446.  
  447. // abnormal situation. these appear on certain pages.
  448. $('#lightboxjs-lightboxlib').remove();
  449. $('#aax_prefetch_frame').remove();
  450. $('#cok_aax').remove();
  451. $('body > iframe:nth-of-type(1)').remove(); // these run in sequence. we want to remove the first 7-9 iframes since iframes typically contain ABB-related injection code or advertisements.
  452. $('body > iframe:nth-of-type(1)').remove();
  453. $('body > iframe:nth-of-type(1)').remove();
  454. $('body > iframe:nth-of-type(1)').remove();
  455. $('body > iframe:nth-of-type(1)').remove();
  456. $('body > iframe:nth-of-type(1)').remove();
  457. $('.fbs-auth__container').remove();
  458. $('.fbs-ad--ntv-contentd-wrapper').remove();
  459. $('.body--no-scroll').attr('style', 'overflow: unset;');
  460. $.each($('script'), function() { // scans all scripts for a very specific paywall script
  461. let selector = $(this).attr('src');
  462. let target = String(selector).match(/(paywall)+.(unlock-protocol)+./g); // the script is found
  463. if (target !== null)
  464. $(this).remove(); // and removed so that it can't re-inject itself
  465. });
  466. $('#article-container-0').attr('style','position: unset;');
  467. }
  468. function Fortune() {
  469. $('[id*="Leaderboard"]').parent().remove();
  470. $('.paywall-selector').remove();
  471. $('[class*="paywall"]').attr('style','');
  472. $.each($('[class*="articleBody__wrapper-"]').find('div'), function() {
  473. const ATTR = $(this).attr('style');
  474. if (typeof ATTR != 'undefined' && ATTR !== false && ATTR.includes('grayscale(0.5) blur'))
  475. $(this).attr('style','');
  476. });
  477. $('.paywall.paywallActive').attr('style','filter: unset; z-index: unset; pointer-events: unset; user-select: unset;');
  478. }
  479. function FoxBusiness() {
  480. $('body').removeAttr('style');
  481. $('.fc-ab-root').remove();
  482. }
  483. function GamesRadar(interval) {
  484. if ($('.raleigh-optin-visible').is(':visible'))
  485. $('[class*="raleigh-optin-"]').remove();
  486.  
  487. if (typeof interval !== 'undefined')
  488. clearInterval(interval);
  489. else
  490. clearAllIntervals();
  491. }
  492. function GameRant() {
  493. $('html').removeAttr('style');
  494. $('body').removeAttr('style');
  495. $("h3:contains('using an adblocker')").parent().parent().parent().parent().remove();
  496. $('.adsninja-ad-zone').remove();
  497. }
  498. function HoustonChronicle() {
  499. $('script').remove();
  500. $('iframe').remove();
  501. $('.fancybox-overlay').remove();
  502. $('.fancybox-lock').removeClass('fancybox-lock');
  503. $('.bc_header').remove();
  504. $.each($('style:last-child'), function() {
  505. if ($(this).attr('id') !== '') {
  506. $(this).remove();
  507. }
  508. });
  509. }
  510. function Inquirer(isLooped) {
  511. // standard stuff
  512. $('script').remove();
  513. $('iframe').remove();
  514. $('[as="script"]').remove();
  515. $('.tp-modal').remove();
  516. $('.tp-backdrop').remove();
  517. $('body').attr('class','');
  518. $('.bx-base').remove();
  519.  
  520. if (!isLooped) {
  521. // clone the article
  522. const CLONED_HEADER = document.querySelector('.layout-ad-wrapper header').cloneNode(true);
  523. CLONED_HEADER.id = 'cloned-header';
  524. $(CLONED_HEADER).appendTo($('#fusion-app'));
  525.  
  526. const CLONED_CONTENT = document.querySelector('[id="main"]').cloneNode(true);
  527. CLONED_CONTENT.id = 'cloned-main';
  528. $(CLONED_CONTENT).appendTo($('#fusion-app'));
  529.  
  530. const CLONED_FOOTER = document.querySelector('.layout-ad-wrapper footer').cloneNode(true);
  531. CLONED_FOOTER.id = 'cloned-footer';
  532. $(CLONED_FOOTER).appendTo($('#fusion-app'));
  533.  
  534. // rename classes and ids to escape site's removal logic
  535. $('#fusion-app').find('div:first').remove();
  536. $('.inq-story').removeClass('inq-story').addClass('inq-story-cloned');
  537. $('#article-body').removeAttr('id').attr('id', 'article-body-cloned');
  538. $('.inq-p').removeClass('inq-p').addClass('inq-cloned');
  539. $('.lazyload-placeholder').removeAttr('class').addClass('lazyload-placeholder-cloned');
  540.  
  541. // polish and clean-up
  542. const CSS_STYLES = `<style>
  543. .inq-image.hidden-inq-image { visibility: visible; }
  544. .type-interstitial.inq-cloned { margin: 40px 0; }
  545. .inq-image--wrapper { margin-top: 20px; }
  546. .inq-cloned { padding: 15px 0; }
  547. </style>`;
  548.  
  549. $('#fusion-app').prepend(CSS_STYLES);
  550. }
  551. }
  552. function Insider() {
  553. $('.tp-modal').remove();
  554. $('.tp-backdrop.tp-active').remove();
  555. $('body').removeAttr('class');
  556. }
  557. function KelleyBlueBook() {
  558. $('#WhitelistOverlayModalBackground').remove();
  559. $('html').removeAttr('class');
  560. }
  561. function LATimes() {
  562. $('html').attr('style','overflow: unset;');
  563. $('body').removeAttr('style');
  564. $('.Page-body').removeAttr('style');
  565. $('.fc-ab-root').remove();
  566. $('.meter-modal').parent().remove();
  567. $('metering-modal').remove();
  568. $('modality-custom-element').remove();
  569. }
  570. function MakeUseOf() {
  571. $('[class*="unblockplease-overlay"]').remove();
  572. $('.unblockplease').removeAttr('style');
  573. $('.adsninja-ad-zone').remove();
  574. }
  575. function MedPageToday() {
  576. $('script').remove();
  577. $('noscript').remove();
  578. $('iframe').remove();
  579. $('[as="script"]').remove();
  580. $('body').attr('class','');
  581. $('.mpt-registration-html').remove();
  582. $('#siteWrapper').removeAttr('style').attr('style', `margin-top: 40px;`);
  583. $('.recirc-item__img-container').attr('style','margin-right: 20px;');
  584. $('.leaderboard-region').remove();
  585. }
  586. function MercuryNews(isLooped) {
  587. $('script').remove();
  588. $('iframe').remove();
  589. $('[as="script"]').remove();
  590. $('body').attr('class','');
  591. $('.modal-scrollable').remove();
  592. $('.connext-modal-backdrop.fade').remove();
  593.  
  594. if (!isLooped) {
  595. // clone the article
  596. const CLONED_CONTENT = document.querySelector('[id="main"]').cloneNode(true);
  597. CLONED_CONTENT.id = 'main-cloned';
  598. $(CLONED_CONTENT).appendTo($('#primary'));
  599.  
  600. // rename classes and ids to escape site's removal logic
  601. $('#primary').find('main:first').remove();
  602. $('#main-cloned').removeAttr('class').removeAttr('role');
  603. $('[id*="post-"]').removeAttr('id').attr('id', 'cloned-post').removeAttr('class').addClass('full-view');
  604. $('.article-content').removeAttr('class').addClass('cloned-a-content');
  605. $('.article-footer').removeAttr('class').addClass('cloned-a-footer');
  606. $('.article-content-wrapper').removeAttr('class').addClass('cloned-a-content-wrapper');
  607. $('.header-features.hide').removeAttr('class').addClass('cloned-h-features');
  608. $('.article-body').removeAttr('class').addClass('cloned-a-body');
  609. $('.body-copy').removeAttr('class').addClass('cloned-b-copy');
  610.  
  611. // polish and clean-up
  612. const CSS_STYLES = `<style>
  613. .cloned-e-header { border-bottom: 3px solid transparent; display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; float: none; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; margin: 2em 0em -2.25em; padding: 0; position: relative; }
  614. .cloned-a-content { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; column-gap: 20px; }
  615. .cloned-a-content-wrapper,
  616. .cloned-a-body { width: 95%; text-align: justify; }
  617. .cloned-h-features { width: 95%; padding: 3em 0em 2em; }
  618. .cloned-b-body { margin-bottom: 0; font: normal 400 1.03125em/1.6363636364 "Droid Sans",Helvetica,sans-serif; letter-spacing: -0.01em; }
  619. .cloned-b-copy { font: normal 400 1em/1.7142857143 Droid Sans,Helvetica,sans-serif; }
  620. .cloned-b-copy > * { margin-bottom: 1em; }
  621. .related.left { width: 33%; }
  622. div.dfm-trust-indicators-footer-links { clear: both; }
  623. </style>`;
  624. $('#primary').prepend(CSS_STYLES);
  625. }
  626. }
  627. function MetroUK() {
  628. $('script').remove();
  629. $('iframe').remove();
  630. $('[class*="mol-ads-"]').remove();
  631. $('[id*="mol-ads-"]').remove();
  632. $('[class*="overlay-34_Kj"]').parent().parent().remove();
  633. $('body').removeClass('mol-fe-ab-dialog');
  634. }
  635. function NationalGeographic() {
  636. $('.fancybox-overlay').remove();
  637. $('#paywall-meter').remove();
  638. $('html').removeClass('fancybox-lock');
  639. $('body').removeAttr('style');
  640. $('.Modal.PaywallModal').remove();
  641. $('.Modal.EmailStickyFooter__Modal').parent().parent().remove();
  642.  
  643. $('#Injected-By-Assassinate-Ad-Block-Blockers').remove();
  644. console.clear();
  645. console.log('%c 😎 Assassinate Ad Block Blockers — Blocker code removed', 'background: #0b801d; color: #fff;');
  646. }
  647. function NBCNews() {
  648. $('html').attr('style','');
  649. $('body').attr('style','');
  650. $.each($('h3'), function() {
  651. const str = $(this).text();
  652. if (~str.indexOf('Please support our journalism')) {
  653. $(this).parent().parent().parent().parent().remove();
  654. }
  655. });
  656. }
  657. function NewYorker() {
  658. $('iframe').remove();
  659. $('script').remove();
  660. $('[class*="PersistentBottomWrapper"]').remove();
  661.  
  662. clearCookiesVanillaJS();
  663. BreakJavaScript();
  664. }
  665. function NewYorkTimes() {
  666. // nytimes
  667. if (window.location.pathname.includes('/slideshow/')) {
  668. if (okayToProcess) {
  669. $('#gateway-content').remove();
  670. $('div#app > div > div > [class*="css-"]:last-child').remove();
  671. okayToProcess = false;
  672. }
  673. } else {
  674. $('#standalone-footer').remove();
  675. $('#gateway-content').remove();
  676. $('body').attr('style', 'overflow: unset;');
  677. $('#site-content').attr('style','position: unset;');
  678. $('[id*="lire-ui-"]').remove();
  679.  
  680. // nytimes' cooking
  681. $('[class*="modal_modal-window-container"]').parent().remove();
  682. $('body').attr('class','').attr('style','');
  683. $('[class*="mask_no-scroll"]').attr('class','');
  684. $('.nytc---modal-window---windowContainer').parents('#appContainer').remove(); // a modal with no close button. wtf nyt?!
  685. $('#container').attr('style','overflow: unset;');
  686. $('.nytc---modal-window---noScroll').attr('style','overflow: unset;');
  687. $('#site-content').attr('style','position: unset;');
  688. $('[class*="ad-unit"]').remove();
  689.  
  690. // nytimes' magazine and site-wide
  691. $('[class*="css-mcm"]').attr('style','position: unset;');
  692.  
  693. if (window.location.pathname !== '/')
  694. $('div#app > div > div > [class*="css-"]:last-child').remove();
  695. }
  696. }
  697. function NYMag() {
  698. $('html').removeAttr('style');
  699. $('body').removeAttr('style');
  700. $('#paywall-reader-interface').remove();
  701. $('#cliff-takeover').remove();
  702. $('.tertiary').attr('style','');
  703. BreakJavaScript();
  704. }
  705. function RottenTomatoes() {
  706. $('html').attr('style','');
  707. $('body').attr('style','');
  708. $.each($('h3'), function() {
  709. const str = $(this).text();
  710. if (~str.indexOf('Welcome to Rotten Tomatoes! Please support us by allowing ads')) {
  711. $(this).parent().parent().parent().parent().remove();
  712. }
  713. });
  714. }
  715. function SFChronicle() {
  716. HDN = {};
  717. COMSCORE = {};
  718. $('script').remove();
  719. $('iframe').remove();
  720.  
  721. $('.fancybox-overlay').remove();
  722. $('html').removeAttr('class').attr('style','overflow: unset;');
  723. $('.bcSlideOut').remove();
  724. $('body').attr('style', 'overflow: unset !important; position: unset;');
  725.  
  726. $('.fancybox-lock').removeClass('fancybox-lock');
  727. $('.bc_header').remove();
  728.  
  729. $('html').css('overflow', 'unset');
  730.  
  731. $.each($('style:last-child'), function() {
  732. if ($(this).attr('id') !== '') {
  733. $(this).remove();
  734. }
  735. });
  736. }
  737. function SFGate() {
  738. $('html').removeAttr('style');
  739. $('body').removeAttr('style');
  740. $("h3:contains('Whitelist SFGATE to keep reading')").parent().parent().parent().parent().remove();
  741. }
  742. function Vulture() {
  743. $('html').removeAttr('style');
  744. $('body').removeAttr('style');
  745. $('#paywall-reader-interface').remove();
  746. $('#cliff-takeover').remove();
  747. $('.tertiary').attr('style','');
  748. }
  749. function WashingtonPost() {
  750. $('html').removeAttr('style');
  751. $('body').removeAttr('style');
  752. $('script').remove();
  753. $('iframe').remove();
  754. $('[as="script"]').remove();
  755.  
  756. $('[data-qa*="paywall"]').remove();
  757. $('[rel*="apple-touch-icon"]').last().next().next().remove();
  758. $('[rel*="apple-touch-icon"]').last().next().next().remove();
  759. waitForTargetElements('[id*="paywall-"]', removeDOMElement);
  760.  
  761. $('.teaser-content').removeClass('teaser-content');
  762. $('.article-body').removeClass('article-body').addClass('a-body-cloned').removeClass('grid-body').removeAttr('data-qa');
  763. $('p[data-qa]').removeAttr('data-qa').removeAttr('data-el').removeAttr('class');
  764. }
  765. function Wired() {
  766. clearCookiesVanillaJS();
  767. $('.paywall-bar-reg-gate').remove();
  768. $('[class*="PersistentBottomWrapper"]').remove();
  769. $('[class*="StickyHeroAdWrapper-"').remove();
  770. }
  771.  
  772. function domStatusCheck() {
  773. if (STANDARD_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1)
  774. standardRemoval();
  775.  
  776. if (AUXILIARY_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1)
  777. {
  778. switch(URL_HOSTNAME)
  779. {
  780. case DOMAIN.GamesRadarAuxiliary:
  781. if (typeof currentStatus2 !== 'undefined')
  782. GamesRadar(currentStatus2);
  783. else
  784. GamesRadar();
  785.  
  786. break;
  787. }
  788. }
  789.  
  790. if (ABNORMAL_BLOCKER_DONAINS.indexOf(URL_HOSTNAME) > -1)
  791. {
  792. switch(URL_HOSTNAME)
  793. {
  794. case DOMAIN.BusinessInsider: BusinessInsider(); break;
  795. case DOMAIN.BusinessInsiderMarkets: BusinessInsider(); break;
  796. case DOMAIN.CNBC: CNBC(isLooped); break;
  797. case DOMAIN.Curbed: Curbed(); false;
  798. case DOMAIN.DailyMail: DailyMail(); break;
  799. case DOMAIN.EuroGamer: EuroGamer(); break;
  800. case DOMAIN.Forbes: Forbes(); break;
  801. case DOMAIN.Fortune: Fortune(); break;
  802. case DOMAIN.FoxBusiness: FoxBusiness(); break;
  803. case DOMAIN.GameRant: GameRant(); break;
  804. case DOMAIN.Insider: Insider(); break;
  805. case DOMAIN.LATimes: LATimes(); break;
  806. case DOMAIN.MakeUseOf: MakeUseOf(); break;
  807. case DOMAIN.MercuryNews: MercuryNews(isLooped); break;
  808. case DOMAIN.MetroUK: MetroUK(); break;
  809. case DOMAIN.NBCNews: NBCNews(); break;
  810. case DOMAIN.NewYorker: NewYorker(); break;
  811. case DOMAIN.NewYorkTimes: NewYorkTimes(); break;
  812. case DOMAIN.NewYorkTimesCooking: NewYorkTimes(); break;
  813. case DOMAIN.NYMag: NYMag(); break;
  814. case DOMAIN.RottenTomatoes: RottenTomatoes(); break;
  815. case DOMAIN.SFGate: SFGate(); break;
  816. case DOMAIN.TheCut: TheCut(); break;
  817. case DOMAIN.Vulture: Vulture(); break;
  818. case DOMAIN.WashingtonPost: WashingtonPost(); break;
  819. case DOMAIN.Wired: Wired(); break;
  820. }
  821. isLooped = true;
  822. }
  823.  
  824. RemoveHtmlComments();
  825.  
  826. }
  827.  
  828. // Sledgehammer 1.0
  829. function sledgeHammerRemoval() {
  830. const REPEAT_INTERVAL = 1500; // 1.5 seconds
  831. switch (URL_HOSTNAME)
  832. {
  833. case DOMAIN.TheDailyBeast: successRemovalMessage(); setTimeout(function() { TheDailyBeast(); }, REPEAT_INTERVAL); break;
  834. case DOMAIN.HoustonChronicle: successRemovalMessage(); setTimeout(function() { HoustonChronicle(); }, REPEAT_INTERVAL); break;
  835. case DOMAIN.Inquirer: successRemovalMessage(); setTimeout(function() { Inquirer(isLooped); }, REPEAT_INTERVAL); break;
  836. case DOMAIN.KelleyBlueBook: successRemovalMessage(); setTimeout(function() { KelleyBlueBook(); }, REPEAT_INTERVAL); break;
  837. case DOMAIN.MedPageToday: successRemovalMessage(); setTimeout(function() { MedPageToday(); }, REPEAT_INTERVAL); break;
  838. case DOMAIN.NationalGeographic: successRemovalMessage(); setTimeout(function() { NationalGeographic(); }, REPEAT_INTERVAL); break;
  839. case DOMAIN.SFChronicle: successRemovalMessage(); setTimeout(function() { SFChronicle(); }, REPEAT_INTERVAL); break;
  840. }
  841. isLooped = true;
  842. }
  843.  
  844. sledgeHammerRemoval();
  845.  
  846. function displayMessage(domain) {
  847. return console.log(`%c 🚦 Assassinate Ad Block Blockers Clear interval pass for ${ domain } then pause for a few seconds...`, 'background: #FFBF01; color: #222;');
  848. }
  849.  
  850. // Periodicially clear everything and pause for a few seconds, then start again. Not as agreesive as Sledgehammer function
  851. function clearAllIntervals() {
  852. successRemovalMessage();
  853. setTimeout(function() {
  854. console.clear();
  855.  
  856. if (URL_HOSTNAME != DOMAIN.TheDailyBeast)
  857. {
  858. switch(URL_HOSTNAME)
  859. {
  860. case DOMAIN.BusinessInsider: displayMessage(DOMAIN.BusinessInsider); BusinessInsider(); break;
  861. case DOMAIN.BusinessInsiderMarkets: displayMessage(DOMAIN.BusinessInsiderMarkets); BusinessInsider(); break;
  862. case DOMAIN.CNBC: displayMessage(DOMAIN.CNBC); CNBC(); break;
  863. case DOMAIN.Curbed: displayMessage(DOMAIN.Curbed); Curbed(); break;
  864. case DOMAIN.CNN: displayMessage(DOMAIN.CNN); CNN(); break;
  865. case DOMAIN.DailyMail: displayMessage(DOMAIN.DailyMail); DailyMail(); break;
  866. case DOMAIN.EuroGamer: displayMessage(DOMAIN.EuroGamer); EuroGamer(); break;
  867. case DOMAIN.Forbes: displayMessage(DOMAIN.Forbes); Forbes(); break;
  868. case DOMAIN.FoxBusiness: displayMessage(DOMAIN.FoxBusiness); FoxBusiness(); break;
  869. case DOMAIN.Fortune: displayMessage(DOMAIN.Fortune); Fortune(); break;
  870. case DOMAIN.GameRant: displayMessage(DOMAIN.GameRant); GameRant(); break;
  871. case DOMAIN.Insider: displayMessage(DOMAIN.Insider); Insider(); break;
  872. case DOMAIN.LATimes: displayMessage(DOMAIN.LATimes); LATimes(); break;
  873. case DOMAIN.MakeUseOf: displayMessage(DOMAIN.MakeUseOf); MakeUseOf(); break;
  874. case DOMAIN.MercuryNews: displayMessage(DOMAIN.MercuryNews); MercuryNews(isLooped); break;
  875. case DOMAIN.MetroUK: displayMessage(DOMAIN.MetroUK); MetroUK(); break;
  876. case DOMAIN.NBCNews: displayMessage(DOMAIN.NBCNews); NBCNews(); break;
  877. case DOMAIN.NewYorker: displayMessage(DOMAIN.NewYorker); NewYorker(); break;
  878. case DOMAIN.NewYorkTimes: displayMessage(DOMAIN.NewYorkTimes); NewYorkTimes(); break;
  879. case DOMAIN.NewYorkTimesCooking: displayMessage(DOMAIN.NewYorkTimesCooking); NewYorkTimes(); break;
  880. case DOMAIN.NYMag: displayMessage(DOMAIN.NYMag); NYMag(); break;
  881. case DOMAIN.RottenTomatoes:
  882. case DOMAIN.RottenTomatoesEditorial: displayMessage(DOMAIN.RottenTomatoes); RottenTomatoes(); break;
  883. case DOMAIN.SFGate: displayMessage(DOMAIN.SFGate); SFGate(); break;
  884. case DOMAIN.TheCut: displayMessage(DOMAIN.TheCut); TheCut(); break;
  885. case DOMAIN.Vulture: displayMessage(DOMAIN.Vulture); Vulture(); break;
  886. case DOMAIN.WashingtonPost: displayMessage(DOMAIN.WashingtonPost); WashingtonPost(); break;
  887. case DOMAIN.Wired: displayMessage(DOMAIN.Wired); Wired(); break;
  888. }
  889.  
  890. clearInterval('SledgehammerRemoval');
  891. console.log('%c 👍 Assassinate Ad Block Blockers — Sledgehammer interval cleared', 'background: #0b801d; color: #fff;');
  892. }
  893.  
  894. if (currentStatus1 !== undefined) currentStatus1 = undefined;
  895. if (currentStatus2 !== undefined) currentStatus2 = undefined;
  896. if (currentStatus3 !== undefined) currentStatus3 = undefined;
  897. if (currentStatus4 !== undefined) currentStatus4 = undefined;
  898. if (currentStatus5 !== undefined) currentStatus5 = undefined;
  899. if (currentStatus6 !== undefined) currentStatus6 = undefined;
  900. if (currentStatus7 !== undefined) currentStatus7 = undefined;
  901. if (currentStatus8 !== undefined) currentStatus8 = undefined;
  902. if (currentStatus9 !== undefined) currentStatus9 = undefined;
  903. if (currentStatus10 !== undefined) currentStatus10 = undefined;
  904. if (CI !== undefined) CI = undefined;
  905.  
  906. console.log('%c 😎 Assassinate Ad Block Blockers — All intervals cleared', 'background: #0b801d; color: #fff;');
  907.  
  908. $('#Injected-By-Assassinate-Ad-Block-Blockers').remove();
  909. }, 1500); // Wait 1.5 seconds for the success animation to finish
  910. }
  911.  
  912. const PROCESSING_MESSAGE = 'The Assassinate Ad Block Blockers script is doing its jobs. Please wait a few seconds. 🚦';
  913.  
  914. startingRemovalMessage(PROCESSING_MESSAGE);
  915.  
  916. // Sets up listeners to supercede any blocker shenanigans
  917. if (STANDARD_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1) currentStatus1 = setTimeout(domStatusCheck, 50); // deepscan-disable-line
  918. if (AUXILIARY_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus2 = setTimeout(domStatusCheck, 50); } // deepscan-disable-line
  919.  
  920. // Second pass after 1.5 seconds
  921. if (STANDARD_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus3 = setTimeout(domStatusCheck, 1500); } // deepscan-disable-line
  922. if (ABNORMAL_BLOCKER_DONAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus4 = setTimeout(domStatusCheck, 1500); } // deepscan-disable-line
  923.  
  924. // Third pass after 2.5 seconds
  925. if (STANDARD_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus5 = setTimeout(domStatusCheck, 2500); } // deepscan-disable-line
  926. if (ABNORMAL_BLOCKER_DONAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus6 = setTimeout(domStatusCheck, 2500); } // deepscan-disable-line
  927.  
  928. // Fourth pass after 5.5 seconds
  929. if (STANDARD_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus7 = setTimeout(domStatusCheck, 5500); } // deepscan-disable-line
  930. if (ABNORMAL_BLOCKER_DONAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus8 = setTimeout(domStatusCheck, 5500); } // deepscan-disable-line
  931.  
  932. // Fifth pass after 7 seconds
  933. if (STANDARD_BLOCKER_DOMAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus9 = setTimeout(domStatusCheck, 7000); } // deepscan-disable-line
  934. if (ABNORMAL_BLOCKER_DONAINS.indexOf(URL_HOSTNAME) > -1) { currentStatus10 = setTimeout(domStatusCheck, 7000); } // deepscan-disable-line
  935.  
  936. // Last-pass guarantee after 7.05 seconds (We want this to fire immediately after the fifth pass)
  937. let CI = setTimeout(clearAllIntervals, 7050);
  938.  
  939. // Perpetual check and removal every 2.5 seconds - The Peter Gabriel Sledgehammer Special
  940. if (ABNORMAL_BLOCKER_DONAINS.indexOf(URL_HOSTNAME) > -1) { setInterval(sledgeHammerRemoval, 2500); }
  941.  
  942. console.clear();
  943. }
  944.  
  945. // Load jQuery and then execute the main function
  946. addJQuery(main);

QingJ © 2025

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