xiaohack's Blog - UserScript
type: channel
link: https://blog.xiaohack.org/tag/userscript/
items: 分享一个 Google Ai Studio 自动打开雪花特效油猴脚本
items: 【油猴脚本】让 Grok 免费账户使用 Grok 4 Fast
items: 【72 的小玩意 002】油猴脚本：弹窗中包含指定域名自动点击继续按钮
items: 工行马钞的自动填充器，自动填表功能基于纪念币戳的逻辑实现，理论上其他场景也能适用。
items: [ChatGPT] 自定义问候语 [油猴脚本]
items: Gemini 主题同步助手 [油猴脚本]
items: Genspark plus 用户大香蕉不给免费的 4k 了，现在 80 积分一次
items: 这才是 codex+chrome-dev 的正确用途

分享一个 Google Ai Studio 自动打开雪花特效油猴脚本
type: item
date: 2026-01-20T10:46:03+08:00
description: 日常问很多生活问题和一些小代码问题一般很喜欢用 Google Ai Studio，里面的回复也很不错，冬天的时候上了一个可以打开雪花特效的按钮，雪花特效挺好看的，但是每次都需要手动打开，刷新一下又没有了，让 AI 写了个脚本可以自动打开，每次刷新会自动打开，挺不错的// ==UserScript== // @name Google AI Studio - Auto Snow // @namespace http://tampermonkey.net/ // @version 1.0 // @description 自动开启 Google AI Studio 的 Let it snow 特效 // @author You // @match https://aistudio.google.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=google.com // @grant none // ==/UserScript== (function() { 'use strict'; // 定义检测器 const clickSnowButton = () => { // 在页面中查找所有可能的按钮或菜单项 // 因为 Google 的类名经常变，我们直接找包含 "Let it snow" 文字的元素 // 或者查找特定的图标/按钮位置（这里使用最通用的文本匹配法） const allElements = document.querySelectorAll('button, div[role="button"], span, li'); for (let el of allElements) { // 忽略大小写，查找包含 Let it snow 的元素 if (el.textContent && el.textContent.toLowerCase().includes('let it snow')) { // 找到后点击 console.log('Found Snow button, clicking...', el); el.click(); // 只有点击成功后才清除定时器，防止元素还没加载出来 return true; } } return false; }; // 使用定时器循环检查，因为 AI Studio 是动态加载的，按钮可能不会一开始就出现 const checkInterval = setInterval(() => { const success = clickSnowButton(); if (success) { // 如果成功点击了，就停止检查，避免重复点击（导致又关掉了） clearInterval(checkInterval); } }, 1000); // 每秒检查一次 // 设置一个超时，比如 30 秒后还没找到就停止，省点资源 setTimeout(() => { clearInterval(checkInterval); }, 30000); })(); 📌 转载信息来源： https://linux.do/t/topic/1485675转载时间： 2026/1/20 10:46:02

【油猴脚本】让 Grok 免费账户使用 Grok 4 Fast
type: item
date: 2026-01-19T17:37:21+08:00
description: 关于 Agentic 搜索，七步以外，Grok 4 Fast 准，七步以内，Grok 4 Fast 又快又准。搜索准确性这块，目前我觉得除了 GPT thinking 以外，没人能跟 Grok Fast 系列抗衡，速度和 NSFW 支持就更是独一档了。但自从 Grok 4.1 进入 Beta 之后，免费账户网页调用 Grok 4 Fast 的入口就被取消了。Grok 非 Fast 系列的搜索体验简直可以说是稀烂，比不上 Fast 一根，xAI 你真该死啊，于是我写了：// ==UserScript== // @name Grok 4 Fast Unlock // @namespace http://tampermonkey.net/ // @version 3.3 // @description 使 Grok 免费账号使用 Grok 4 Fast // @author MUTED64 // @match https://grok.com/* // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; const TARGET_MODEL = 'grok-4-mini-thinking-tahoe'; const TARGET_MODE = 'MODEL_MODE_GROK_4_MINI_THINKING'; const DISPLAY_NAME = 'Grok 4 Fast'; let isMiniThinkingEnabled = false; let lastOfficialModelName = ''; const originalFetch = window.fetch; window.fetch = async function(...args) { let [url, options] = args; const urlStr = (typeof url === 'string') ? url : (url?.url || ''); if (isMiniThinkingEnabled && urlStr && (urlStr.includes('/conversations/new') || (urlStr.includes('/conversations/') && urlStr.includes('/messages')))) { if (options && options.body) { try { const bodyData = JSON.parse(options.body); if (bodyData.modelName) { bodyData.modelName = TARGET_MODEL; bodyData.modelMode = TARGET_MODE; options.body = JSON.stringify(bodyData); console.log(`[Grok Enhanced] 拦截: 已使用 `); } } catch (e) {} } } return originalFetch.apply(this, [url, options]); }; function ensureMenuItem(menu) { if (menu.querySelector('#mini-thinking-option')) return; const template = menu.querySelector('[role="menuitem"]'); if (!template) return; const newItem = template.cloneNode(true); newItem.id = 'mini-thinking-option'; const title = newItem.querySelector('.font-semibold'); if (title) title.textContent = DISPLAY_NAME; const desc = newItem.querySelector('.text-xs.text-secondary'); if (desc) desc.textContent = 'Grok 4 Fast'; menu.prepend(newItem); } function syncUI() { const menu = document.querySelector('[role="menu"]'); const trigger = document.querySelector('#model-select-trigger') |…

