// ==UserScript== // @name 扩展查找大师 // @name:zh-CN 扩展查找大师 // @name:zh-TW 擴展查找大師 // @name:en Extension Finder Master // @namespace doveboy_js // @version 1.0.0 // @description 在油猴菜单中快速查找适用于当前域名的 Chrome 扩展(支持谷歌商店和Crx搜搜) // @description:zh-CN 在油猴菜单中快速查找适用于当前域名的 Chrome 扩展(支持谷歌商店和Crx搜搜) // @description:zh-TW 在油猴菜單中快速查找適用於當前域名的 Chrome 擴充功能(支持谷歌商店和Crx搜搜) // @description:en Quickly find Chrome extensions for the current domain in the userscript menu (supports Chrome Web Store and CrxSoso) // @author 白鸽男孩 // @icon data:image/png;base64,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 // @license Zlib/Libpng License // @match *://*/* // @exclude *://challenges.cloudflare.com/* // @noframes // @grant GM_registerMenuCommand // @grant GM_openInTab // ==/UserScript== (() => { 'use strict' const win = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window // 1. 注册菜单与打开新标签页的底层封装 function registerMenu(caption, onClick, options) { if (typeof GM_registerMenuCommand === 'function') { return GM_registerMenuCommand(caption, onClick, options) } return 0 } function openInTab(url, options) { if (typeof GM_openInTab === 'function') { GM_openInTab(url, options) return } globalThis.open(url, '_blank') } // 2. 域名智能提取(去除 www.,精准截取二级/三级主域名) function extractDomain(url) { try { let hostname if (url) { try { hostname = new URL(url).hostname } catch (e) { hostname = url } } else { hostname = win.location.hostname } let domain = hostname.replace(/^www\./, '') const parts = domain.split('.') if (parts.length > 2) { const secondLevelDomains = [ 'co', 'com', 'org', 'net', 'edu', 'gov', 'mil', ] const thirdLevelDomain = parts[parts.length - 2] domain = parts.length > 2 && secondLevelDomains.includes(thirdLevelDomain) ? parts.slice(-3).join('.') : parts.slice(-2).join('.') } return domain } catch (e) { return url || win.location.hostname || '' } } // 3. 目标搜索配置 const CONFIG = { REPOSITORIES: [ { id: 'chrome_store', name: '谷歌商店', name_en: 'Chrome Web Store', urlTemplate: 'https://chromewebstore.google.com/search/{domain}?utm_source=ext_app_menu&itemTypes=EXTENSION&minimalRating=4', icon: '🛍️', }, { id: 'crx_soso', name: 'Crx搜搜', name_en: 'CrxSoso', urlTemplate: 'https://www.crxsoso.com/search?keyword={domain}&store=chrome', icon: '🔍', } ] } // 4. 多语言支持 const I18N = { 'zh-CN': '在 {name} 查找“{domain}”的扩展 {icon}', 'zh-TW': '在 {name} 查找“{domain}”的擴充功能 {icon}', 'en': 'Find extensions for "{domain}" on {name} {icon}' } // 自动检测系统语言 function detectLanguage() { const lang = ( navigator.language || navigator.userLanguage || 'en' ).toLowerCase() if (lang.startsWith('zh-tw') || lang.startsWith('zh-hk')) { return 'zh-TW' } if (lang.startsWith('zh')) { return 'zh-CN' } return 'en' } function getMenuText(repo, domain) { const lang = detectLanguage() const template = I18N[lang] || I18N['en'] const repoName = lang.startsWith('zh') ? repo.name : repo.name_en return template .replace('{name}', repoName) .replace('{domain}', domain) .replace('{icon}', repo.icon) } // 5. 初始化:提取当前域名,直接在油猴菜单中注册搜索命令 function initialize() { const domain = extractDomain() if (!domain) return for (const repo of CONFIG.REPOSITORIES) { const url = repo.urlTemplate.replace('{domain}', encodeURIComponent(domain)) const menuText = getMenuText(repo, domain) registerMenu(menuText, () => { openInTab(url, { active: true, insert: true }) }) } } initialize() })()