// ==UserScript== // @name 移除广告内嵌脚本 // @namespace https://greasyfork.org/zh-CN/users/1373566 // @version 1.5.1.5 // @license MIT // @description 这是一个由AI生成的脚本,通过关键词匹配来移除网页中的内嵌广告脚本。不能保证100%成功,可以在脚本菜单中管理排除的网页和关键词,脚本已经内置一些常见的关键词,若还有广告,可以自行添加Math.random,platform,navigator,new Function,new Date()尝试去除。 // @author copilot & cheatgpt // @match http*://*/* // @exclude *://*.github.com/* // @exclude *://scriptcat.org/* // @exclude *://greasyfork.org/* // @exclude *://github.com/* // @exclude *://*.google.*/* // @exclude *://x.com/* // @exclude *://twitter.com/* // @exclude *://*.bing.*/* // @exclude *://*.baidu.*/* // @exclude *://*.yandex.*/* // @exclude *://*.iqiyi.com/* // @exclude *://*.qq.com/* // @exclude *://*.v.qq.com/* // @exclude *://*.sohu.com/* // @exclude *://*.mgtv.com/* // @exclude *://*.ifeng.com/* // @exclude *://*.pptv.com/* // @exclude *://*.sina.com.cn/* // @icon data:image/png;base64,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 // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @run-at document-start // ==/UserScript== (function() { 'use strict'; const REMOVE_AD_SCRIPTS_KEYWORDS_KEY = 'removeAdScriptsKeywords'; const EXCLUDE_SITES_KEY = 'excludeSites'; const DEFAULT_KEYWORDS = [ 'htmlAds', '_ffc1();', '_ffc2();', '_ffc3();', '_ffc4();', '_ffp();', 'kbbaidu1();', 'kbbaidu2();', 'kbbaidu3();', 'html5player.checkVideoAds', 'ads_codes', '{return void 0!==b[a]?b[a]:a}).join("")}', '-${scripts[randomIndex]}', '-${scripts[Math.random()', '"https://"+Date.parse(new Date())+', '"https://"+(new Date().getDate())+', 'https://hongosi.xn--', 'https://{randomstr}.', 'new Function(t)()', 'new Function(b)()', 'new Function(c)()', 'new Function(t);', 'new Function(b);', 'new Function(c);', 'new Function(\'d\',e)', 'new Function(document[', 'function updateCarousel()', 'Math.floor(2147483648 * Math.random());', 'Math.floor(Math.random()*url.length)', 'Math.floor(Math.random() * urls.length)', 'new Date()[\'getTime\']()', 'Math.floor(((new Date()).getTime()', '&&navigator[', '=navigator;', 'navigator.platform){setTimeout(function', 'disableDebugger', 'blockDeveloperTools', '["Date"]())[\'getTime\']()', '\');', '<\\/\'+\'s\'+\'c\'+\'ri\'+\'pt\'+\'>\');', 'class=\\"zdhf\\"', '(\'#htmlContenthtml\').html', 'D.createElement(\'span\');', 'class=\\"app_tj\\"', 'window.$m(', 'jsjiami.com.v4', 'histats.com', 'pc.stgowan.com' ]; let keywords = GM_getValue(REMOVE_AD_SCRIPTS_KEYWORDS_KEY, []); let excludeList = GM_getValue(EXCLUDE_SITES_KEY, []); let removedScriptsInfo = []; const saveKeywords = () => GM_setValue(REMOVE_AD_SCRIPTS_KEYWORDS_KEY, keywords); const saveExcludeList = () => GM_setValue(EXCLUDE_SITES_KEY, excludeList); const createStyledElement = (tagName, styles) => { const element = document.createElement(tagName); Object.assign(element.style, styles); return element; }; const getKeywordsForCurrentSite = () => { const siteKeywords = keywords .filter(k => k.startsWith(`${window.location.hostname}:`)) .map(k => k.split(':').slice(1).join(':')); return siteKeywords.length > 0 ? siteKeywords : DEFAULT_KEYWORDS; }; const removeSpecificScript = () => { if (excludeList.includes(window.location.hostname)) { console.log('Site excluded:', window.location.hostname); return; } const currentKeywords = getKeywordsForCurrentSite(); document.querySelectorAll('script').forEach(script => { const matchedKeywords = currentKeywords.filter(k => script.innerHTML.includes(k)); if (matchedKeywords.length) { removedScriptsInfo.push({ keywords: matchedKeywords, content: script.innerHTML }); script.remove(); console.log('Removed script:', script); } }); }; const addKeyword = () => { const newKeyword = prompt('请输入要添加的关键词:'); if (newKeyword) { const siteKeyword = `${window.location.hostname}:${newKeyword}`; if (!keywords.some(k => k.startsWith(`${window.location.hostname}:`))) { keywords.push(...DEFAULT_KEYWORDS.map(k => `${window.location.hostname}:${k}`)); } keywords.push(siteKeyword); saveKeywords(); alert(`关键词已添加: ${newKeyword}`); } }; const showKeywords = () => alert('当前关键词:\n' + getKeywordsForCurrentSite().join('\n')); const showRemovedScriptsInfo = () => { if (!removedScriptsInfo.length) return alert('没有移除任何脚本。'); const info = removedScriptsInfo.map((item, i) => `脚本 ${i + 1}:\n匹配关键词: ${item.keywords.join(', ')}\n脚本内容:\n${item.content.slice(0, 1000)}\n` ).join('\n'); alert('移除的脚本信息:\n\n' + info); }; const manageSite = operation => { const site = window.location.hostname; if (operation === 'exclude' && !excludeList.includes(site)) { excludeList.push(site); saveExcludeList(); alert(`当前网址已排除: ${site}`); } else if (operation === 'add' && excludeList.includes(site)) { excludeList = excludeList.filter(s => s !== site); saveExcludeList(); alert(`当前网址已从排除列表移除: ${site}`); } else { alert(`当前网址${operation === 'exclude' ? '已在' : '不在'}排除列表中`); } }; const editKeywords = () => { const overlay = createStyledElement('div', { position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: 'rgba(0,0,0,0.5)', zIndex: '9998' }); const container = createStyledElement('div', { position: 'fixed', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', zIndex: '9999', width: '80vw', maxWidth: '600px', backgroundColor: '#f8f9fa', borderRadius: '8px', padding: '20px' }); const editor = createStyledElement('textarea', { width: '100%', height: '300px', border: '2px solid #4a90e2', borderRadius: '4px', padding: '15px', fontFamily: 'monospace', fontSize: '14px' }); const buttonContainer = createStyledElement('div', { display: 'flex', gap: '10px', marginTop: '15px', justifyContent: 'flex-end' }); const buttonStyle = { padding: '8px 20px', color: 'white', border: 'none', borderRadius: '4px', cursor: 'pointer', fontSize: '14px' }; editor.value = getKeywordsForCurrentSite().join('\n'); const saveButton = createStyledElement('button', { ...buttonStyle, backgroundColor: '#4CAF50' }); saveButton.textContent = '保存'; saveButton.onclick = () => { keywords = keywords.filter(k => !k.startsWith(`${window.location.hostname}:`)) .concat(editor.value.split('\n').map(k => k.trim()).filter(k => k).map(k => `${window.location.hostname}:${k}`)); saveKeywords(); document.body.removeChild(overlay); document.body.removeChild(container); alert('关键词已更新'); }; const resetButton = createStyledElement('button', { ...buttonStyle, backgroundColor: '#f44336' }); resetButton.textContent = '重置'; resetButton.onclick = () => { if (confirm('确定重置为默认关键词?')) { keywords = keywords.filter(k => !k.startsWith(`${window.location.hostname}:`)); editor.value = DEFAULT_KEYWORDS.join('\n'); saveKeywords(); alert('已恢复默认关键词'); } }; buttonContainer.append(saveButton, resetButton); container.append(editor, buttonContainer); document.body.append(overlay, container); }; const showInlineScripts = () => { const scripts = Array.from(document.querySelectorAll('script')) .filter(s => s.innerHTML.trim()) .map((s, i) => `脚本 ${i + 1}:\n${s.innerHTML.trim()}\n`) .join('\n'); alert(scripts ? '网页中的内嵌脚本:\n\n' + scripts : '没有找到内嵌脚本'); }; const cleanGMData = () => { const siteMap = {}; keywords.forEach(k => { const [site, ...rest] = k.split(':'); const key = rest.join(':'); siteMap[site] = siteMap[site] || new Set(); siteMap[site].add(key); }); const sites = Object.keys(siteMap); if (!sites.length) return alert('没有找到任何网站数据'); const overlay = createStyledElement('div', { position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: 'rgba(0,0,0,0.5)', zIndex: '9998' }); const container = createStyledElement('div', { position: 'fixed', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', zIndex: '9999', width: '80vw', maxWidth: '600px', backgroundColor: '#f8f9fa', borderRadius: '8px', padding: '20px', maxHeight: '80vh', overflowY: 'auto' }); const title = createStyledElement('h3', { margin: '0 0 15px 0', color: '#212529' }); title.textContent = '选择清理方式'; const select = createStyledElement('select', { width: '100%', padding: '8px', marginBottom: '15px', borderRadius: '4px', border: '1px solid #4a90e2' }); select.innerHTML = ''; const siteSelectContainer = createStyledElement('div', { display: 'none', marginBottom: '15px' }); const siteSelect = createStyledElement('select', { width: '100%', padding: '8px', borderRadius: '4px', border: '1px solid #4a90e2' }); siteSelect.innerHTML = '' + sites.map(s => ``).join(''); siteSelectContainer.appendChild(siteSelect); select.onchange = () => siteSelectContainer.style.display = select.value === 'specific' ? 'block' : 'none'; const buttonContainer = createStyledElement('div', { display: 'flex', gap: '10px', justifyContent: 'flex-end' }); const buttonStyle = { padding: '8px 20px', color: 'white', border: 'none', borderRadius: '4px', cursor: 'pointer', fontSize: '14px' }; const confirmButton = createStyledElement('button', { ...buttonStyle, backgroundColor: '#4CAF50' }); confirmButton.textContent = '确认'; confirmButton.onclick = () => { const mode = select.value; let report = 'GM数据清理报告:\n\n'; let cleanedCount = 0; const defaultSet = new Set(DEFAULT_KEYWORDS); if (mode === 'all') { if (!confirm('确定要清理所有与默认关键词一致的数据吗?')) return; const sitesToRemove = []; for (const site in siteMap) { const siteKeywords = siteMap[site]; const isExactMatch = siteKeywords.size === defaultSet.size && [...siteKeywords].every(k => defaultSet.has(k)) && [...defaultSet].every(k => siteKeywords.has(k)); report += `网站: ${site}\n关键词数量: ${siteKeywords.size}\n`; if (isExactMatch) { sitesToRemove.push(site); cleanedCount++; } else { if (siteKeywords.size !== defaultSet.size) { report += `原因: 数量不匹配 (默认: ${defaultSet.size}, 网站: ${siteKeywords.size})\n`; } const extraKeywords = [...siteKeywords].filter(k => !defaultSet.has(k)); const missingKeywords = [...defaultSet].filter(k => !siteKeywords.has(k)); if (extraKeywords.length > 0) { report += `原因: 多余关键词: ${extraKeywords.join(', ')}\n`; } if (missingKeywords.length > 0) { report += `原因: 缺少关键词: ${missingKeywords.join(', ')}\n`; } report += '\n'; } } if (cleanedCount) { keywords = keywords.filter(k => !sitesToRemove.some(s => k.startsWith(`${s}:`))); saveKeywords(); report += `共清理 ${cleanedCount} 个与默认关键词一致的网站数据`; } else { report += '没有找到与默认关键词完全一致的网站数据'; } } else if (mode === 'specific') { const selectedSite = siteSelect.value; if (!selectedSite) return alert('请选择一个网站'); if (!confirm(`确定要清理 ${selectedSite} 的关键词数据吗?`)) return; const siteKeywords = siteMap[selectedSite]; report += `网站: ${selectedSite}\n关键词数量: ${siteKeywords.size}\n关键词: ${[...siteKeywords].join(', ')}\n\n`; keywords = keywords.filter(k => !k.startsWith(`${selectedSite}:`)); saveKeywords(); report += `已清理 ${selectedSite} 的所有关键词数据`; cleanedCount = 1; } document.body.removeChild(overlay); document.body.removeChild(container); alert(report); }; const cancelButton = createStyledElement('button', { ...buttonStyle, backgroundColor: '#f44336' }); cancelButton.textContent = '取消'; cancelButton.onclick = () => { document.body.removeChild(overlay); document.body.removeChild(container); }; buttonContainer.append(confirmButton, cancelButton); container.append(title, select, siteSelectContainer, buttonContainer); document.body.append(overlay, container); }; const observer = new MutationObserver(mutations => { mutations.forEach(m => { m.addedNodes.forEach(node => { if (node.tagName === 'SCRIPT') removeSpecificScript(); }); }); }); observer.observe(document.documentElement, { childList: true, subtree: true }); removeSpecificScript(); GM_registerMenuCommand('排除当前网址', () => manageSite('exclude')); GM_registerMenuCommand('拦截当前网址', () => manageSite('add')); GM_registerMenuCommand('添加关键词', addKeyword); GM_registerMenuCommand('显示关键词', showKeywords); GM_registerMenuCommand('编辑关键词', editKeywords); GM_registerMenuCommand('移除脚本日志', showRemovedScriptsInfo); GM_registerMenuCommand('网页内嵌脚本查看', showInlineScripts); GM_registerMenuCommand('GM关键词数据清理', cleanGMData); })();