分享一个 Google Ai Studio 自动打开雪花特效油猴脚本
type: item
date: 2026-01-19T17:37:05+08:00
description: 日常问很多生活问题和一些小代码问题一般很喜欢用 Google Ai Studio，里面的回复也很不错，冬天的时候上了一个可以打开雪花特效的按钮，雪花特效挺好看的，但是每次都需要手动打开，刷新一下又没有了，让 AI 写了个脚本可以自动打开，每次刷新会自动打开，挺不错的// ==UserScript== // @name Google AI Studio - Auto Snow // @namespace http://tampermonkey.net/ // @version 1.0 // @description 自动开启 Google AI Studio 的 Let it snow 特效 // @author You // @match https://aistudio.google.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=google.com // @grant none // ==/UserScript== (function() { 'use strict'; // 定义检测器 const clickSnowButton = () => { // 在页面中查找所有可能的按钮或菜单项 // 因为 Google 的类名经常变，我们直接找包含 "Let it snow" 文字的元素 // 或者查找特定的图标/按钮位置（这里使用最通用的文本匹配法） const allElements = document.querySelectorAll('button, div[role="button"], span, li'); for (let el of allElements) { // 忽略大小写，查找包含 Let it snow 的元素 if (el.textContent && el.textContent.toLowerCase().includes('let it snow')) { // 找到后点击 console.log('Found Snow button, clicking...', el); el.click(); // 只有点击成功后才清除定时器，防止元素还没加载出来 return true; } } return false; }; // 使用定时器循环检查，因为 AI Studio 是动态加载的，按钮可能不会一开始就出现 const checkInterval = setInterval(() => { const success = clickSnowButton(); if (success) { // 如果成功点击了，就停止检查，避免重复点击（导致又关掉了） clearInterval(checkInterval); } }, 1000); // 每秒检查一次 // 设置一个超时，比如 30 秒后还没找到就停止，省点资源 setTimeout(() => { clearInterval(checkInterval); }, 30000); })(); 📌 转载信息来源： https://linux.do/t/topic/1485675转载时间： 2026/1/19 17:37:04

