油猴脚本开发基础

article/2025/8/25 2:44:20

1. 油猴脚本深度解析

1.1 什么是油猴脚本?
  • 本质:基于JavaScript的浏览器扩展脚本
  • 工作原理:在网页加载时注入自定义JS代码
  • 核心能力
    • 修改DOM结构
    • 拦截网络请求
    • 操作浏览器API
    • 存储本地数据
  • 应用场景
    • 广告屏蔽
    • 网页功能增强
    • 自动化操作
    • 数据提取与分析
    • 界面个性化定制
1.2 浏览器支持矩阵
浏览器推荐扩展官方地址
ChromeTampermonkey链接
FirefoxGreasemonkey/Tampermonkey链接
EdgeTampermonkey链接
SafariUserscripts链接

2. 专业开发环境搭建

2.1 编辑器配置(VS Code推荐)
  • 打开油猴访问本地权限
    在这里插入图片描述
  • 接着在油猴设置
    在这里插入图片描述
    在这里插入图片描述
  • 准备开发
    在这里插入图片描述
    注意// @require 链接到你的javascript脚本。
  • vscode测试
console.log("this is a test");

在这里插入图片描述

  • 开启脚本并验证
    在这里插入图片描述
2.2 Tampermonkey 高级功能
  • 脚本沙箱:独立执行环境避免冲突
  • 脚本自动更新:通过@updateURL配置
  • 资源加载@require引入外部库
  • 权限控制@grant管理API访问
  • 运行时机控制@run-at指定注入时机

3. 脚本结构深度剖析

3.1 元数据块详解
// ==UserScript==
// @name         高级脚本示例
// @namespace    https://your-domain.com
// @version      1.2.0
// @description  多功能网页增强工具
// @author       你的名字
// @icon         https://example.com/icon.png
// @match        *://*.taobao.com/*
// @exclude      *://*.taobao.com/payment/*
// @require      https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @connect      api.example.com
// @run-at       document-idle
// @noframes
// ==/UserScript==
3.2 元数据参数权威指南
参数必需描述示例注意事项
@name脚本名称@name 淘宝助手显示在TM面板
@namespace唯一命名空间@namespace https://github.com/yourname防止命名冲突
@version语义化版本@version 1.0.3主版本.次版本.修订号
@description简短描述@description 自动领取优惠券<80字符
@matchURL匹配规则@match *://*.jd.com/*支持通配符*
@exclude排除URL@exclude *://jd.com/checkout*优先级高于@match
@require外部库依赖@require https://code.jquery.com/jquery-3.6.0.min.js先于主脚本加载
@grantAPI权限声明@grant GM_notification未声明将无法使用
@run-at注入时机@run-at document-start可选:document-start, document-end, document-idle(默认)
@noframes禁止iframe@noframes防止在iframe中运行
@connect跨域白名单@connect api.example.com配合GM_xmlhttpRequest使用

4. 脚本编写最佳实践

4.1 安全编码规范
(function() {'use strict'; // 启用严格模式// 错误处理封装function safeDOMOperation(selector, callback) {try {const element = document.querySelector(selector);if (element) callback(element);} catch (e) {console.error(`DOM操作失败: ${e.message}`, e);}}// 主逻辑封装function initScript() {// 1. 移除顶部广告safeDOMOperation('.ad-banner', el => el.remove());// 2. 添加功能按钮safeDOMOperation('.header', header => {const btn = document.createElement('button');btn.textContent = '一键优化';btn.addEventListener('click', optimizePage);header.prepend(btn);});}// 等待页面关键元素加载if (document.readyState === 'loading') {document.addEventListener('DOMContentLoaded', initScript);} else {initScript();}
})();
4.2 脚本生命周期管理
  1. 加载阶段:解析元数据 → 加载@require资源
  2. 注入阶段:根据@run-at选择注入时机
  3. 执行阶段:执行主函数
  4. 卸载阶段:监听页面卸载事件清理资源
// 资源清理示例
const resources = new Set();function addResource(element) {resources.add(element);return element;
}window.addEventListener('beforeunload', () => {resources.forEach(res => res.remove());
});

5. 调试大师课

5.1 调试工具链
工具用途快捷键
Tampermonkey 内置调试器查看脚本运行状态点击TM图标→选择脚本
浏览器开发者工具元素检查/网络分析F12
Console 日志输出调试信息console.log()
Debugger 语句断点调试debugger;
5.2 高级调试技巧
// 1. 带样式的日志输出
console.log('%c脚本状态', 'color: blue; font-weight: bold', {version: '1.0',page: location.href
});// 2. 性能监控
const startTime = performance.now();
// ...执行代码...
console.log(`执行耗时: ${performance.now() - startTime}ms`);// 3. 网络请求监控
const open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {this.addEventListener('load', function() {console.log('XHR请求:', arguments[1], this.response);});open.apply(this, arguments);
};

