From e1cbd1c283b294ae453b4ee15c9596c1930ba32f Mon Sep 17 00:00:00 2001 From: SukkaW Date: Thu, 8 Dec 2022 23:24:27 +0800 Subject: [PATCH] Add sukka_enhance_adblock.sgmodule --- Assets/www-google-analytics-com_analytics.js | 88 +++++++++++++++ Assets/www-google-analytics-com_ga.js | 107 +++++++++++++++++++ Modules/sukka_enhance_adblock.sgmodule | 10 ++ 3 files changed, 205 insertions(+) create mode 100644 Assets/www-google-analytics-com_analytics.js create mode 100644 Assets/www-google-analytics-com_ga.js create mode 100644 Modules/sukka_enhance_adblock.sgmodule diff --git a/Assets/www-google-analytics-com_analytics.js b/Assets/www-google-analytics-com_analytics.js new file mode 100644 index 00000000..4980ee5a --- /dev/null +++ b/Assets/www-google-analytics-com_analytics.js @@ -0,0 +1,88 @@ +(function () { + 'use strict'; + // https://developers.google.com/analytics/devguides/collection/analyticsjs/ + const noopfn = function () { + }; + // + const Tracker = function () { + }; + const p = Tracker.prototype; + p.get = noopfn; + p.set = noopfn; + p.send = noopfn; + // + const w = window; + const gaName = w.GoogleAnalyticsObject || 'ga'; + const gaQueue = w[gaName]; + const ga = function () { + const len = arguments.length; + if (len === 0) { return; } + const args = Array.from(arguments); + let fn; + let a = args[len - 1]; + if (a instanceof Object && typeof a.hitCallback === 'function') { + fn = a.hitCallback; + } else if (a instanceof Function) { + fn = () => { a(ga.create()); }; + } else { + const pos = args.indexOf('hitCallback'); + if (pos !== -1 && typeof args[pos + 1] === 'function') { + fn = args[pos + 1]; + } + } + if (typeof fn !== 'function') { return; } + try { + fn(); + } catch (ex) { + } + }; + ga.create = function () { + return new Tracker(); + }; + ga.getByName = function () { + return new Tracker(); + }; + ga.getAll = function () { + return [new Tracker()]; + }; + ga.remove = noopfn; + // https://github.com/uBlockOrigin/uAssets/issues/2107 + ga.loaded = true; + w[gaName] = ga; + // https://github.com/gorhill/uBlock/issues/3075 + const dl = w.dataLayer; + if (dl instanceof Object) { + if (dl.hide instanceof Object && typeof dl.hide.end === 'function') { + dl.hide.end(); + dl.hide.end = () => { }; + } + if (typeof dl.push === 'function') { + const doCallback = function (item) { + if (item instanceof Object === false) { return; } + if (typeof item.eventCallback !== 'function') { return; } + setTimeout(item.eventCallback, 1); + item.eventCallback = () => { }; + }; + dl.push = new Proxy(dl.push, { + apply: function (target, thisArg, args) { + doCallback(args[0]); + return Reflect.apply(target, thisArg, args); + } + }); + if (Array.isArray(dl)) { + const q = dl.slice(); + for (const item of q) { + doCallback(item); + } + } + } + } + // empty ga queue + if (typeof gaQueue === 'function' && Array.isArray(gaQueue.q)) { + const q = gaQueue.q.slice(); + gaQueue.q.length = 0; + for (const entry of q) { + ga(...entry); + } + } +})(); diff --git a/Assets/www-google-analytics-com_ga.js b/Assets/www-google-analytics-com_ga.js new file mode 100644 index 00000000..a98e00ce --- /dev/null +++ b/Assets/www-google-analytics-com_ga.js @@ -0,0 +1,107 @@ +(function () { + 'use strict'; + const noopfn = function () { + }; + // + const Gaq = function () { + }; + Gaq.prototype.Na = noopfn; + Gaq.prototype.O = noopfn; + Gaq.prototype.Sa = noopfn; + Gaq.prototype.Ta = noopfn; + Gaq.prototype.Va = noopfn; + Gaq.prototype._createAsyncTracker = noopfn; + Gaq.prototype._getAsyncTracker = noopfn; + Gaq.prototype._getPlugin = noopfn; + Gaq.prototype.push = function (a) { + if (typeof a === 'function') { + a(); return; + } + if (Array.isArray(a) === false) { return; } + // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link + if ( + typeof a[0] === 'string' && + /(^|\.)_link$/.test(a[0]) && + typeof a[1] === 'string' + ) { + try { + window.location.assign(a[1]); + } catch (ex) { + } + } + if (a[0] === '_set' && a[1] === 'hitCallback' && typeof a[2] === 'function') { + a[2](); + } + }; + // + const tracker = (function () { + const out = {}; + const api = [ + '_addIgnoredOrganic _addIgnoredRef _addItem _addOrganic', + '_addTrans _clearIgnoredOrganic _clearIgnoredRef _clearOrganic', + '_cookiePathCopy _deleteCustomVar _getName _setAccount', + '_getAccount _getClientInfo _getDetectFlash _getDetectTitle', + '_getLinkerUrl _getLocalGifPath _getServiceMode _getVersion', + '_getVisitorCustomVar _initData _linkByPost', + '_setAllowAnchor _setAllowHash _setAllowLinker _setCampContentKey', + '_setCampMediumKey _setCampNameKey _setCampNOKey _setCampSourceKey', + '_setCampTermKey _setCampaignCookieTimeout _setCampaignTrack _setClientInfo', + '_setCookiePath _setCookiePersistence _setCookieTimeout _setCustomVar', + '_setDetectFlash _setDetectTitle _setDomainName _setLocalGifPath', + '_setLocalRemoteServerMode _setLocalServerMode _setReferrerOverride _setRemoteServerMode', + '_setSampleRate _setSessionTimeout _setSiteSpeedSampleRate _setSessionCookieTimeout', + '_setVar _setVisitorCookieTimeout _trackEvent _trackPageLoadTime', + '_trackPageview _trackSocial _trackTiming _trackTrans', + '_visitCode' + ].join(' ').split(/\s+/); + for (const method of api) { + out[method] = noopfn; + } + out._getLinkerUrl = function (a) { + return a; + }; + // https://github.com/AdguardTeam/Scriptlets/issues/154 + out._link = function (a) { + if (typeof a !== 'string') { return; } + try { + window.location.assign(a); + } catch (ex) { + } + }; + return out; + })(); + // + const Gat = function () { + }; + Gat.prototype._anonymizeIP = noopfn; + Gat.prototype._createTracker = noopfn; + Gat.prototype._forceSSL = noopfn; + Gat.prototype._getPlugin = noopfn; + Gat.prototype._getTracker = function () { + return tracker; + }; + Gat.prototype._getTrackerByName = function () { + return tracker; + }; + Gat.prototype._getTrackers = noopfn; + Gat.prototype.aa = noopfn; + Gat.prototype.ab = noopfn; + Gat.prototype.hb = noopfn; + Gat.prototype.la = noopfn; + Gat.prototype.oa = noopfn; + Gat.prototype.pa = noopfn; + Gat.prototype.u = noopfn; + const gat = new Gat(); + window._gat = gat; + // + const gaq = new Gaq(); + (function () { + const aa = window._gaq || []; + if (Array.isArray(aa)) { + while (aa[0]) { + gaq.push(aa.shift()); + } + } + })(); + window._gaq = gaq.qf = gaq; +})(); diff --git a/Modules/sukka_enhance_adblock.sgmodule b/Modules/sukka_enhance_adblock.sgmodule new file mode 100644 index 00000000..c653cd39 --- /dev/null +++ b/Modules/sukka_enhance_adblock.sgmodule @@ -0,0 +1,10 @@ +#!name=[Sukka] Enhance Better ADBlock for Surge +#!desc=增强 ADBlock 效果、恢复网站正常功能 +# Use Build/build.js to generate the list + +[MITM] +hostname = %APPEND% *.google-analytics.com + +[URL Rewrite] +^.+\.google-analytics\.com/analytics\.js https://ruleset.skk.moe/Assets/www-google-analytics-com_analytics.js 302 +^.+\.google-analytics\.com/ga\.js https://ruleset.skk.moe/Assets/www-google-analytics-com_ga.js 302