【72 的小玩意 002】油猴脚本：弹窗中包含指定域名自动点击继续按钮
type: item
date: 2026-01-18T19:00:22+08:00
description: 跳转到 GitHub 也要手动点击 继续 按钮，觉得太烦了，Vibe 了这个小脚本// ==UserScript== // @name Auto Click Popup Continue // @namespace http://tampermonkey.net/ // @version 1.0 // @description 当弹窗中包含指定域名时，自动点击弹窗中的"继续"按钮 // @author Your Name // @match https://linux.do/* // @grant none // @run-at document-start // ==/UserScript== (function () { "use strict"; // 配置：需要检测的域名列表（支持正则表达式） const TARGET_DOMAINS = ["github.com", "github.com/", "githubusercontent.com"]; // 标记状态 let hasClicked = false; let clickCooldown = false; // 弹窗选择器关键词 const popupSelectors = [ '[class*="modal"]', '[class*="popup"]', '[class*="dialog"]', '[class*="overlay"]', '[class*="layer"]', '[role="dialog"]', '[role="alertdialog"]', ".modal", ".popup", ".dialog", ".overlay", '[aria-modal="true"]', ".el-dialog", ".ant-modal", ".ivu-modal", ".layui-layer", ".sweet-alert", ".swal-modal", ]; // 检查文本是否包含目标域名 function containsTargetDomain(text) { if (!text) return false; // 支持正则表达式匹配 for (const domain of TARGET_DOMAINS) { try { // 如果是正则表达式格式 if (domain.startsWith("/") && domain.endsWith("/")) { const regex = new RegExp(domain.slice(1, -1)); if (regex.test(text)) return true; } else { // 普通字符串匹配 if (text.includes(domain)) return true; } } catch (e) { // 正则表达式错误时回退到普通匹配 if (text.includes(domain)) return true; } } return false; } // 在容器中检测是否包含目标域名 function containsDomainInContainer(container) { // 检查所有链接 const links = container.querySelectorAll("a[href]"); for (const link of links) { const href = link.getAttribute("href") || ""; if (containsTargetDomain(href)) { console.log("检测到目标域名:", href); return true; } } // 检查所有文本节点 const walker = document.createTreeWalker( container, NodeFilter.SHOW_TEXT, null, false, ); let node; while ((node = walker.nextNode())) { const text = node.textContent || ""; if (containsTargetDomain(text)) { console.log("检测到目标域名文本:", text.substring(0, 100)); return true; } } // 检查特定元素的内容 const elements = container.querySelectorAll( "[data-url], [href], [src], .url, .link", ); for (const elem of elements) { const content =…

工行马钞的自动填充器，自动填表功能基于纪念币戳的逻辑实现，理论上其他场景也能适用。
type: item
date: 2026-01-14T10:47:28+08:00
description: // ==UserScript== // @name 工商银行纪念币预约自动填表 // @namespace http://tampermonkey.net/ // @version 1.1 // @description 自动填充工商银行纪念币预约表单（含地区选择） // @match *://*.icbc.com.cn/* // @grant none // ==/UserScript== (function() { 'use strict'; const CONFIG = { custName: '', // 客户姓名 paperNum: '', // 证件号码 mobileno: '', // 手机号码 exchangeQuanlity: '20', // 预约数量 province: '天津市', // 省份 city: '天津市', // 城市 district: '静海区', // 区县 branch: '', // 网点 exchangeTime: '2026-01-20' // 兑换时间 }; // ================================================ function fillInput(placeholder, value) { const inputs = document.querySelectorAll('input.el-input__inner'); for (const input of inputs) { if ((input.placeholder || '').includes(placeholder)) { input.value = value; input.dispatchEvent(new Event('input', { bubbles: true })); return true; } } return false; } async function selectDropdown(placeholder, optionText) { const inputs = document.querySelectorAll('input.el-input__inner[readonly]'); for (const input of inputs) { if ((input.placeholder || '').includes(placeholder)) { input.click(); await new Promise(r => setTimeout(r, 1)); const items = document.querySelectorAll('.el-select-dropdown__item:not(.is-disabled)'); for (const item of items) { if (item.textContent.includes(optionText)) { item.click(); await new Promise(r => setTimeout(r, 1)); return true; } } } } return false; } async function fillForm() { // 填充文本输入框 fillInput('客户姓名', CONFIG.custName); fillInput('证件号码', CONFIG.paperNum); fillInput('手机号码', CONFIG.mobileno); fillInput('预约数量', CONFIG.exchangeQuanlity); // 填充下拉选择框 await selectDropdown('省份', CONFIG.province); await selectDropdown('城市', CONFIG.city); await selectDropdown('区县', CONFIG.district); await selectDropdown('网点', CONFIG.branch); await selectDropdown('兑换时间', CONFIG.exchangeTime); console.log('表单已填充'); } function addButton() { const btn = document.createElement('button'); btn.textContent = '手动填充'; btn.style.cssText = 'position:fixed;top:10px;right:10px;z-index:9999;padding:10px 20px;background:#409…