6. 学习资源推荐

  1. 官方文档

    • Tampermonkey 文档
    • Greasy Fork 脚本规范
  2. 优质教程

    • 油猴脚本开发从入门到精通
    • MDN Web Docs - DOM操作
  3. 实用工具

    • UserScript Generator - 元数据生成器
    • Violentmonkey - 开源替代方案
  4. 脚本市场

    • Greasy Fork
    • OpenUserJS

7. 常见问题解决方案

问题原因解决方案
脚本未执行@match配置错误使用*://*/*测试,逐步缩小范围
DOM操作失效元素动态加载使用MutationObserversetInterval检测
跨域请求失败未声明@connect添加@grant GM_xmlhttpRequest@connect 域名
样式冲突优先级不足使用!important或更具体的选择器
脚本更新延迟缓存问题在脚本URL后添加?v=版本号

http://www.hkcw.cn/article/ldjDVMXpYE.shtml

相关文章

练习:对象数组 1

定义数组存储 3 个商品对象。商品的属性&#xff1a;商品的 id&#xff0c;名字&#xff0c;价格&#xff0c;库存。创建三个商品对象&#xff0c;并把商品对象存入到数组当中。 //对象数组 1 package demo01; public class Goods {private int goodsid;private String goodsN…

Baklib知识中台驱动业务创新

知识中台构建四库体系 Baklib通过打造知识资源库、案例库、规则库及专家库四大核心模块&#xff0c;构建起企业级知识中台的底层架构。其中&#xff0c;知识资源库采用多维度标签体系对文档、报告等结构化与非结构化数据进行分类存储&#xff1b;案例库通过智能抽取技术沉淀业…

“文化人”董宇辉也学会了表演 为消费者争取福利

“文化人”董宇辉也学会了表演 为消费者争取福利。董宇辉在直播间开始“表演”与品牌商谈判的戏码。最近,他在销售某品牌电视时,商家表示要收取最高200元的安装费。董宇辉当场拒绝,表示不合理,并坚持不接受收费。最终,商家负责人现场沟通后决定为所有购买电视的朋友免费安…

H5通用模态框可滚动弹框

弹框要求&#xff1a; 1、弹框图片宽高不限制&#xff0c;自适应 2、关闭按钮固定在图片下方 3、长图时弹框图片可滚动&#xff0c;遮罩层固定 4、点击遮罩层可关闭按钮&#xff0c;不冒泡 图例&#xff1a; 代码 <div class"image-modal" v-if"curSideI…

代码随想录打卡|Day51 图论(dijkstra(堆优化版)精讲、Bellman_ford 算法精讲)

图论part09 dijkstra&#xff08;堆优化版&#xff09;精讲(不熟悉) 代码随想录链接 题目链接 import java.util.*;class Edge {int to; // 邻接顶点int val; // 边的权重Edge(int to, int val) {this.to to;this.val val;} }class MyComparison implements Comparator<…

RS232/485转Profinet网关通讯气体检漏仪案例分享

RS232/485转Profinet网关通讯气体检漏仪案例分享 RS232转Profinet网关作为一种重要的工业通讯设备&#xff0c;其作用是将传统的RS232接口设备转换为现代的Profinet接口&#xff0c;从而实现与现代自动化控制系统的无缝对接&#xff0c;提高系统的集成度和性能。 气体检漏仪作…

电感专题归纳

文章目录 6.2.1 概念6.2.1x 电感电流6.2.2 储能6.2.3 伏秒原则6.2.4 电感元件6.2.5 电感充放电 6.3 换路定则6.4 储能总结6.5 串并联6.5.1 电容串联6.5.2 电容并联6.5.4 电感串联6.5.5电感并联6.5.3 电容与电导 6.6 电容与电感的滤波 电感在电路中的坐拥只有两个字&#xff0c;…

2023-ICLR-ReAct 首次结合Thought和Action提升大模型解决问题的能力

关于普林斯顿大学和Google Research, Brain Team合作的一篇文章, 在语言模型中协同Reasoning推理和Action行动。 论文地址&#xff1a;https://arxiv.org/abs/2210.03629 代码&#xff1a;https://github.com/ysymyth/ReAct.git 其他复现 langchain &#xff1a;https://pytho…

吴艳妮落泪道歉 带伤参赛憾失金牌

