// ==UserScript== // @name SEO 站长助手(快捷脚本) // @namespace https://yestool.org // @version 1.0.0 // @description 在任意页面右侧浮动一个快捷脚本启动器,一键把当前域名丢到 Ahrefs/Similarweb/Google 等工具;支持自定义脚本列表(JSON 管理)。 // @author https://github.com/yestool // @license MIT // @match *://*/* // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant GM_openInTab // @run-at document-idle // @downloadURL https://update.greasyfork.icu/scripts/549035/SEO%20%E7%AB%99%E9%95%BF%E5%8A%A9%E6%89%8B%EF%BC%88%E5%BF%AB%E6%8D%B7%E8%84%9A%E6%9C%AC%EF%BC%89.user.js // @updateURL https://update.greasyfork.icu/scripts/549035/SEO%20%E7%AB%99%E9%95%BF%E5%8A%A9%E6%89%8B%EF%BC%88%E5%BF%AB%E6%8D%B7%E8%84%9A%E6%9C%AC%EF%BC%89.meta.js // ==/UserScript== (function() { 'use strict'; // ---------- Utilities ---------- const SKEY = 'qs_scripts_v1'; const HKEY = 'qs_hidden_v1'; // 简易 eTLD+1 近似:常见多段后缀覆盖,其他场景回退为最后两段 const multiPartTLD = new Set([ 'co.uk','org.uk','ac.uk','gov.uk','co.jp','ne.jp','or.jp','com.au','net.au','org.au','co.nz','org.nz','com.br','com.cn','net.cn','org.cn','gov.cn','edu.cn','com.hk','com.sg' ]); function getDomain(hostname) { hostname = (hostname || location.hostname || '').toLowerCase(); if (!hostname) return ''; const parts = hostname.split('.'); if (parts.length <= 2) return hostname; const last2 = parts.slice(-2).join('.'); const last3 = parts.slice(-3).join('.'); if (multiPartTLD.has(last2)) { // xxx.co.uk 场景 -> 取最后三段 return parts.slice(-3).join('.'); } if (multiPartTLD.has(last3)) { // 极少见更长多段,兜底 return parts.slice(-4).join('.'); } // 普通:取最后两段 return last2; } function openTab(url, active = true) { try { GM_openInTab(url, { active, insert: true }); } catch (e) { window.open(url, '_blank'); } } function $(sel, root=document) { return root.querySelector(sel); } // 读取/初始化脚本定义 function defaultScripts() { return [ { name: "Ahrefs Backlink", type: "func", desc: "Ahrefs Backlink查询", code: ` var domain = window.location.hostname; var ahrefsUrl = 'https://ahrefs.com/backlink-checker?input=' + encodeURIComponent(domain) + '&mode=subdomains'; window.open(ahrefsUrl, '_blank'); ` }, { name: "Ahrefs Site Explorer(domain)", type: "urlTemplate", desc: "用当前域名打开 Ahrefs Site Explorer(需已登录)", urlTemplate: "https://app.ahrefs.com/site-explorer/overview/v2/subdomains/live?target={domain}" }, { name: "Google site:(domain)", type: "urlTemplate", desc: "快速 site: 当前域名", urlTemplate: "https://www.google.com/search?q=site%3A{domain}" }, { name: "Similarweb ", type: "urlTemplate", desc: "查看 Similarweb 站点画像(需已登录)", urlTemplate: "https://pro.similarweb.com/#/digitalsuite/websiteanalysis/overview/website-performance/*/999/1m?webSource=Total&key={domain}" }, { name: "Ahrefs Keyword Difficulty", type: "func", desc: "Ahrefs KD值查询(仅Google搜索页有效)", code: ` var kw=document.querySelector('textarea[name=q]').value; var ahrefsUrl = 'https://ahrefs.com/keyword-difficulty/?country=us&input=' + encodeURIComponent(kw); window.open(ahrefsUrl, '_blank'); ` } ]; } function readScripts() { let scripts = GM_getValue(SKEY, null); if (!scripts || !Array.isArray(scripts) || scripts.length === 0) { scripts = defaultScripts(); GM_setValue(SKEY, scripts); } return scripts; } function saveScripts(scripts) { if (!Array.isArray(scripts)) return; GM_setValue(SKEY, scripts); } // ---------- UI ---------- // 用 Shadow DOM 隔离样式,避免被站点 CSS 污染 const host = document.createElement('div'); host.id = 'qs-launcher-host'; document.documentElement.appendChild(host); const shadow = host.attachShadow({ mode: 'open' }); const style = document.createElement('style'); style.textContent = ` .qs-wrap{ position: fixed; top: 35%; right: 12px; z-index: 2147483647; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial;} .qs-btn{ width: 44px; height: 44px; border-radius: 50%; background: #111; color:#fff; display:flex; align-items:center; justify-content:center; cursor:pointer; box-shadow:0 6px 18px rgba(0,0,0,.25); transition:.2s; } .qs-btn:hover{ transform: translateY(-1px); } .qs-hide{ display:none !important; } .qs-panel{ position: fixed; top: 20%; right: 70px; width: 320px; max-height: 60vh; overflow:auto; background:#fff; color:#111; border:1px solid #e5e7eb; border-radius:12px; box-shadow:0 10px 30px rgba(0,0,0,.15); } .qs-header{ display:flex; align-items:center; justify-content:space-between; padding:10px 12px; border-bottom:1px solid #eee; position:sticky; top:0; background:#fff; z-index:1;} .qs-title{ font-weight:600; font-size:14px;} .qs-actions button{ margin-left:8px; font-size:12px; padding:4px 8px; border:1px solid #e5e7eb; background:#f8fafc; border-radius:8px; cursor:pointer;} .qs-actions button:hover{ background:#eef2f7;} .qs-list{ padding:8px; } .qs-item{ display:flex; flex-direction:column; padding:8px; border-radius:10px; border:1px solid #f1f5f9; margin-bottom:8px; } .qs-item h4{ margin:0 0 6px 0; font-size:14px; } .qs-item p{ margin:0 0 8px 0; font-size:12px; color:#475569;} .qs-run{ align-self:flex-start; padding:6px 10px; border-radius:8px; border:1px solid #e5e7eb; background:#111; color:#fff; cursor:pointer; font-size:12px;} .qs-run:hover{ filter:brightness(1.05); } .qs-empty{ padding:16px; color:#64748b; font-size:13px; } .qs-close{ position:absolute; top:6px; right:8px; background:transparent; border:none; font-size:18px; cursor:pointer; color:#333;} .qs-toggle{ margin-left:8px; font-size:12px; padding:4px 8px; border:1px solid #e5e7eb; background:#fff; border-radius:8px; cursor:pointer;} `; const wrap = document.createElement('div'); wrap.className = 'qs-wrap'; const btn = document.createElement('div'); btn.className = 'qs-btn'; btn.title = '快捷脚本'; btn.textContent = '⚡'; const panel = document.createElement('div'); panel.className = 'qs-panel qs-hide'; panel.innerHTML = `