[ChatGPT] 自定义问候语 [油猴脚本]
type: item
date: 2026-01-12T15:39:34+08:00
description: 开发缘由 ChatGPT 有的问候语，会显示用户名！例如：用户名为：CloseAI功能：将 ChatGPT 首页问候语换成自定义文案！适合：遮挡问候语中的用户名！根据自身喜好，自定义问候语！效果：宽屏:窄屏:源码： github.com/0-V-linuxdo/ChatGPT-Greeting-Customizer userscript/%5BChatGPT%5D%20Greeting%20Customizer.user.jsmain// ==UserScript== // @name [ChatGPT] Greeting Customizer [20260112] v1.0.0 // @name:zh-CN [ChatGPT] 问候语自定义 [20260112] v1.0.0 // @namespace https://github.com/0-V-linuxdo/ChatGPT-Greeting-Customizer // @description Replace the ChatGPT home greeting with your own custom text. // @description:zh-CN 将 ChatGPT 首页问候语换成自定义文案！ // // @version [20260112] v1.0.0 // // @match https://chatgpt.com/* // // @grant GM_addStyle // @run-at document-start // ==/UserScript== (function() { 'use strict'; // 使用 \a 实现 CSS 内部换行，对应文本中的 "—" 之前 const line1 = "Ask not what your country can do for you"; 此文件已被截断。 显示原始文件 📌 转载信息来源： https://linux.do/t/topic/1431360转载时间： 2026/1/12 15:39:26

Gemini 主题同步助手 [油猴脚本]
type: item
date: 2026-01-12T10:12:45+08:00
description: 开发缘由：gemini 老是把主题自动切成黑色 搞七捻三打开的时候，页面加载卡顿， 手动刷新几次，就变成黑暗模式了（参考：https://linux.do/t/topic/1427584功能：自动同步 Gemini 主题与系统主题，防止页面加载时主题突变 源码 // ==UserScript== // @name Gemini 主题同步助手 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 自动同步 Gemini 主题与系统主题，防止页面加载时主题突变 // @author Assistant // @match https://gemini.google.com/* // @run-at document-start // @grant none // ==/UserScript== (function() { 'use strict'; // 防止在 iframe 中运行 if (window.self !== window.top) { return; } // ==================== 配置常量 ==================== const THEME_KEY = 'Bard-Color-Theme'; const DEBUG = false; // 设为 true 可开启调试日志 // ==================== 工具函数 ==================== /** * 调试日志输出 * @param {...any} args - 日志参数 */ function log(...args) { if (DEBUG) { console.log('[Gemini主题同步]', ...args); } } /** * 获取系统主题是否为深色模式 * 使用 CSS Media Query API 检测系统级别的主题偏好 * @returns {boolean} true 表示系统为深色模式，false 表示浅色模式 */ function getSystemThemeIsDark() { try { return window.matchMedia('(prefers-color-scheme: dark)').matches; } catch (e) { // 如果 matchMedia 不可用，默认返回 false（浅色模式） log('matchMedia API 不可用，默认使用浅色模式'); return false; } } /** * 解析存储的主题值，判断是否为深色模式 * Gemini 的主题值通常包含 "Light" 或 "Dark" 字符串 * * @param {string} value - localStorage 中存储的主题值 * @returns {boolean|null} * - true: 深色模式 * - false: 浅色模式 * - null: 无法判断（值为空或不包含可识别的主题标识） */ function parseStoredTheme(value) { // 空值检查 if (!value || typeof value !== 'string') { return null; } // 转换为小写进行不区分大小写的匹配 const lowerValue = value.toLowerCase(); // 检查是否包含深色模式标识 if (lowerValue.includes('dark')) { return true; } // 检查是否包含浅色模式标识 if (lowerValue.includes('light')) { return false; } // 无法识别的值 return null; } /** * 主函数：同步主题与系统设置 * * 逻辑流程： * 1. 检查 localStorage 中是否存在主题设置 * 2. 如果存在，获取系统当前主题偏好 * 3. 对比两者是否一致 * 4. 不一致时删除存储的主题值，让页面使用系统默认主题 */ function syncThemeWithSystem() { try { // ========== 步骤1: 读取存储的主题 ========== const storedTheme = localStorage.getItem(THEME_KEY); // 如果不存在存储的主题，说明页面会使用默认行为，无需干预 if (!storedTheme) { log('未检测到存储的主题，跳过处理'); return; } log('检测到存储的主题:', storedT…

