// ==UserScript==
// @name 搜索引擎官网净化器
// @namespace http://tampermonkey.net/
// @version 1.2
// @description 自动屏蔽虚假搜索结果,智能保留官方网站
// @author little fool
// @license MIT
// @match *://www.baidu.com/*
// @match *://www.google.com/*
// @match *://www.bing.com/*
// @grant GM_addStyle
// @grant GM.getValue
// @grant GM.setValue
// @grant GM.registerMenuCommand
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js
// ==/UserScript==
(function() {
'use strict';
// 增强样式
GM_addStyle(`
.official-site-mark {
background: linear-gradient(135deg, #4CAF50 0%, #45a049 100%) !important;
color: white !important;
padding: 2px 8px !important;
border-radius: 4px !important;
font-size: 0.8em !important;
margin-left: 10px !important;
animation: fadeInMark 0.5s;
}
@keyframes fadeInMark {
from { opacity: 0; transform: translateY(-5px); }
to { opacity: 1; transform: translateY(0); }
}
.search-result-warning {
position: relative;
background: #fff3e0 !important;
border-left: 4px solid #ffa000 !important;
padding: 12px !important;
margin: 10px 0 !important;
animation: shakeWarning 0.5s;
}
@keyframes shakeWarning {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
.search-result-warning::before {
content: "⚠️ 已屏蔽可疑结果";
display: block;
font-weight: bold;
margin-bottom: 5px;
color: #d32f2f;
}
`);
// 智能配置(新增必应支持)
const SearchEngineConfig = {
'www.baidu.com': {
resultContainer: '#content_left',
resultSelector: '.c-container',
officialMarkers: [
'.c-icon-v',
{ type: 'text', pattern: /官网$/ },
{ type: 'text', pattern: /官方.*网站/ }
],
dangerPatterns: [
/.*彩票.*/,
/.*网赚.*/,
/.*代购.*/,
/虚假.*网站/
],
urlWhitelist: [
/\.gov\.cn$/,
/\.edu\.cn$/,
/\.org\.cn$/,
/\.com\.cn$/,
/^https?:\/\/[^/]+\.cn\//
]
},
'www.google.com': {
resultContainer: '#search',
resultSelector: '.g',
officialMarkers: [
'.VuuXrf',
{ type: 'text', pattern: / - Official Site$/i },
{ type: 'text', pattern: /官网/i }
],
dangerPatterns: [
/.*casino.*/i,
/.*porn.*/i,
/.*pharmacy.*/i
],
urlWhitelist: [
/\.gov$/,
/\.edu$/,
/\.org$/,
/^https?:\/\/[^/]+\.com\//
]
},
'www.bing.com': {
resultContainer: '#b_results',
resultSelector: '.b_algo',
officialMarkers: [
{ type: 'attr', selector: '[aria-label="官方站点"]' },
{ type: 'text', pattern: /官网$/i },
{ type: 'text', pattern: /Official Site/i }
],
dangerPatterns: [
/.*赌博.*/i,
/.*色情.*/i,
/.*诈骗.*/i
],
urlWhitelist: [
/\.gov/,
/\.edu/,
/\.org/
]
}
};
class EnhancedSearchOptimizer {
constructor() {
this.currentEngine = location.hostname;
this.config = SearchEngineConfig[this.currentEngine];
if (!this.config) return;
this.enabled = true;
this.init();
}
async init() {
this.enabled = await GM.getValue('enableFilter', true);
this.setupDOMObserver();
this.processExistingResults();
this.addControlPanel();
this.addMenuCommands();
}
setupDOMObserver() {
this.observer = new MutationObserver(mutations => {
if (!this.enabled) return;
mutations.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.nodeType === 1 && node.matches(this.config.resultSelector)) {
this.analyzeResult(node);
}
});
});
});
const container = document.querySelector(this.config.resultContainer);
if (container) {
this.observer.observe(container, {
childList: true,
subtree: true
});
}
}
processExistingResults() {
if (!this.enabled) return;
$(this.config.resultSelector).each((i, el) => {
if (!el.dataset.processed) {
this.analyzeResult(el);
el.dataset.processed = 'true';
}
});
}
analyzeResult(element) {
if (!this.enabled) return;
const isOfficial = this.checkOfficialMarkers(element);
const isDangerous = this.checkDangerousPatterns(element);
const urlValid = this.checkUrlValidity(element);
if (isDangerous || !urlValid) {
this.markAsSuspicious(element);
} else if (isOfficial) {
this.highlightOfficial(element);
}
}
checkOfficialMarkers(element) {
return this.config.officialMarkers.some(marker => {
if (typeof marker === 'string') {
return element.querySelector(marker) !== null;
}
switch (marker.type) {
case 'text':
return marker.pattern.test(element.textContent);
case 'attr':
return element.querySelector(marker.selector) !== null;
default:
return false;
}
});
}
checkDangerousPatterns(element) {
const text = element.textContent.toLowerCase();
return this.config.dangerPatterns.some(pattern =>
pattern.test(text)
);
}
checkUrlValidity(element) {
const link = element.querySelector('a');
return link && this.config.urlWhitelist.some(pattern =>
pattern.test(link.href)
);
}
markAsSuspicious(element) {
element.style.display = 'none';
const warning = document.createElement('div');
warning.className = 'search-result-warning';
element.parentNode.insertBefore(warning, element);
}
hightlightOfficial(element) {
if (element.querySelector('.official-site-mark')) return;
const mark = document.createElement('span');
mark.className = 'official-site-mark';
mark.textContent = '认证官网';
element.querySelector('h3, h2')?.appendChild(mark);
}
addControlPanel() {
this.panel = document.createElement('div');
this.panel.innerHTML = `
<div style="position:fixed;top:20px;right:20px;background:white;padding:15px;box-shadow:0 2px 10px rgba(0,0,0,0.1);border-radius:8px;z-index:9999">
<h3 style="margin:0 0 12px 0;font-size:16px;">搜索净化控制</h3>
<label style="display:flex;align-items:center;gap:8px;">
<input type="checkbox" id="toggleFilter" ${this.enabled ? 'checked' : ''}>
<span>智能过滤</span>
</label>
</div>
`;
document.body.appendChild(this.panel);
this.panel.querySelector('#toggleFilter').addEventListener('change', async (e) => {
this.enabled = e.target.checked;
await GM.setValue('enableFilter', this.enabled);
this.processExistingResults();
});
}
addMenuCommands() {
GM.registerMenuCommand('切换过滤开关', () => {
this.enabled = !this.enabled;
GM.setValue('enableFilter', this.enabled);
this.panel.querySelector('#toggleFilter').checked = this.enabled;
this.processExistingResults();
});
}
}
// 初始化优化器
new EnhancedSearchOptimizer();
})();