Clean all tracking URLs, block tracking events on all websites
// ==UserScript== // @name 跟踪链接净化 // @name:zh-CN 跟踪链接净化 // @name:zh-TW 跟蹤鏈接凈化 // @name:en Clean Tracking URLs // @name:ja トラッカーの浄化 // @name:ko 추적 URL 정리 // @name:ru Очистить ссылки отслеживания // @name:de Tracking-URLs bereinigen // @name:fr Nettoyer les URLs de suivi // @name:es Limpiar URLs de seguimiento // @namespace https://github.com/cilxe/JavaScriptProjects // @author cilxe // @version 0.7.8 // @description 净化所有网站上的跟踪链接和事件 // @description:zh-CN 净化所有网站上的跟踪链接和事件 // @description:zh-TW 凈化網際網路上的所有網站鏈接和事件 // @description:en Clean all tracking URLs, block tracking events on all websites // @description:ja すべてのサイトの追跡リンクとイベントをサニタイズする // @description:ko 모든 추적 URL 정리, 모든 웹사이트에서 추적 이벤트 차단 // @description:ru Очистить все ссылки отслеживания, заблокировать события отслеживания на всех веб-сайтах // @description:de Alle Tracking-URLs bereinigen, Tracking-Ereignisse auf allen Websites blockieren // @description:fr Nettoyer toutes les URLs de suivi, bloquer les événements de suivi sur tous les sites // @description:es Limpiar todas las URLs de seguimiento, bloquear eventos de seguimiento en todos los sitios web // @match *://*/* // @exclude /^https?:\/\/([a-z0-9-.]{0,52})(hdslb.com|csdnimg.cn)\/.*$/ // @run-at document-start // @grant GM_registerMenuCommand // @grant GM_getValue // @grant GM_setValue // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAOoklEQVR4nO2be1RTd7bHU3XddhRISAAJhJAA7ap6p9apbdE6fY2dejsz7R29VssrCILSChba22LnVsb6Lj54JpAEedVOZdqOEEQtdbAFReujPiu67Lr3CuGRnHNyfodHCEnYdx01es5JAuGlvavda+Uf2Dnn/D75nd9v7+/ePx7vF/vFJtSmvwPTJOk9i8Rv93wgzugtD3qPuijJ7EZB71P2wPe7IXAdBYF/Qfbg9QgFZqELAR+SZf7ryXX+G8iXp2d3TOP9fzTp2z3ikNS+jOA0c1PQ2t6B4Lf7ICi9F4IyekH8bg+I/7MHxO91gwPA9A8omP4XBAEfIghYT0JAFgn+fzWB/wZ8QPQR0ej3EZbu/3FXIO+nbsEp5hdCUswHJGv6bJJUMwSnmSF4bR+MGsBHBPhtJMBvEw6iTZhNuAWrFW01Ps/7qZk0ybxQsqr/WEhKP4S82Q+SNWYYdwCbcRBtxUC0DQPhNmOTKNv44v0eN0+yqjdYmty/T7rKAiGr+8EdAOn7vRC+qRtm7uyGx1UUPKmlTnABLKw0nVxYTsICLQm/KSBBvm0IANuNIPzYCILsrk/9dhnE92XwoUmW5SErLUiabAFXAELWmC+GbaGoGUUIHtuDYE4ZgifKSNvTlWgtD+ABLgD6b0u+MKUvqyZsMToTxB8wQUy1CV4oJZD/ZuySKwC+Owzgu7OL5O80LL13A1fAQ9IES1HoygGQJg0AG4B5UPKmuSY4tTfyYQ1ZN0OLYFaJAwBpn1uOYh3XcQJw25ZWE4poHWGnASQdNEHKYQJSv8J1vlvwecKtmE601TjIBmAAwa4u4O/uLOTlXntwQgcflgx86YqBhtDEAXAGYD4Zkjww96afmvrzIxoELACl6K/Ma7kDQFu0zrSRCSCtnoCMI8Sr9P+E27CnfLcZTnEBCHZ3gSCn84gwF/OZmMHHQIBshfX70AQrsAAk9fdJV5nX8LJgEu33XBZMCVeTV5gAfr2HbFxaBZM9BfBcA0yJP2A6zgFw+c41smCSMNuQJthhMLMA5HaCT17H2WnKjoDxHXwy8GXxtu9lK6zABBCSNNASnGh5jOkrL6ZWRqgROADM1JK2fy0jWD7DAaBNUWt6POkgYXMAeOcIAR8cxRKYPvyPux733dl1jQmAn9cJPvkdZ8dtJoQq4CFZnK1BFm8DFoBES2OoAgRcf3kxeZEJYJYWFbu67nAAaFtZR2iYANYdxc9xfXx2kkL+rs5jTAD8/A7wLmg/Mi5rgjzWWiRT2IAJQJpoqZOkw6+4vrJi6rmwYgR3AGhI26wyMny0AFbUkmGrD+HWuwAI+PBb/BmnaxXrp/J3dx5kAvAp7ABvpb5wTIOXRdtel8fZgAlAusLaPD0GXMbo0iL0KRPAo1r0mbtrewKAtpRDRBUTwPpGvNKVn2TnjV/xczsamQB8lO3go9RHjWrwkjgIlsXaEBNAaLy1xdW0py0iFx6UqhDFmgEl5MKxAlj9Ff4yGwDRndXw3w+58vXZeUPIz+u4xgTgpdSTU4v/Z+TBkjzGvk8ea4e7AKzm0ATLHHf+wSr0SmgRAgeAh9Wknkev2lkwaXZZb/DsUuqZuaWmJZGVSLFgL5nMBfCnz8nkJV8SitdrTEtiavH5CfuNQVlZMIle+dPqCb0DQFYjAZsa8X9z9xy###7HfPI7+hwAvFXt4KVq2zuywUfBQnmMHZgApArbW0N9R6JERUwAj6iRaYYG/ThLS1ockeDccgSRlQgWfIKccoFXPydhyZckLKs2gSMSTDpIWFIO4T+mfoWbWACasKKhnkWQ37mWCcC7SA/TNK2eJ1HyaHsTE0CownaKt5S9j9MWWgoPBarQK0FKVBSiQt0sANxAaFQA7sYBTACbj+Hd2c1YUc4p/JVSV69DFkzyLmg/yQTgpdYf92jw4VHwQlj0INwFYB0Mi70V4TnMr4B61r8QfRpYiHrESgTBKgQhKgT3EABkn8Ah9xQOqtN4d8k5bG/leeK3zGf0VnZG+hTqBx0AvNV68NLeeHb4Xz/KfoAJQBZnq7lNdYpvPrVSlI8u+hdQEFCIILAQgScAfr2HNM4pI4/NLSdrn65EVc9UIrUTgL+TxYu/MO17vdpUHaMzNcXXEl0eATiDQ8k5HD65gEPVJeOFf7RgiQ0NMIV+ZJ9CfR0TwDRNq27IwUujQSyPsluZAEIVA5H8HOrP/Fx0RZhPgSifguEAhKvR4YfVKO5RNYqcqSGFo90FFP8wCVLqjE+m1RNR73xNHBoWwGUM9rdgUNNi/KG6xfiad2HbfNYM0LRahwyTZcvg3bCoQXAAkMXaLvBzqTpBHgX0xxWAQCWpD1Ihgj0DyOjhZpqn26DD3qknFGwAGJHzHa53BUB39danpgWrFRTpL98F0AbTtK1r3d5EvtzexAQQmNlH8W8PngUgH9n8C9BnAfnkS/RWF6RCPzIByIvJJ8cbwLv1+DwOgOtVVTC58DT2e+05bF/lBczGBUB/Eg93USwAmrZvXN5g5lLwki+3DzABCHZ0AwtAHrIJ81BxgJIMu/PFLJgUpCQtTABhxQR/vAFk1iMRC0AzZsmCWxkobX+7SIZXXcbU+68YbUwAZeeNjFegDby0bf28Yv1UpxuEvwEvh70xCA4A0pVW4OdSdwDw81CjoLDbKauTqHqDmWuAvJjsGm4wowFA27qjOMZcA/LPGIO4Pl9c7Zqtu2psYkJ4uLydCQCmaf73JWcAy+ADJoCgdMttAMjOz0MbbkZ1LiyoEM3nAGiaKACZR4lmJoDdJ/F5rvyqACbXXDV+pGsx2mkA/17TwQIwtaQ10+lLYcuhnAnA/7/6gJ+DbN65d2UsVxZYYPoP9i5A1kwUgHUNxAEmgLzvsMVD+euuYgpdi9GW+s8u9gzQtu5xcpZF2S8yAQg39oAgB7lfMW9boBIp2DMAfTphM6CB2MfaBr8zDvnj0FbTgqVvPWFgAfArvXHeyVEeY6eYAATbu5tppXa4GwQqyRTODNBMIIAS1gw4ha8a7jsA8IDqjPEEE4C4opVycgyLAjsTADcZclKEXKrC96gw4kIV5ipC3GSICUBUdsPuBCB8OcDPBYBXSavzjAv/uQMI+7m/AnLOIui7rfvEKBdBLW/iFkHtaBZB5RnjSdYiWN6GnBxl0fYLTACijT10HJA+im3QrRA6DnHAZyPfBvGMLZxtUFR645zHgZAgBylGFAgVkUPn3GMLhXUjCYSqr2LxHgdC4dxQOIMRCueijbQg4mEofHwCZ8Bx1gw4jUW68qMFEV2LcZMjFH7Nk1A4fLhkKJc6zi/oedyDZMg4UQAyG3DDcMnQ/muGOboWYzMzGYqo4CRDJW3Ocv1jMTBN/obdwtwFfLOd02FRHtL45zKqPS7SYXcq0FgAZDaSvkOlwxWXuiKqLhm1+6/c+tUdn1JP02HawpbbG9mCiBm5E0QCClCVuJD8vStBJEKNXE7NsQBI/xp7ypUgojyNv6z9Hv/7J+cxuytBJOFwF+IIIkfd3kT+BmRwJLGL/FxKN1JJLFyN4sYbQEY9ET1iSewqVu0kiWla09zeJHQpBDqJorED8wT56FV+HrrsqSgaUYwORWjIqFnF5JOzS02C0QJ4qx6JVn+FRabVE4qMr4nDnoqiuhbjpeprhj96FegXcAKhgWF7B8Ki7LUcWfzWtpYFU4S5KEGYj86NQhY3DCeL/+lzUrP4S7Lq9f2muhidqVlRS+AjlsUvY+f2X8FW0III/cjeSv1Bliyubh1eqwiPhue5hRF53MBTTB//POoZ/wKyMrAAUfe9MHIGRyXf4xUVF/H5zGf0Luya7xQKq/Ws4olbC4u2N3JygdOuSmN0RTiwgFx0v0pjuSfxRbnXwLkJogomexd0nGUDGGLx41pYDLzolAwpbGkjLY4+qkXXx1wcPYxf5xZHNx/DVEM9Cz+vPZ2VDKnaBr2K2ocvizFNHm3/GxNAqMLaL423/IY30vI4wANztL1Bc8rRvLnlpsVPV6IY9+VxFLOs2rQ4tgafR5fH6e+6Ko9vOY4vGlF5vKitgjdSk0aDWBZrI1kNEius1ySJIPS0QeJRDeksP49wG3zzEL6I9Qp8S1C5dS6mPf3e57eJ+Hkd11kNEqp209SCUTZay2NtS51aZBKsJ9y2yKjQXk6LTNVYAaQcJj5nrwF4hdsWmZyOJq4e4KVsX8Ibi8nirIVOTVIJloPiZHAKJ0OU1G+5TVIzNWTEWJqkUg7jNlaTVJNzLYBukhLs6jzk3CTVnscbq0WkwoOyONsRF21yx1y9DmHF5AXOLqAeLYCkg4R2uDa5m9N+V1eziza5el7VpX8ZMwDaIqLBRxZvO+skia0cuBa6mt03JFdRidxGyVklxGzeCAHE1pnmcBslMxtMK5g+/B3GJ3x3Gq67kMROi7RGb964t8rGW89yNcGQ5H5zyKr+tY444WarbDH5AysSLCGbRtwqW2tqZsUBXxOX7lyjCiYLtxvSfbMN/S40wdPj3irLnAmhCQNHXImiktXmM8Gre29mgeFq6jUXgdAGTwHE6EybnAKhfxJ/oP/nuw2fL9xuPOu6WbqjXrR9nH95V2tCaIKlwK0qnGI+EJTaN/8RNVnLbZd/ovyuvOYOwLJqU7xTu3w9Xu27kVgg2mo86E4V5u/uzONljdM774lJEy1LQ1ZaSLey+Jq+y/LN3dSMIop1YCKyAqW7OzCx+EtTBvfAxPM3D0zgP7iVxXd0mfi7u4bUBifMpMkgDknu3+vRkZmN3TCDPjKjpOAprekkF8CLFei739FHZjQkzCkgQTbckZnthkHfbEPlT+I0Wegq8/OSVf3f3sPCyDeCbMPIYvt7YZI3+56VpJh1krf6rOMPALMKt2A1ftsNnqW099Omr+4OCH6rf21QqvmboLW9/aMF4LcB7xdtxI/6bcLSpmdN0NY20UaHzOI080vit3syxRm9e8TvUedvHp3NvHt0Vuw4OruePB/wIbnHP4vMDNhAviTOcqPe/mK/GG+87P8A5YmAIqn+ohcAAAAASUVORK5CYII= // @license MIT // ==/UserScript== /* ## Main features - Auto clean up all URLs and block tracking events by default. - Manually clean all links with keyboard shortcuts (Shift + Alt + X). `(v0.6.3~)` ## Additional features (via the script menu) - Manually clean up the links again. `(v0.5.2~)` - Add specific tracking params for the current site (match by domain). `(v0.6.1~)` - Remove custom added params for the current site (match by domain). `(v0.6.2~)` ## Websites that support common cleaning - All websites on the internet. ## Websites that support additional cleaning - Bilibili - Baidu (Unencrypted) URLs - CSDN - Alibaba sites - alibaba.com/aliyun.com/alibabagroup.com/alimama.com - taobao.com/tmall.com/tmall.hk/1688.com/aliexpress.com/trendyol/lazada - youku.com - Douyin/Tiktok.com - Amazon - Youtube */ (() => { const DELAY_TIME = { fast: 600, normal: 1000, slow: 3000 }; const doc = document; const pageHost = window.location.hostname; const pageURL = window.location.href; const pagePath = window.location.pathname; let topScroll = 0; let isLogin = false; const hostRegex = /[a-z0-9-]{1,128}\.[a-z]{2,15}$/; // Matches all tracking parameters *contains/starts/ends* with the name const paramsRegStr = '^(spm|from_|ref_|track|trk|share_|embeds_|refer_)|' + '_from$|scm|referrer'; let paramsReg = new RegExp(paramsRegStr); const commonParams = ['spm', 'mkt', 'src', 'from', 'source', 'alias', 'vd_source', 'brand', 'curator_clanid', 'snr', 'redir', 'sprefix', 'utm_id', 'utm_content', 'utm_source', 'utm_medium', 'utm_sources', 'utm_term', 'utm_campaign', 'utm_referrer', 'utm_keyword', 'ref', 'feature']; // Tracking or other params for certain sites const bilibiliParams = ['vd_source', 'hotRank', 'launch_id', 'popular_rank', 'session_id', 'business', 'sort_field', 'is_room_feed', 'visit_id', 'is_live_full_webview', 'is_live_webview', 'vt', 'theme', 'noReffer', 'timestamp', 'unique_k', 'hasBack', 'noTitleBar', 'plat_id', 'is_preview', 'buvid', 'up_id', 'is_story_h5', 'hybrid_set_header', 'lottery_id', 'seid', '-Abrowser', 'from', 'pagefrom', 'schema', 'preUrl', 'jumpLinkType', 'referfrom', 'spm_id', 'plat_id', 'p2p_type', 'broadcast_type', 'event_source_type']; // 'share_medium', 'share_plat', 'share_source', 'share_tag' // 'from_source', 'from_spmid', 'goFrom', 'sourceFrom', 'share_session_id' // 'refer_from', 'spm_id_from', 'dynamicspm_id_from', 'extra_jump_from' // 'search_source', 'bsource', 'msource', 'csource' // 'p2p_type', 'broadcast_type', 'event_source_type' const biliParamsReg = /^(utm_|share_|spm|from_)|(From|_from|source)$/; const baiduParams = ['rsv_idx', 'hisfilter', 'rsf', 'rsv_pq', 'rsv_t', 'qid', // baidu 'rsv_dl', 'oq', 'gpc', 'usm', 'tfflag', 'bs', 'rqlang', 'tn', 'sc_us', 'wfr', 'fenlei', 'platform', 'rqid', 'base_query', 'entry', 'qbl', 'for', 'from', 'topic_pn', 'rsp', 'rs_src', 'f', 'rsv_page', 'dyTabStr', 'ct', 'lm', 'site', 'sites', 'fr', 'cl', 'bsst', 'lid', 'rsv_spt', 'rsv_bp', 'src', 'sfrom', 'refer', 'zp_fr', 'channel', 'p_from', 'n_type', 'eqid', '_at_', 'sa', 'pd', 'source', 'tag_key', 'uname', 'uid', 'fromModule', 'lemmaFrom', 'structureId', 'structureClickId', 'ie', 'structureItemId', 'xzhid', 'rsv_enter', 'rsv_btype', 'prefixsug', 'client_type', 'task', 'locate', 'page', 'type', 'is_new_user', 'frwh', // tieba 'obj_id', 'fid', 'fname', '_t', 'topic_name', 'frs', 'share_from', 'tpl', 'u', 'tb_mod', 'tb_fr', 'share', 'sfc', 'idfrom', 'client_version', 'st', 'qq-pf-to', 'unique', 'is_video', '_wkts_', 'ai', 'ck', 'shh', // wenku 'utm_source', 'utm_medium', 'utm_term', 'utm_campaign', 'utm_content', 'utm_id', ]; const douyinParams = ['rsv_idx', 'hisfilter', 'source', 'aid', 'enter_from', 'focus_method', 'previous_page', 'extra_params', 'gid', 'enter_method', // douyin 'is_from_webapp', 'sender_device', 'web_id']; // tiktok // 'from_wecom', 'source', const csdnParams = commonParams.concat(['ops_request_misc', 'request_id', 'biz_id', 'ydreferer', 'usp']); const youkuTudouParams = ['spm', 'scm', 'from', 's', 'playMode', 'client_id']; const aliSitesStr = '(alibaba|alibabagroup|aliyun|alimama|aliexpress' + '|taobao|tmall|1688|jiyoujia|fliggy)' + '.(com|hk|cn)$|(lazada|trendyol).[a-z.]{2,15}$'; const aliSitesReg = new RegExp(aliSitesStr); const aliParams = [ 'spm', 'acm', 'scm', 'scene', 'from', 'pvid', 'pvid2', ]; // 'wh_pid', 'wh_random_str', 'wx_navbar_transparent', 'wh_weex' const aliParamsRegStr = '^(utm_|spm_|from_|ref|track|wh_|wx_)'; const aliParamsReg = new RegExp(aliParamsRegStr); const amaznParams = ['content-id', 'qid', 'crid', 'isAmazonFulfilled', 'sbo', 'plattr', 'sprefix', 'ld', '_encoding', 'ie', 'ds', ]; const amznParamsRegStr = '_ref|^(utm_|ref|pd_rd_|pf_rd_|track|sc_)'; const amznParamsReg = new RegExp(amznParamsRegStr, 'i'); const ytParams = commonParams.concat(['embeds_referring_euri', 'embeds_euri', 'source_ve_path', 'feature', 'embeds_referring_origin', 'redir_token', 'pp', 'origin', 'ab_channel', 'enablejsapi', 'widgetid']); // If <true> block [Lucky Draw (The Selection)] popups on live.bilibili.com. const BlockLivePopups = true; // Add a custom 'urlchange' event to pushState and replaceState (() => { // [https://stackoverflow.com/a/52809105] const originalPushState = window.history.pushState; const originalReplaceState = window.history.replaceState; window.history.pushState = function pushState(...args) { const newPushState = originalPushState.apply(this, args); window.dispatchEvent(new Event('pushstate')); window.dispatchEvent(new Event('urlchange')); return newPushState; }; window.history.replaceState = function replaceState(...args) { const newReplaceState = originalReplaceState.apply(this, args); window.dispatchEvent(new Event('replacestate')); window.dispatchEvent(new Event('urlchange')); return newReplaceState; }; })(); // Restore history state, remove redundant parameters function restoreState(siteParams) { const url = new URL(window.location.href); const params = url.searchParams; siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); Array.from(params.keys()).forEach((k) => { if (paramsReg.test(k)) { params.delete(k); } }); if (url.href !== window.location.href) { window.history.replaceState({}, 'Restore', url.href); } } let cleanLinks; // Clean most of <a> links switch (true) { case aliSitesReg.test(pageHost): // Alibaba sites cleanLinks = (siteParams) => { const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { const url = new URL(links[i].href); const params = url.searchParams; if (params.has('q')) { params.set('q', links[i].innerText); } // // 1. Ali sites (decoding error) siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); Array.from(params.keys()).forEach((k) => { if (aliParamsReg.test(k)) { params.delete(k); } }); if (links[i].href !== url.href) { links[i].href = url.href; } } } const areaLinks = doc.getElementsByTagName('area'); for (let i = 0; i < areaLinks.length; i += 1) { if (hostRegex.test(areaLinks[i].hostname)) { const url = new URL(areaLinks[i].href); const params = url.searchParams; if (params.has('q')) { params.set('q', areaLinks[i].innerText); } // // 1. Ali sites (decoding error) siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); Array.from(params.keys()).forEach((k) => { if (aliParamsReg.test(k)) { params.delete(k); } }); if (areaLinks[i].href !== url.href) { areaLinks[i].href = url.href; } } } }; break; case /baidu.com$/.test(pageHost): // Baidu sites cleanLinks = (siteParams) => { const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { const url = new URL(links[i].href); const params = url.searchParams; if (links[i].hostname === 'passport.baidu.com' && siteParams.includes('u')) { siteParams.splice(siteParams.indexOf('u'), 1); } if (links[i].innerText === '应用中心') { params.set('kw', links[i].innerText); } // 2. Tieba.baidu.com siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); if (url.href !== links[i].href) { links[i].href = url.href; } } } }; break; case /(bilibili|biligame)\.com$/.test(pageHost): cleanLinks = (siteParams) => { const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { links[i].removeAttribute('data-mod'); links[i].removeAttribute('data-spmid'); links[i].removeAttribute('data-idx'); links[i].removeAttribute('data-target-url'); const url = new URL(links[i].href); const params = url.searchParams; siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); Array.from(params.keys()).forEach((k) => { if (biliParamsReg.test(k)) { params.delete(k); } }); if (links[i].href !== url.href) { links[i].href = url.href; } } // 3. Bilibili // Clean <a> link data-url on video/bangumi of bilibili.com const dataLink = links[i].getAttribute('data-url'); if (/^(https?:\/\/|\/\/)[a-zA-Z0-9-.]{1,128}\.[a-z]{2,15}/.test(dataLink)) { let dlURL; if (dataLink.startsWith('//')) { dlURL = new URL(`https:${dataLink}`); } else { dlURL = new URL(dataLink); } const dlParams = dlURL.searchParams; if (dlURL.hostname.endsWith('bilibili.com')) { Array.from(dlParams.keys()).forEach((k) => { if (biliParamsReg.test(k)) { dlParams.delete(k); } }); siteParams.forEach((k) => { if (dlParams.has(k)) { dlParams.delete(k); } }); } else { const dlParamsReg = paramsReg; Array.from(dlParams.keys()).forEach((k) => { if (dlParamsReg.test(k)) { dlParams.delete(k); } }); commonParams.forEach((k) => { if (dlParams.has(k)) { dlParams.delete(k); } }); } links[i].href = dlURL.href; links[i].classList.remove('jump-link'); links[i].target = '_blank'; if (links[i].innerText.startsWith(dlURL.href)) { links[i].innerText = dlURL.href; } } } }; break; case /amazon\.[a-z.]{2,15}$/.test(pageHost): cleanLinks = (siteParams) => { const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { const url = new URL(links[i].href); const params = url.searchParams; siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); Array.from(params.keys()).forEach((k) => { if (amznParamsReg.test(k)) { params.delete(k); } }); if (links[i].href !== url.href) { links[i].href = url.href; } } if (/amazon\.[a-z.]{2,15}$/.test(links[i].hostname)) { // 4. Amazon if (links[i].pathname.includes('/ref')) { links[i].pathname = links[i].pathname.substring(links[i].pathname.indexOf('/ref'), 1); } } } }; break; case /google\.[a-z.]{2,15}$|about.google$/.test(pageHost): cleanLinks = (siteParams) => { const links = doc.getElementsByTagName('a'); const iParamsReg = paramsReg; for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { const url = new URL(links[i].href); const params = url.searchParams; siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); Array.from(params.keys()).forEach((k) => { if (iParamsReg.test(k)) { params.delete(k); } }); if (links[i].href !== url.href) { links[i].href = url.href; } // Clean params at the hash of urls // 5. Google if (/utm_/.test(url.hash)) { const ua = url.hash.substring(1).split('&'); ua.forEach((key, index) => { if (/^utm_/.test(key)) ua.splice(index, 8); }); links[i].hash = `#${ua.toString().replaceAll(',', '&')}`; } } } }; break; default: cleanLinks = (siteParams) => { const links = doc.getElementsByTagName('a'); const iParamsReg = paramsReg; for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { const url = new URL(links[i].href); const params = url.searchParams; siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); Array.from(params.keys()).forEach((k) => { if (iParamsReg.test(k)) { params.delete(k); } }); if (links[i].href !== url.href) { links[i].href = url.href; } } } }; break; } function deferredCleanLinks(siteParams, delayTime) { const tid = setTimeout(() => { restoreState(siteParams); cleanLinks(siteParams); clearTimeout(tid); }, delayTime); } // Block link clicking events function blockClickEvents(siteParams, delayTime) { const tid = setTimeout(() => { const handleLinkClick = () => { cleanLinks(siteParams); }; const handleLinkCM = (e) => { e.stopImmediatePropagation(); cleanLinks(siteParams); }; const handleLinkClickN = () => { deferredCleanLinks(siteParams, 0); }; const divs = doc.getElementsByTagName('div'); for (let i = 0; i < divs.length; i += 1) { if (divs[i].className) { divs[i].removeEventListener('click', handleLinkClickN); divs[i].addEventListener('click', handleLinkClickN); divs[i].removeEventListener('auxclick', handleLinkCM); divs[i].addEventListener('auxclick', handleLinkCM); divs[i].removeEventListener('mousedown', handleLinkClick); divs[i].addEventListener('mousedown', handleLinkClick); divs[i].removeEventListener('keydown', handleLinkClick); divs[i].addEventListener('keydown', handleLinkClick); } } const btns = doc.getElementsByTagName('button'); for (let i = 0; i < btns.length; i += 1) { if (btns[i].className) { btns[i].removeEventListener('click', handleLinkClickN); btns[i].addEventListener('click', handleLinkClickN); } } const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { // links[i].removeEventListener('mousedown', handleLinkCM); // mail.qq.com/web.telegram.org // links[i].addEventListener('mousedown', handleLinkCM); links[i].removeEventListener('keyup', handleLinkCM); links[i].addEventListener('keyup', handleLinkCM); links[i].removeEventListener('click', handleLinkClick); links[i].addEventListener('click', handleLinkClick); links[i].removeEventListener('auxclick', handleLinkClick); links[i].addEventListener('auxclick', handleLinkClick); links[i].removeEventListener('contextmenu', handleLinkCM); if (links[i].ontouchstart === undefined) { links[i].addEventListener('contextmenu', handleLinkCM); } } } clearTimeout(tid); }, delayTime); } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ Custom clean ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ // Youku, Tudou, Douyin, Amazon function customClean(siteParams) { restoreState(siteParams); cleanLinks(siteParams); let x = 0; let y = 0; doc.addEventListener('pointermove', (e) => { if (Math.abs(e.clientX - x) > 20 || Math.abs(e.clientY - y) > 20) { cleanLinks(siteParams); x = e.clientX; y = e.clientY; } }); doc.addEventListener('DOMContentLoaded', () => { blockClickEvents(siteParams, 0); }); } // Hide elements (common) function hideElement(attrs, intervals, duration, isRemove) { const intervalID = setInterval(() => { attrs.forEach((attr) => { if (document.querySelector(attr)) { if (!isRemove) { document.querySelector(attr).style.visibility = 'hidden'; } else { document.querySelector(attr).remove(); } } }); }, intervals); document.addEventListener('DOMContentLoaded', () => { const timeoutId = setTimeout(() => { clearInterval(intervalID); clearTimeout(timeoutId); }, duration); }); } // Auto close (common) function autoClick(attrs, attrIndex, intervals, duration) { const intervalID = setInterval(() => { attrs.forEach((attr) => { const closeBtn = document.querySelectorAll(attr)[attrIndex]; if (closeBtn) { closeBtn.click(); } }); }, intervals); document.addEventListener('DOMContentLoaded', () => { const timeoutId = setTimeout(() => { clearInterval(intervalID); clearTimeout(timeoutId); }, duration); }); } // Auto close (mutation observer) function autoClose(loginWindow, closeButton, loginButton, timeout) { doc.addEventListener('DOMContentLoaded', () => { const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (document.querySelector(loginWindow)) { if (node.querySelector(closeButton) && !isLogin) { console.info('Auto Cloesd!'); node.querySelector(closeButton).click(); } } }); }); }); observer.observe(doc, { childList: true, subtree: true }); if (isLogin) { const timeoutID = setTimeout(() => { loginButton.addEventListener('click', () => { isLogin = true; observer.disconnect(); }); clearTimeout(timeoutID); }, DELAY_TIME.normal * 2); } else { // Set timeout to disconnect observer whithout login button const timeoutID = setTimeout(() => { isLogin = true; observer.disconnect(); clearTimeout(timeoutID); }, timeout); } }); } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ Common sites ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ function commonClean() { switch (true) { // additional params for certain sites case /google\.[a-z.]{2,15}$|(about|wellbeing).google/.test(pageHost): commonParams.push( 'device', 'pcampaignid', 'subid', 'hl', 'fg', 'ved', 'ei', 'prev', 'sig', 'sca_esv', 'visit_id', 'dest_src', ); break; case pageHost.endsWith('facebook.com'): commonParams.push( 'privacy_mutation_token', 'ars', 'helpref', 'search_session_id', 'entry_point', 'campaign_id', 'nav_source', 'placement', 'privacy_source', '__cft__[0]', '__tn__', ); break; case /(twitter|x)\.com$/.test(pageHost): commonParams.push('screen_name'); break; case pageHost.endsWith('reddit.com'): commonParams.push('embed_host_url', 'actionSource', 'shreddit'); paramsReg = /^(utm_|spm_|from_|ref|track|trk|experiment_d2x_|experiment_mweb)/; break; case pageHost.endsWith('linkedin.com'): commonParams.push( // 'trk' , 'trkInfo' 'original_referer', 'origin', 'upsellOrderOrigin', 'lipi', 'desktopBackground', 'profileFormEntryPoint', 'entityUrn', 'veh', 'miniCompanyUrn', 'courseSlug', 'upsellTrk', 'upsellTrackingId', 'contextUrn', 'ct', 'pt', 'refId', 'position', ); document.addEventListener('DOMContentLoaded', () => { blockClickEvents(commonParams, 8500); deferredCleanLinks(commonParams, DELAY_TIME.normal * 2); }); break; case pageHost.endsWith('dzen.ru'): commonParams.push( 'lang', 'country_code', 'rid', 'clid', 'stid', 'issue_tld', 'parent_rid', 'persistent_id', 'story', 't', 'utr', 'place', 'secdata', 'integration', 'feed_exp', 'force_common_feed', 'feed_filter_type', 'feed_filter_source', ); break; case pageHost.endsWith('vk.com'): commonParams.push('scheme', 'initial_stats_info'); break; case /(microsoft|bing|xbox|skype|office|microsoft365)\.com$/.test(pageHost): commonParams.push( 'ocid', 'OCID', 'ICID', 'icid', 'CLCID', 'clcid', 'es', 'response_mode', 'exp', 'form', 'FORM', 'xr', 'cat0', 'culture', 'country', 'WT.mc_id', 'uiflavor', // office 'activetab', 'fl', 'client_id', 'wreply', 'cobrandid', // signin 'deeplink', 'referrer', 'mode', 'pos', ); break; case /msn.(com|cn)$/.test(pageHost): // No effect on the [Shadow Root] elements. commonParams.push('ocid', 'cvid', 'ei', '.cn', 'fullscreen'); break; case /bestbuy\.(com|ca)$/.test(pageHost): commonParams.push( 'id', 'ar', 'cmp', 'loc', 'irgwc', 'mpid', 'irclickid', 'intlreferer', 'intl', 'browsedCategory', 'qp', 'type', 'usc', 'iht', 'ks', 'sc', '_dyncharset', 'icmp', ); // 'subId1', 'subId2', 'subId3', 'nrtv_cid', 'nrtv_as_src', paramsReg = /^(utm_|nrtv_|subId)/; break; case pageHost.endsWith('github.com'): commonParams.push('ref_cta', 'ref_loc', 'ref_page'); break; case pageHost.endsWith('stackoverflow.com'): paramsReg = /^(utm_|spm_|from_|ref|track|trk|so_)/; break; case pageHost.endsWith('pixiv.net'): commonParams.push('provider'); break; case pageHost.endsWith('music.apple.com'): commonParams.push('at', 'ct', 'itscg', 'itsct'); break; case pageHost.endsWith('zhihu.com'): commonParams.push( 'search_source', 'hybrid_search_source', 'hybrid_search_extra', 'utm_psn', ); autoClose( '.Modal-content', '.Modal-closeButton', doc.querySelector('.AppHeader-profile button'), 2000, ); break; case /(163|126|yeah)\.(com|net)$/.test(pageHost): commonParams.push('scene', 'session_id', 'fromDlpro', 'dltype'); break; case pageHost.endsWith('weibo.com'): commonParams.push( 'mark_id', 'entry', '_rand', 'sudaref', 'refer', 'band_rank', 'gid', 'ua', ); break; case pageHost.endsWith('qq.com'): commonParams.push('ADTAG', 'fromSource'); break; case /ebay\.[a-z.]{2,15}$/.test(pageHost): commonParams.push( '_trkparms', '_trksid', 'ssPageName', 'amdata', 'mc', 'hash', 'epid', 'var', '_ssn', 'store_name', 'requested', 'itmprp', 'itmmeta', ); break; case pageHost.endsWith('jd.com'): commonParams.splice(commonParams.indexOf('utm_campaign'), 1); commonParams.push( 'gx', 'ad_od', 'needRecommendFlag', 'uabt', 'd', '_fd', 'pvid', 'jxsid', 'csid', 'ss_projid', 'scan_orig', 'ss_expid', 'ss_sexpid', 'ss_ruleid', 'ss_sruleid', 'ss_symbol', 'ss_mtest', 'sceneval', ); paramsReg = /^(track|wxa_|spm_|from_)/; break; case pageHost.endsWith('yangkeduo.com'): commonParams.push( 'gx', 'ad_od', 'needRecommendFlag', 'uabt', 'd', 'pxq_secret_key', 'cpsSignjb_act', 'launch_pdd', 'customParameters', 'duoduo_type', 'goods_sign', ); paramsReg = /^(track|from_|utm_|_oak_|_wv|_x_)/; break; case /(hoyolab|hoyoverse|mihoyo|miyoushe|mihoyogift)\.com$/.test(pageHost): // _auth_require _presentation_style _hide_status_bar _landscape _theme _theme_device commonParams.push('game_version', 'visit_device', 'device_type', 'plat_type'); paramsReg = /^(track|utm|spm_|from_|hyl_|bbs_|mhy_)|_from$/; (() => { // /account.(hoyoverse|hoyolab).com$|user.miyoushe.com$/ const css = document.createElement('style'); css.innerText += 'body{overflow: auto !important}'; doc.addEventListener('DOMContentLoaded', () => { document.head.append(css); }); })(); customClean(commonParams); break; case pageHost.endsWith('douban.com'): commonParams.push( 'target_user_id', 'dcs', 'dcm', 'dt_time_source', 'channel', 'fullscreen', 'autorotate', 'hidenav', ); break; case /(imdb|boxofficemojo)\.com$/.test(pageHost): commonParams.push('rf', 'imdbPageAction', 'u', 'tag'); paramsReg = amznParamsReg; break; case pageHost.endsWith('gitee.com'): (() => { const intervalID = setInterval(() => { if (doc.querySelector('.menu.transition.visible')) { doc.querySelector('.menu.transition.visible').style = 'display: none !important;'; } }, 50); document.addEventListener('DOMContentLoaded', () => { const timeoutId = setTimeout(() => { clearInterval(intervalID); clearTimeout(timeoutId); }, 3000); }); })(); break; case pageHost.endsWith('xda-developers.com'): commonParams.push( 'tag', 'ascsubtag', 'asc_refurl', 'asc_campaign', 'newsletter_popup', ); break; case pageHost.endsWith('####.com'): commonParams.push('toc_style_id'); break; case pageHost.endsWith('fiverr.com'): commonParams.push( 'pckg_id', 'funnel', 'context_type', 'context_alg', 'imp_id', 'pos', 'seller_online', 'context', ); break; case pageHost.endsWith('newegg.com'): commonParams.push( 'cm_sp', 'nextpage', ); break; case pageHost.endsWith('theverge.com'): commonParams.push( 'u1', 'tag', 'ascsubtag', 'subId1', 'subId2', 'subId3', ); break; case pageHost.endsWith('bluestacks.com'): commonParams.push( 'platform', 'client_uuid', 'app_pkg', 'platform_cloud', 'preferred_lang', 'gaCookie', 'gclid', 'clickid', 'msclkid', 'affiliateId', 'offerId', 'transaction_id', 'aff_sub', 'first_landing_page', 'user_id', 'incompatible', 'bluestacks_version', 'referrer', 'download_page_referrer', ); // win_version, mac_version, exit_utm_campaign, // device_memory, device_cpu_cores paramsReg = /^device_|(_version|utm_campaign)$/; break; case pageHost.endsWith('xiao####shu.com'): autoClose( '.login-container', '.close-button', doc.querySelector('.login-btn'), 3700, ); break; case pageHost.endsWith('nicovideo.jp'): commonParams.push( 'cmnhd_ref', 'device', 'site', 'pos', ); break; default: break; } const params = commonParams; restoreState(params); cleanLinks(params); document.addEventListener('DOMContentLoaded', () => { blockClickEvents(params, 1200); deferredCleanLinks(params, 1000); deferredCleanLinks(params, 7000); }); window.onscroll = () => { const scrolls = doc.documentElement.scrollTop; if (scrolls - topScroll > 120) { cleanLinks(params); topScroll = scrolls; } }; return params; } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ Bilibili ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ // Remove Bilibili metadata function removeBiliMetadData() { const metas = doc.getElementsByTagName('meta'); for (let i = 0; i < metas.length; i += 1) { if (metas[i].name === 'spm_prefix') { metas[i].remove(); } } } // Remove Bilibili Annoyances [Login popups, Ads] function removeBiliAnnoyances(delayTime) { const tid = setTimeout(() => { let index = 0; do { const cardAds = doc.getElementsByTagName('a'); for (let i = 0; i < cardAds.length; i += 1) { if (cardAds[i].hostname.endsWith('cm.bilibili.com')) { cardAds[i].parentNode.removeChild(cardAds[i]); } // bilibili ads } index += 1; } while (index < 2); // bilibili login tips const traceDivs = doc.getElementsByClassName('bili-video-card'); for (let i = 0; i < traceDivs.length; i += 1) { if (traceDivs[i].getAttribute('data-report').includes('tianma.')) { traceDivs[i].setAttribute('data-report', '0'); } // bilibili ads } /** * ******************************************************* * ******************************************************* */ const rightEntyItems = doc.getElementsByClassName('right-entry-item') || doc.getElementsByClassName('item'); if (rightEntyItems[0] && rightEntyItems[0].innerText.includes('登录')) { hideElement(['.lt-row', '.bili-login-card', '.bili-mini-mask', '.is-bottom', '.v-popover-content', '.unlogin-popover'], 30, 6000, false); const loginTab = rightEntyItems[0].getElementsByTagName('span')[0]; if (/登录/.test(rightEntyItems[0].innerText) && loginTab) { loginTab.outerHTML = '<a href="https://passport.bilibili.com/login"' + ' target="_blank" onmouseup="cleanLinks(bilibiliParams)">登录</a>'; } } clearTimeout(tid); doc.getElementById('right-bottom-banner').remove(); }, delayTime); } // block clicking events (link, button, li) function blockBClickEvents() { const handleBClickBub = (e) => { e.stopImmediatePropagation(); }; function blockBLinkEvents() { const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (links[i].getAttribute('data-video-time') === null && hostRegex.test(links[i].hostname)) { const isLinkJump = links[i].classList.contains('jump-link'); const isLinkJumpVideo = links[i].classList.contains('video-time') || links[i].classList.contains('video'); if (!(isLinkJump && isLinkJumpVideo)) { if (pageHost.endsWith('bilibili.com')) { links[i].removeEventListener('click', handleBClickBub); links[i].addEventListener('click', handleBClickBub); } links[i].removeEventListener('contextmenu', handleBClickBub); if (links[i].ontouchstart === undefined) { links[i].addEventListener('contextmenu', handleBClickBub); } links[i].removeEventListener('pointerdown', handleBClickBub); links[i].addEventListener('pointerdown', handleBClickBub); } } } } blockBLinkEvents(); function deferredBlockBLinkEvents(delayTime) { const tid = setTimeout(() => { cleanLinks(bilibiliParams); removeBiliAnnoyances(0); blockBLinkEvents(); clearTimeout(tid); }, delayTime); } const handleClickFast = () => { deferredBlockBLinkEvents(DELAY_TIME.fast); }; const buttons = doc.getElementsByTagName('button'); for (let i = 0; i < buttons.length; i += 1) { if (buttons[i].className) { buttons[i].removeEventListener('click', handleClickFast); buttons[i].addEventListener('click', handleClickFast); } } const lines = doc.getElementsByTagName('li'); for (let i = 0; i < lines.length; i += 1) { if (lines[i].className && !lines[i].classList.contains('context-sub-menu-item')) { lines[i].removeEventListener('click', handleClickFast); lines[i].addEventListener('click', handleClickFast); } } // iframe - live if (pageURL.startsWith('https://live.bilibili.com/blackboard/dropdown')) { document.addEventListener('DOMContentLoaded', () => { document.addEventListener('click', (e) => { e.stopPropagation(); }, true); }); } } function deferredBlockBClickEvents(delayTime) { restoreState(bilibiliParams); const tid = setTimeout(() => { blockBClickEvents(); clearTimeout(tid); }, delayTime); } // Loop execution when the mouse moves function bilibiliListenMoving() { let x = 0; let y = 0; if (/live.bilibili.com$/.test(pageHost) || /^https?:\/\/(www|m).bilibili\.com\/(video|bangumi)/.test(pageURL)) { window.onpointermove = (e) => { if (e.clientY < 200) { cleanLinks(bilibiliParams); blockBClickEvents(); } }; } else { window.onpointermove = (e) => { if (Math.abs(e.clientX - x) > 20 || Math.abs(e.clientY - y) > 20) { cleanLinks(bilibiliParams); blockBClickEvents(); x = e.clientX; y = e.clientY; } }; } } // Loop execution when scrolling function biliListenScrolling() { window.onscroll = () => { const scrolls = doc.documentElement.scrollTop; if (scrolls - topScroll > 120) { cleanLinks(bilibiliParams); removeBiliAnnoyances(0); blockBClickEvents(); topScroll = scrolls; } }; } // bilibili search events function blockBSearchItemEvents() { function blockSearchEvents() { // input suggested items const suggestItems = doc.getElementsByClassName('suggest-item'); const handleBSearchClick = () => { deferredBlockBClickEvents(DELAY_TIME.fast); }; if (suggestItems) { for (let i = 0; i < suggestItems.length; i += 1) { suggestItems[i].addEventListener('click', handleBSearchClick, true); } } // search trending items const topSearchs = doc.getElementsByClassName('trending-item'); if (topSearchs) { for (let i = 0; i < topSearchs.length; i += 1) { topSearchs[i].addEventListener('click', handleBSearchClick, true); } } // search history items const historyItems = doc.getElementsByClassName('history-item'); if (historyItems) { for (let i = 0; i < historyItems.length; i += 1) { historyItems[i].addEventListener('click', handleBSearchClick, true); } } } const handleBSearchClickB = () => { const tid = setTimeout(() => { blockSearchEvents(); clearTimeout(tid); }, DELAY_TIME.fast); }; // search input area if (doc.querySelector('.search-input-el')) { doc.querySelector('.search-input-el').addEventListener('click', handleBSearchClickB, true); } // clear icon if (doc.querySelector('.clear-icon')) { doc.querySelector('.clear-icon').addEventListener('click', handleBSearchClickB, true); } } // search.bilibili.com/* function cleanBSearch() { blockBSearchItemEvents(); // paging button clicking event const pageButtons = doc.getElementsByClassName('vui_pagenation--btn'); // div if (pageButtons) { for (let i = 0; i < pageButtons.length; i += 1) { pageButtons[i].addEventListener('click', () => { deferredBlockBClickEvents(DELAY_TIME.fast); }, true); } } deferredBlockBClickEvents(DELAY_TIME.normal); deferredCleanLinks(bilibiliParams, DELAY_TIME.slow - 600); } // www.bilibili.com/video/* function cleanBVideoURL() { cleanLinks(bilibiliParams); doc.addEventListener('DOMContentLoaded', () => { if (doc.querySelector('.rec-footer')) { doc.querySelector('.rec-footer').addEventListener('click', () => { deferredCleanLinks(bilibiliParams, DELAY_TIME.fast); deferredBlockBClickEvents(bilibiliParams, DELAY_TIME.fast); }, true); } // Clean copying of video URLs (copy share) let toolBar; let sharInner; let sharOuter; if (/^\/video\//.test(pagePath)) { toolBar = '#arc_toolbar_report'; sharOuter = 'share-btn-outer'; sharInner = 'share-btn-inner'; } else if (/^\/bangumi\//.test(pagePath)) { toolBar = '.toolbar'; sharOuter = 'share-container-id'; sharInner = 'link_copy'; } let vid; const url = new URL(window.location.href); const handleWriteText = () => { navigator.clipboard.writeText(pageURL); }; if (doc.querySelector(toolBar)) { doc.querySelector(toolBar).addEventListener('pointermove', () => { if (doc.getElementById(sharOuter)) { doc.getElementById(sharOuter).removeEventListener('click', handleWriteText); doc.getElementById(sharOuter).addEventListener('click', handleWriteText); doc.getElementById(sharInner).addEventListener('click', (event) => { event.stopImmediatePropagation(); if (doc.getElementById(sharInner).innerText.includes('精准')) { if (pagePath.indexOf('/video/') === 0) { vid = doc.querySelector('video') || doc.querySelector('bwp-video'); // Chrome Firefox Edge .. } else if (pagePath.indexOf('/bangumi/') === 0) { vid = doc.getElementsByTagName('video')[1] || doc.querySelector('bwp-video'); } url.searchParams.set('t', vid.currentTime.toFixed(2)); navigator.clipboard.writeText(url.toString()); } else { navigator.clipboard.writeText(pageURL); } }); } }); } }); } // live.bilibili.com/* function cleanBLive(delayTime) { // live.bilibili.com popups const livePopupBlock = (selection) => { if (selection && doc.getElementById('anchor-guest-box-id')) { doc.getElementById('anchor-guest-box-id').style.display = 'none'; } else if (!selection) { doc.getElementById('anchor-guest-box-id').style.display = ''; } const iframes = doc.getElementsByTagName('iframe'); for (let i = 0; i < iframes.length; i += 1) { if (iframes[i].src.includes('live-lottery')) { if (selection) { iframes[i].style.visibility = 'hidden'; } else { iframes[i].style.visibility = ''; } } } }; const tid1 = setTimeout(() => { const navis = doc.getElementsByClassName('tabs__tag-item'); // cat if (navis) { for (let i = 0; i < navis.length; i += 1) { navis[i].addEventListener('click', () => { deferredCleanLinks(bilibiliParams, DELAY_TIME.fast); }, true); } } const tabItems = doc.getElementsByClassName('tab-item'); // sort if (tabItems) { for (let i = 0; i < tabItems.length; i += 1) { tabItems[i].addEventListener('click', () => { blockBClickEvents(); deferredCleanLinks(bilibiliParams, DELAY_TIME.fast); }, true); } } clearTimeout(tid1); }, delayTime); const intervalID = setInterval( livePopupBlock(BlockLivePopups), DELAY_TIME.normal * 2, ); const tid2 = setTimeout(() => { clearInterval(intervalID); clearTimeout(tid2); }, DELAY_TIME.slow + 3000 * 300); } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ Baidu ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ // Baidu related search, Hot search URL cleaning function cleanBaidu() { if (pageHost.endsWith('news.baidu.com')) { baiduParams.push('toc_style_id', 'share_to', 'track_id'); } restoreState(baiduParams); function removeBDAds() { const searchAds = document.getElementsByClassName('EC_r###lt'); if (searchAds) { for (let i = 0; i < searchAds.length; i += 1) { searchAds[i].remove(); } } } if (pageHost.endsWith('tieba.baidu.com') && baiduParams.includes('ie')) { baiduParams.splice(baiduParams.indexOf('ie'), 1); } function cleanBDLinks(siteParams) { cleanLinks(baiduParams); const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (hostRegex.test(links[i].hostname)) { if (links[i].hostname.endsWith('zhidao.baidu.com') && links[i].pathname === '/q') { links[i].pathname = '/search'; } links[i].href = links[i].href.replace('from=', ''); } } if (doc.querySelector('area')) { const areaURL = new URL(doc.querySelector('area').href); const params = areaURL.searchParams; siteParams.forEach((k) => { if (params.has(k)) { params.delete(k); } }); doc.querySelector('area').href = areaURL.href; } } function blockBDTrackingEvents() { doc.addEventListener('DOMContentLoaded', () => { const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (links[i].href !== '') { links[i].addEventListener('click', () => { cleanBDLinks(baiduParams); }, true); } } }); } cleanBDLinks(baiduParams); blockBDTrackingEvents(); if (pagePath === '/s') removeBDAds(); window.onscroll = () => { const scrolls = doc.documentElement.scrollTop; if (scrolls - topScroll > 120) { cleanLinks(baiduParams); topScroll = scrolls; } if (pagePath === '/s') { removeBDAds(); } // Baidu search ads }; let x = 0; let y = 0; window.onpointermove = (e) => { if (Math.abs(e.clientX - x) > 20 || Math.abs(e.clientY - y) > 20) { cleanLinks(baiduParams); x = e.clientX; y = e.clientY; } }; } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ CSDN ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ function cleanCSDN() { restoreState(csdnParams); deferredCleanLinks(csdnParams, DELAY_TIME.normal); // CSDN.net tracking events function blockCSDNEvents() { const links = doc.getElementsByTagName('a'); for (let i = 0; i < links.length; i += 1) { if (links[i].hostname) { links[i].addEventListener('click', (e) => { e.stopImmediatePropagation(); }); } } } window.onpointermove = (e) => { if (e.clientY < 170 || e.clientY > 450) { cleanLinks(csdnParams); blockCSDNEvents(); } }; window.onscroll = () => { const scrolls = doc.documentElement.scrollTop; if (scrolls - topScroll > 120) { cleanLinks(csdnParams); blockCSDNEvents(); topScroll = scrolls; } }; } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ Ali Sites ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ function cleanAliSites() { switch (true) { // taobao.com/tmall.com/tmall.hk case /(taobao|tmall).(com|hk)$/.test(pageHost): aliParams.push( 'scm2', 'stats_click', 'initiative_id', 'source', 'suggest', 'suggest_query', 'iconType', 'traceId', 'relationId', 'union_lens', 'ref', 'ali_trackid', 'ak', 'detailSharePosition', 'topOfferIds', 'sp_abtk', 'search_condition', 'industryCatId', 'tbSocialPopKey', 'bxsign', 'utparam', 'eurl', 'itemIds', 'country', 'epid', 'user_number_id', 'rootPageId', 'lwfrom', 'disableNav', 'es', 'rand', '_lgt_', 'x5referer', 'status_bar_transparent', 'tracelog', ); break; case pageHost.endsWith('fliggy.com'): aliParams.push('ad_id', 'am_id', 'cm_id', 'pm_id', '_k'); break; case pageHost.endsWith('1688.com'): aliParams.push( 'scm2', 'topOfferIds', '__pageId__', 'resourceId', 'offerId', 'offerIds', 'object_id', 'udsPoolId', 'r###ltType', 'cms_id', 'pha_html', '__existtitle__', 'object_type', 'delivery_pool_id', 'delivery_pool_type', 'ilike_session', 'tracelog', 'clickid', 'sessionid', 'cosite', '_p_isad', 'exp', 'rootPageId', 'lwfrom', 'disableNav', 'es', 'hpageId', ); break; case /(lazada|trendyol).[a-z.]{2-10}/.test(pageHost): aliParams.push( 'shareUniqueId', 'clickTrackInfo', 'data_prefetch', 'at_iframe', 'prefetch_replace', 'wc', ); break; default: break; } restoreState(aliParams); deferredCleanLinks(aliParams, DELAY_TIME.slow); doc.addEventListener('DOMContentLoaded', () => { blockClickEvents(aliParams, DELAY_TIME.fast); }); window.onscroll = () => { const scrolls = doc.documentElement.scrollTop; if (scrolls - topScroll > 120) { cleanLinks(aliParams); blockClickEvents(aliParams, 0); topScroll = scrolls; } }; } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ Youtube ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ function cleanYoutube() { function blockytLinksRedirection(timeout) { setTimeout(() => { const outerLinks = document.getElementsByClassName('yt-core-attributed-string--link-inherit-color'); for (let i = 0; i < outerLinks.length; i += 1) { outerLinks[i].addEventListener('click', (e) => { e.stopPropagation(); }, true); } }, timeout); } restoreState(ytParams); cleanLinks(ytParams); doc.addEventListener('DOMContentLoaded', () => { deferredCleanLinks(ytParams, DELAY_TIME.slow); blockClickEvents(ytParams, 0); blockytLinksRedirection(DELAY_TIME.normal * 2); }); doc.addEventListener('contextmenu', () => { cleanLinks(ytParams); if (pagePath === '/r###lts') { doc.addEventListener('pointerenter', (e) => { e.stopPropagation(); cleanLinks(ytParams); }, true); } window.onscroll = () => { const scrolls = doc.documentElement.scrollTop; if (scrolls - topScroll > 120) { cleanLinks(ytParams); blockytLinksRedirection(0); topScroll = scrolls; } }; // Modifications for CM of youtube player const shareURL = new URL('https://youtube.com/watch'); if (new URL(pageURL).searchParams.has('list')) { shareURL.searchParams .set('list', new URL(pageURL).searchParams.get('list')); } if (pagePath.startsWith('/watch')) { shareURL.searchParams.set('v', new URL(pageURL).searchParams.get('v')); const videoCM = doc.getElementsByClassName('ytp-contextmenu')[0] .getElementsByClassName('ytp-menuitem'); videoCM[1].addEventListener('click', () => { navigator.clipboard.writeText(shareURL.href); }); videoCM[2].addEventListener('click', () => { shareURL.searchParams.set( 't', doc.getElementsByTagName('video')[0].currentTime.toFixed(0), ); navigator.clipboard.writeText(shareURL.href); }); } if (pagePath.startsWith('/embed')) { // Embedded youtube videos shareURL.searchParams.set('v', pagePath.replace('/embed/', '')); const videoCM = doc.getElementsByClassName('ytp-contextmenu')[0] .getElementsByClassName('ytp-menuitem'); videoCM[2].addEventListener('click', () => { navigator.clipboard.writeText(shareURL.href); }); videoCM[3].addEventListener('click', () => { shareURL.searchParams.set( 't', doc.getElementsByTagName('video')[0].currentTime.toFixed(0), ); navigator.clipboard.writeText(shareURL.href); }); } }); } // ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ Main Function ✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦ (() => { // Menu language (May not change properly due to browser settings) let MenuClean; let MenuAddParams; let InputTitle; let invalidFormat; let MenuRemoveParam; let noSuchParam; let addedParamsMenu; let noCustomParamPrompt; switch (navigator.language) { case 'zh-CN' || 'zh-SG': MenuClean = '手动清理链接'; MenuAddParams = '添加自定义参数(半角英文模式)'; InputTitle = '请输入单个指定的参数(仅支持字母,数字,下划线,短破折号(-)与任意类型的括号)'; invalidFormat = '无效的参数格式 '; MenuRemoveParam = '移除一个手动添加的参数(页面刷新后生效)'; noSuchParam = '无此参数'; addedParamsMenu = '已添加的自定义参数\n\n'; noCustomParamPrompt = '暂未添加任何的自定义参数'; break; case 'zh-TW' || 'zh-HK': MenuClean = '手動清理鏈接'; MenuAddParams = '添加自定義参数(半角英文模式)'; InputTitle = '請輸入單個指定的參數(僅支持字母,數字,下劃線,短破折號(-)與任意類型的括號)'; invalidFormat = '無效的參數格式 '; MenuRemoveParam = '移除一個手動添加的參數(頁面刷新後生效)'; noSuchParam = '無此參數'; addedParamsMenu = '已添加的自定義參數\n\n'; noCustomParamPrompt = '暫未添加任何的自定義參數'; break; default: // English and others MenuClean = 'Retry link cleaning'; MenuAddParams = 'Add a custom parameter (English Mode)'; InputTitle = 'Please enter a single parameter below \n(only support ' + 'letters, numbers, underscore, en-dash and all types of brackets):'; invalidFormat = 'Not a valid parameter format '; MenuRemoveParam = 'Remove a custom parameter (Effect after refresh)'; noSuchParam = 'No such parameter.'; addedParamsMenu = 'Get all custom added params:\n\n'; noCustomParamPrompt = 'No added custom parameters now!'; break; } // -._~:/?#[]@!$&'()*+,;= // Add custom params from the Script menu (Submenu of addons) function addCustomParam(inputParam, storedArray) { if (/^[a-zA-Z0-9()[\]{}<>_-]*$/.test(inputParam)) { let list; // eslint-disable-next-line no-undef if (GM_getValue(pageHost)) { // eslint-disable-next-line no-undef list = GM_getValue(pageHost); } else { list = []; } // eslint-disable-next-line no-undef if (inputParam) { list.push(inputParam); GM_setValue(pageHost, list); } list.forEach((v) => { if (!storedArray.includes(v)) { storedArray.push(v); } }); } else { alert(invalidFormat); } } // get all custom added param function getCustomParams() { let list; // eslint-disable-next-line no-undef if (GM_getValue(pageHost)) { // eslint-disable-next-line no-undef list = GM_getValue(pageHost); } else { list = []; } // eslint-disable-next-line no-undef return list; } // Remove a parameter that has been added from the script menu function removeCustomAddedParam(inputParam) { if (inputParam !== null && inputParam !== undefined) { let list; // eslint-disable-next-line no-undef if (GM_getValue(pageHost)) { // eslint-disable-next-line no-undef list = GM_getValue(pageHost); } else { list = []; } if (list.includes(inputParam)) { list = list.filter((item) => item !== inputParam); // eslint-disable-next-line no-undef GM_setValue(pageHost, list); } else { alert(noSuchParam); } } } let siteParams;// For script menu switch (true) { case pageHost.endsWith('youtube.com'): siteParams = ytParams; cleanYoutube(siteParams); break; case pageHost.endsWith('baidu.com'): siteParams = baiduParams; cleanBaidu(); cleanLinks(baiduParams); break; case /amazon\.[a-z.]{2,15}$/.test(pageHost): siteParams = amaznParams; paramsReg = amznParamsReg; customClean(siteParams, paramsReg); break; // REST: space passport account message member t app manga show link biligame mall pay case /(bilibili|biligame)\.com$/.test(pageHost): // && pagePath !== '/mall/upower-pay/' siteParams = bilibiliParams; paramsReg = biliParamsReg; restoreState(bilibiliParams); cleanLinks(bilibiliParams); blockBClickEvents(); if (pageHost.endsWith('www.bilibili.com')) cleanBVideoURL(); if (pageHost.endsWith('search.bilibili.com')) cleanBSearch(); if (pageHost.endsWith('live.bilibili.com')) cleanBLive(DELAY_TIME.normal); doc.addEventListener('DOMContentLoaded', () => { biliListenScrolling(); bilibiliListenMoving(); removeBiliMetadData(); deferredBlockBClickEvents(1000); }); break; case aliSitesReg.test(pageHost): siteParams = aliParams; paramsReg = aliParamsReg; cleanAliSites(); break; case pageHost.endsWith('csdn.net'): siteParams = csdnParams; cleanCSDN(); break; case /(youku|tudou)\.com$/.test(pageHost): siteParams = youkuTudouParams; paramsReg = aliParamsReg; customClean(siteParams); break; case /(tiktok|douyin)\.com$/.test(pageHost): siteParams = douyinParams; customClean(siteParams); // '#login-pannel', '.dy-account-close', break; default: siteParams = commonClean(); break; } addCustomParam('', siteParams); // show all custom added param function showCustomParams() { const list = getCustomParams(siteParams); if (list.length > 0) { alert(addedParamsMenu + list.join(', ')); } else { alert(noCustomParamPrompt); } } // eslint-disable-next-line no-undef GM_registerMenuCommand(MenuClean, () => { // Menu: Retry clean all links restoreState(siteParams); cleanLinks(siteParams); console.log(baiduParams); }, 'C'); // eslint-disable-next-line no-undef GM_registerMenuCommand(MenuAddParams, () => { // Menu: Add a custom param addCustomParam(prompt(InputTitle, ''), siteParams); }); // eslint-disable-next-line no-undef GM_registerMenuCommand(MenuRemoveParam, () => { // Menu: Remove a custom param const list = getCustomParams(siteParams); if (list.length > 0) { const inputParam = prompt(`${addedParamsMenu + list.join(', ')}`, ''); removeCustomAddedParam(inputParam); } else { alert(noCustomParamPrompt); } }); // eslint-disable-next-line no-undef GM_registerMenuCommand(addedParamsMenu, showCustomParams); window.addEventListener('urlchange', () => { restoreState(siteParams); cleanLinks(siteParams); blockClickEvents(siteParams, 0); }); window.addEventListener('keydown', (e) => { // [Alt + Shift + X] if (e.key === 'X' && e.altKey && e.shiftKey) { restoreState(siteParams); cleanLinks(siteParams); if (pageHost.includes('bilibili.com')) removeBiliAnnoyances(0); } }); })(); })(); /* # Changelog v0.7.8 2024.09.27 - Clear more tracking elements on bilibili|nicovideo|google|microsoft|ebay. - Optimised the clean condtions on baidu search r###lt. - Various script optimisations. - Add some menus to get or delete custom added params. (Thanks to @JerryYang-30) v0.7.7 2024.03.21 - Fix some issues on douyin.com|hoyolab.com under certain conditions. - Fix an issus that this script may keep preventing users to pay for bili ups. - Certain functions optimisations. v0.7.6.2 2024.03.14 - Fix an issue that certain pages of bilibili may not be functional. v0.7.6.1 2024.03.12 - Fix an issue that certain pages of bilibili may not be functional. v0.7.6 2024.03.12 - Clean more parameters on google.com. - Remove a banner ad on bilibili's video page. - Adjust cleanup scope on t.bilibili.com. - Fix an issue that some contents may not be loaded properly on Zhihu or other sites. v0.7.5 2023.11.21 - Resotore necessary parameters for baidu.com|qq.com in some cases. - Minor adjustments. v0.7.4 2023.10.22 - Clean more tracking parameters on 1688|microsoft|linkedin|bluestacks.com and for all. - Skip the links redirection on youtube video. - Minor improvements. v0.7.3 2023.09.28 - Clean more tracking parameters on (newegg|bestbuy|skype|office|microsoft365|douban).com. - Minor issue fixes. v0.7.2 2023.09.16 - Fixed an issue that some prompts unable to close on live.bilibili.com. - Fixed an issue that some contents may not be loaded properly. - Fixed an issue that certain login prompts may failed to popup. v0.7.1 2023.09.10 - Restore the essential parameters for discord callbacks. - Clean more parameters. v0.7.0 2023.09.08 - Clean more tracking params on bestbuy|amazon|baidu|douyin|ebay|jd. - Improves the performance on ali sites. - Minor issues fixes and improvements. v0.6.12 2023.08.28 - Minor optimisations to be compatible with page adjustments of zhihu.com. v0.6.11 2023.08.24 - Fixed an issue when preventing certain events may cause parts of the page malfunctional. - Fixed an issue that some contents on the video page of bilibili failed to load. - Minor issues fixes. v0.6.10 2023.08.19 - Fix an issue where the CM for soem sites may fail to prompt in mobile-view mode. v0.6.9 2023.08.15 - Clean more parameters common, (bilibili|1688|taobao|pixiv|fiverr). - Improve performance on ali sites (reduce regex mathcing words). - Minor issues fixes and performance improvments. v0.6.8 2023.07.02 - Temporarily hide annoying content on `gitee.com`. - Clean more parameters for ali sties includes `jiyoujia|fliggy.com`. - Minor issuss fixes and performance improvemets. v0.6.7 2023.06.24 - Clean more parameters for `all|dzen.ru|yangkeduo.com|imdb|boxofficemojo|qq|bilibili.com`. - Clean all parameters whose names match `^spm|scm`, optimised the regexp matching. - Allow using en-dash `(-)` on the function of add custom parameters. - Performance improvements. v0.6.6.1 2023.06.15 - Fixed an issue where the missing existence detection for bilibili may cause numerous error messages (Check before use). v0.6.6 2023.06.15 - Remove more tracking parameters on `Amazon|LinkedIn.com|ebay|Youtube.com|Imdb|Bilibili|Apple.com` and common parameters. - Allow adding custom parameters to the websites that in additional cleaning. - Block more tracking events within its iframe, remove ad-links`(right-bottom-banner|bannerAd)` on bilibili.com. - Performance improvements and issue fixes. v0.6.5 2023.06.07 - Clean more tracking params on `Google|Bilibili|Youtube|Stackoverflow|Bing.com|Xbox.com|Facebook|Amazon`, block more tracking events. - Clean tracking params at the hash of URLs on `Google`. - Allow using numbers and other types of brackets on the function of add custom parameters. - More precise domain name matching. (function includes() >> startsWith/endsWith/Regular Expression). - Fix most timeout issues, and other issue fixes and performance improvements (events listening optimisations). - Additional feature: hide login popups for `zhihu.com|hoyolab.com`. v0.6.4 2023.06.02 - Reduce event blocking scope that binds to the elements `<a>` (capturing >> bubbling). - Clean more tracking params on `linkedin|tmall|facebook|google|ebay.com`, block tracking events on `linkedin.com`. - Clean copying of video urls after right-click at the main video on `youtube.com` (unshorten without tracking params). - Other improvements. v0.6.3 2023.05.26 - Description optimisation (Script menu). - Script optimisation, update excludes. - Remove more parameters for `Amazon, Taobao, Reddit`, bilibili.com/bangumi. - Add a function of quick cleaning with keyboard (Shift + Alt + X), find in the script code to custom: `e.key === 'X'`. v0.6.2.2 2023.05.22 - Regex checking (when add custom param) optimisation (allow using `[]` in parameter). v0.6.2.1 2023.05.22 - Script language optimisation. v0.6.2 2023.05.22 - Script logic and performance optimisation. - Add format validation before adding params (from GM_setValue to storage); - Add a script menu function which can remove a custom added parameter. - Remove more tracking params. - Remove Baidu Search ad r###lts (Testing). v0.6.1 2023.05.18 - Fix an error about array merging, from Array.push() to Array.concat(). - Clean more params for common sites and `Amazon`, `weibo|stackoverflow|tmall.com`. - Reconstruct the functions of history (bind urlchange event to pushState and replaceState). - Custom cleaning for `Amazon`. - Added a submenu to support adding custom params for current site (host). v0.6.0 2023.05.15 - Clean more parameters for `(douban|imdb|vk|weibo|163|126|baidu.com)|yeah.net`. - Resote some parameters for `xda-developers.com`. - Add a function of copy cleaning precise time on the video pages of `bilibili`. - Clean up copy link behavior on context menu. - Script code and regexps matching optimisation, fix several bugs. v0.5.8 2023.05.10 - Fix an issue where the script submenu on github.com was not displayed successfully. - Clean copy texts when share video on the video page of bilibili. - Clean more parameters for `douyin|tiktok|zhihu|douban|twitter|xda-developers|baidu|####.com`. - Block signin popups once when enter the pages of zhihu.com. - Remove more params for `hoyolab|hoyoverse|mihoyo|miyoushe|miyougift.com` with futnion-commonClean. - Timeuout logic optimisation. v0.5.7 2023.05.05 - Optiomise the monitoring of certain events. - Remove more parameters for `github|medium|xda-developers|youku.(com)`. - Bug fixes. v0.5.6 2023.04.28 - Restore a necessary parameter for baidu.com. v0.5.5 2023.04.28 - Restore normall events within the bili-live player under right-menu clicking. - Fixed some coding errors and bug fixes. - Update script icon. - Add more tracking parameters. - Several optimisations, improve cleaning speed. v0.5.2 2023.04.20 - Update site params (add, remove) (Duplicate or necessary parameters for certain sites). - Add a condition before bind a event-listenser to button tags. - Manually cleaning: Add a script menu on tampermonkey's drop-down menu during default situations. - Fixed a problem that clicking to switch page number was invalid (Add label attribute url verificaiton). - Code reduction. v0.5.1 2023.04.15 - Fix some bugs where block clicking-events on empty `<a>` link - Update excludes pages. - Clean some tracking links under space.bilibili.com after click expand more games. - Clean `<a>` links with `data-url` as its target url instead of `href`. - Clean the params at embedded youtube videos. v0.5.0 2023.04.09 - Added tmall.hk. - Added common cleaning to support all websites. - Now this script can clean common contents for all sites and specific cleaning for certain sites. - Performance optimisation. v0.4.10 2023.04.04 - Added 1688.com. - Script operating improvements. v0.4.9 2023.04.03 - Clean Ali sites URLs and block tracking events. - alibaba.com - alibabagroup.com - aliyun.com - aliexpress.com - alimama.com - taobao.com - tmall.com - youku.com - Minor bug fixes. v0.4.8-2023.03.25 - Script optimisation. - Minor bug fixes. v0.4.7-2023.03.14 - Clean Youku URLs. [Youku.com].(Testing) - Code reduction. - Performance optimisation and bug fixes. v0.4.6-2023.03.11 - Clean more baidu links. [Baidu] - Clean CSDN URLs. [csdn.net] - Script optimisation and bug fixes. - Code reduction. v0.4.5 2023.03.09 - Clean more URL under Baidu.com, replace search URL state. [Baidu] - Script optimisation and bug fixes. [bilibili] - Code reduction. v0.4.4 2023.03.05 - Restore history state at live.bilibili.com. [Bilibili] - Clean Bilibili Manga & Show links. [manga/show.bilibili.com] - Clean redundant params at douyin.com search page. [Douyin] - Code reduction. v0.4.3.1 2023.03.01 - Clean more links at live.bilibili.com. [Bilibili] - Script optimisation. v0.4.3 2023.02.24 - Block more tracking events. [Bilibili] - Clean more links.[Bilibili] - Restore link jump events at comment area. [Bilibili] - Script optimisation. [Bilibili] v0.4.2.1 2023.02.22 - Restore `<a>` link click-events on precise time jump at comment area.[www.bilibili.com/video] v0.4.2 2023.02.07 - Optimised events at the search-input-block. [Bilibili] - Bug fixes. [search.bilibili.com, www.bilibili.com] v0.4.1.2 2023.01.28 - Bug fixes and performance optimisation. [Bilibili] v0.4.1.1 2023.01.25 - Expanded the effective pages of the script. [Bilibili] v0.4.1.0 2023.01.23 - Performance optimisation and bug fixes. - Code reduction. v0.4.0.1 2023.01.21 - Clean other untracked links. [space.bilibili.com] - Several bugs fixes. [bilibili.com] v0.4.0 2023.01.20 - Clean Bilibili Video page collections clicking event URL state changes. [www.bilibili.com/video/] - Clean Bilibili Search tracking events. [search.bilibili.com] - Clean other tracking events (top-menu clicking). [Bilibili] v0.3.8.3 2023.01.20 - Fixed tracking event after video sorting navigation bar items clicked. [space.bilibili.com] v0.3.8.2 2023.01.19 - Fixed navibar items click events [www.bilibili.com/v/popular]. v0.3.8.1 2023.01.13 - Clean more links of Baidu.com v0.3.8 2023.01.06 - Block Card-Ads for Bilibili. (And now blocked banner-ads & card-ads for Bilibili) - Block [Lucky Draw (The Selection)] popup at [live.bilibili.com]. Disabled by default. - (SET [{BlockLivePopups} = true] to enable it.) - The script may add menus to unlock custom setting. v0.3.7.1 2023.01.02 - Fixed [space.bilibili.com] effects after paged, navi-bar clicked or menu-item clicked. - Added support to clean tracking url at [search.bilibili.com]. v0.3.7 2023-01-02 - Naming optimisation. - Script handling optimisation. (Bilibili) - Added support to block part of Bilibili Ads. v0.3.6 2022.12.28 - Optimise Baidu related search URL, paging URL processing method. v0.3.5 2022.12.27 - Script logic optimisation. v0.3.4 2022.12.23 - Code optimisation. Fixed script's effect range. [Bilibili] v0.3.3 2022.12.23 - Added site support:Clean Baidu <Related Search> URLs. - Script optimisations. [space.bilibili.com] v0.3.2 2022.12.22 - Restore pushstate session (address bar url display, replace history). [Bilibili] - Minor optimisations. [Bilibili] v0.3.1 2022.12.22 - Optimized the effective range. [Bilibili] v0.3 2022.12.22 - Added Bilibili Home page, Popular/Rank page, now it can takeeffect on most pages. [Bilibili] v0.2 2022.12.21 - Added missing tags. [Bilibili] v0.1 2022.12.20 - Initial release. */