Genspark plus 用户大香蕉不给免费的 4k 了，现在 80 积分一次
type: item
date: 2025-12-30T12:10:09+08:00
description: 但好在 2k 还是免费只能搞个自动切换 2k 了 greasyfork.org Genspark Nano Banana Auto 2KAuto-select 2K image size on https://www.genspark.ai/agents?type=moa_generate_image 代码 // ==UserScript== // @name Genspark Nano Banana Auto 2K // @namespace https://genspark.ai/ // @version 0.1.0 // @description Auto-select 2K image size on https://www.genspark.ai/agents?type=moa_generate_image // @match https://www.genspark.ai/agents* // @match https://genspark.ai/agents* // @run-at document-idle // @grant none // ==/UserScript== (function () { 'use strict'; const TARGET_TYPE = 'moa_generate_image'; const TARGET_SIZE_LABEL = '2K'; const DEBUG = false; const LOG_PREFIX = '[Genspark Auto 2K]'; const log = (...args) => { if (!DEBUG) return; // eslint-disable-next-line no-console console.log(LOG_PREFIX, ...args); }; const normalizeText = (text) => (text || '').replace(/\s+/g, ' ').trim(); const isTargetPage = () => { try { const url = new URL(location.href); return url.pathname === '/agents' && url.searchParams.get('type') === TARGET_TYPE; } catch { return false; } }; const safeClick = (el) => { if (!el) return false; const rect = typeof el.getBoundingClientRect === 'function' ? el.getBoundingClientRect() : null; const x = rect ? Math.floor(rect.left + rect.width / 2) : 0; const y = rect ? Math.floor(rect.top + rect.height / 2) : 0; if (typeof PointerEvent === 'function' && rect && rect.width > 0 && rect.height > 0) { el.dispatchEvent( new PointerEvent('pointerdown', { bubbles: true, cancelable: true, view: window, pointerType: 'mouse', isPrimary: true, clientX: x, clientY: y, button: 0, buttons: 1, }) ); el.dispatchEvent( new PointerEvent('pointerup', { bubbles: true, cancelable: true, view: window, pointerType: 'mouse', isPrimary: true, clientX: x, clientY: y, button: 0, buttons: 0, }) ); } el.dispatchEvent( new MouseEvent('click', { bubbles: true, cancelable: true, view: window, clientX: x, clientY: y, button: 0, }) ); return true; }; const waitFor = (predicate, { timeoutMs = 15_000, pollMs = 250 } …

这才是 codex+chrome-dev 的正确用途
type: item
date: 2025-12-30T10:23:34+08:00
description: 全自动看网课 （（支持倍速））这才是真正得解放了我的生产力，解决了某些网站没有脚本自动完成的难题另外补一个 timer hooker 脚本（源自油猴某大佬，适用于所有网站加速）// ==UserScript== // @name 计时器掌控者|视频广告跳过|视频广告加速器 // @name:en TimerHooker // @namespace https://gitee.com/HGJing/everthing-hook/ // @version 1.0.62 // @description 控制网页计时器速度|加速跳过页面计时广告|视频快进（慢放）|跳过广告|支持几乎所有网页. // @description:en it can hook the timer speed to change. // @include * // @require https://greasyfork.org/scripts/372672-everything-hook/code/Everything-Hook.js?version=881251 // @author Cangshi // @match http://*/* // @run-at document-start // @grant none // @license GPL-3.0-or-later // @downloadURL https://update.greasyfork.org/scripts/372673/%E8%AE%A1%E6%97%B6%E5%99%A8%E6%8E%8C%E6%8E%A7%E8%80%85%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E8%B7%B3%E8%BF%87%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E5%8A%A0%E9%80%9F%E5%99%A8.user.js // @updateURL https://update.greasyfork.org/scripts/372673/%E8%AE%A1%E6%97%B6%E5%99%A8%E6%8E%8C%E6%8E%A7%E8%80%85%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E8%B7%B3%E8%BF%87%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E5%8A%A0%E9%80%9F%E5%99%A8.meta.js // ==/UserScript== /** * --------------------------- * Time: 2017/11/20 19:28. * Author: Cangshi * View: http://palerock.cn * --------------------------- */ /** * 1. hook Object.defineProperty | Object.defineProperties * 2. set configurable: true * 3. delete property * 4. can set property for onxx event method */ window.isDOMLoaded = false; window.isDOMRendered = false; document.addEventListener('readystatechange', function () { if (document.readyState === "interactive" || document.readyState === "complete") { window.isDOMLoaded = true; } }); ~function (global) { var workerURLs = []; var extraElements = []; var suppressEvents = {}; var helper = function (eHookContext, timerContext, util) { return { applyUI: function () { var style = '._th-container ._th-item{margin-bottom:3px;position:relative;width:0;height:0;cursor:pointer;opacity:.3;background-color:aquamarine;border-radius:100%;text-align:center;line-height:…