5月29日,在亚洲田径锦标赛女子100米栏决赛中,吴艳妮以13秒07的成绩获得铜牌。赛后她走路有些一瘸一拐。在接受采访时,吴艳妮哽咽着向大家道歉:“很感谢你们来现场为我加油,没为中国队拿到这个冠军,很对不起大家。我的伤还没养好,不想为自己过多的解释,我还是觉得我在亚…

群辉(synology)NAS老机器连接出现网页端可以进入,但是本地访问输入一样的账号密码是出现错误时解决方案

群辉&#xff08;synology&#xff09;NAS老机器连接出现网页端可以进入&#xff0c;但是本地访问输入一样的账号密码是出现错误时解决方案 老机器 装的win7 系统 登入后端网页端的时候正常&#xff0c;但是本地访问登入时输入登入网页端一样的密码时候出现问题解决方案 1.登…

力扣每日一题——连接两棵树后最大目标节点数目 ||

目录 题目链接&#xff1a;3373. 连接两棵树后最大目标节点数目 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法一&#xff1a;​​双树贡献分离法​​ Java写法&#xff1a; C写法&#xff1a; 运行时间 时间复杂度和空间复杂度 总结 题目链接&#xff1a;…

国芯思辰| 国产四通道24位生理电采集模拟前端AFE全面替换ADS1294R,心电贴性能再飞跃

心电贴作为一种便捷的可穿戴医疗设备&#xff0c;能够实时、连续地监测心电信号&#xff0c;为心脏健康保驾护航。其中高性能、低功耗的AFE芯片是关键核心部件&#xff0c;集成国产四通道24位AFE的三导联心电贴&#xff0c;不仅更小、更轻、还更准、续航更长、监测维度更多&…

Linux线程池(上)(33)

文章目录 前言一、线程池的概念池化技术线程池的优点线程池的使用场景 二、线程池的实现v1版本v2版本 总结 前言 终于要结束了&#xff0c;写完这篇再来篇有关锁的文章&#xff0c;我们就可以结束 Linux系统编程 部分啦&#xff01; 线程池是一种管理线程的机制&#xff0c;它可…

Python 之图片添加时间戳水印

依赖安装 pip install pillow 原图 随便找个图片作为原图即可&#xff08;比如截图一个桌面背景图&#xff09;。 test.png 添加水印 from PIL import Image, ImageDraw, ImageFont import datetimedef add_timestamp_watermark(image_path, font_size24):# 打开图片imag…

jenkins集成gitlab实现自动构建

jenkins集成gitlab实现自动构建 前面我们已经部署了Jenkins和gitlab&#xff0c;本文介绍将二者结合使用 项目源码上传至gitee提供公网访问&#xff1a;https://gitee.com/ye-xiao-tian/my-webapp 1、创建一个群组和项目 2、添加ssh密钥 #生成密钥 [rootgitlab ~]# ssh-keyge…

深入了解linux系统—— 库的链接和加载

一、目标文件 我们知道源文件经过编译链接形成可执行程序&#xff0c;在Windows下这两个步骤被IDEA封装的很完美&#xff0c;我们使用起来也非常方便&#xff1b; 在Linux中&#xff0c;我们可以通过gcc编译器来完成编译链接这一系列操作。 而源文件经过编译形成.o文件&…

Cesium 8 ,在 Cesium 上实现雷达动画和车辆动画效果,并控制显示和隐藏

目录 ✨前言 一、功能背景 1.1 核心功能概览 1.2 技术栈与工具 二、车辆动画 2.1 模型坐标 2.2 组合渲染 2.3 显隐状态 2.4 模型文件 三、雷达动画 3.1 创建元素 3.2 动画解析 3.3 坐标联动 3.4 交互事件 四、完整代码 4.1 属性参数 4.2 逻辑代码 加载车辆动画…

ElasticSearch简介及常用操作指南

一. ElasticSearch简介 ElasticSearch 是一个基于 Lucene 构建的开源、分布式、RESTful 风格的搜索和分析引擎。 1. 核心功能 强大的搜索能力 它能够提供全文检索功能。例如&#xff0c;在海量的文档数据中&#xff0c;可以快速准确地查找到包含特定关键词的文档。这在处理诸如…

Transformer《Attention is all you need》

发布时间&#xff1a;2017/06/12 发布单位&#xff1a;Google、多伦多⼤学 简单摘要&#xff1a;直译为“变换器”&#xff0c;⼀种采⽤⾃注意⼒机制的深度学习模型&#xff0c;按照输⼊数据各部分重要 性不同⽽分配不同权重。⼴泛⽤于NLP和CV领域。 阅读重点&#xff1a;s…

html+css+js趣味小游戏~HexGL赛车竞速(附源码)

下面是一个简单的记忆卡片配对游戏的完整代码&#xff0c;使用HTML、CSS和JavaScript实现&#xff1a; html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…