上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

油猴常用API使用示例

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-6 11:14
  • 签到天数: 253 天

    [LV.8]以坛为家I

    41

    主题

    319

    回帖

    2178

    积分

    荣誉开发者

    累计点滴改进,迈向完美品质。

    积分
    2178

    荣誉开发者油中2周年生态建设者

    发表于 2022-3-17 10:17:06 | 显示全部楼层 | 阅读模式

    Tampermonkey中文文档

    介绍如何使用 Tampermonkey API

    ‎用户脚本标头(部分)

    名称 描述 参数
    name ‎脚本名称 -
    namespace ‎‎脚本命名空间 -
    version ‎‎‎脚本版本 语义化版本规则
    author ‎‎‎脚本作者 -
    description ‎‎‎脚本描述 -
    include ‎‎‎脚本匹配地址 允许正则匹配
    match ‎‎‎脚本匹配地址 使用*表示通配,使用更严格
    exclude 排除脚本匹配地址 -
    require 引入外部JS文件 指向脚本开始运行之前加载并执行的 JavaScript 文件
    resource 预加载资源 预加载的资源由GM_getResourceURL/Text访问
    connect 获取网站访问权限 允许由GM_xmlhttpRequest检索的子域
    run-at 脚本的运行时机 document-start/body/end/idle/menu 详细
    grant 申请API权限 none表示页面环境 unsafeWindow表示沙盒环境
    noframes 脚本标记 标记使脚本在主页上运行,但不在 iframe 上运行

    ‎API 说明

    名称 描述
    GM_addStyle ‎将给定样式添加到文档中并返回注入的样式元素
    GM_addElement ‎创建指定的 HTML 元素,应用所有给定的"属性"并返回注入的 HTML 元素,此功能是实验性的,API 可能会更改
    GM_setValue ‎将"名称"的值设置为存储
    GM_getValue ‎‎从 GM_setValue 存储的"名称"中获取值
    GM_deleteValue ‎‎将 GM_setValue 存储的"名称"删除
    GM_listValues ‎‎列出GM_setValue 存储的所有"名称"
    GM_addValueChangeListener ‎‎侦听 GM_setValue 储存"名称"的值的更改并返回更改前和后的值
    GM_removeValueChangeListener ‎‎删除由 GM_addValueChangeListener 添加的侦听器
    GM_log ‎‎‎向控制台记录消息‎
    GM_getResourceText ‎‎‎获取由‎ resource 预加载的资源
    GM_getResourceURL 获取由‎ resource 预加载的 base64 编码 URI‎
    GM_registerMenuCommand 注册一个菜单,在运行此脚本的页面的中显示‎
    GM_registerMenuCommand ‎取消由 GM_registerMenuCommand 注册的菜单‎
    GM_openInTab ‎通过给定的 URL 打开一个新标签页‎
    GM_xmlhttpRequest ‎通过脚本发送的XHR请求‎
    GM_download ‎通过给定的 URL 下载文件到本地‎
    GM_saveTab 保存选项卡对象,生命周期为选项卡的打开->关闭
    GM_getTab ‎获取选项卡对象,生命周期为选项卡的打开->关闭
    GM_getTabs ‎获取所有选项卡对象,生命周期为选项卡的打开->关闭
    GM_notification ‎显示 HTML5 桌面通知
    GM_setClipboard 将数据复制到剪贴板

    使用方法/示例

    使用油猴GM_*函数必须声明在沙盒环境中运行 @grant none

    // @grant        unsafeWindow

    GM_addStyle & GM_getResourceText

    // @grant        GM_addStyle
    // @grant        GM_getResourceText
    // @resource css https://cdn.jsdelivr.net/npm/index.css
    
    GM_addStyle(GM_getResourceText(css))
    
    GM_addStyle(`
        body{
            background-color: orange;
        }
    `)

    GM_addElement

    // @grant        GM_addElement
    
    GM_addElement('script', {
        src: 'https://cdn.jsdelivr.net/npm/index.js',
        type: 'text/javascript'
    })
    
    GM_addElement('link', {
        href: 'https://cdn.jsdelivr.net/npm/index.css',
        rel: 'stylesheet'
    })

    GM_set/get/deleteValue & GM_listValues

    // @grant        GM_setValue
    // @grant        GM_getValue
    // @grant        GM_listValues
    // @grant        GM_deleteValue
    
    let value = "hello world"
    
    GM_setValue("value", value)        // 将"名称"的值设置为存储
    
    console.log(GM_getValue("value"))  //  从存储中获取"名称"的值 => hello world
    
    console.log(GM_listValues())       //列出存储的所有名称 => ['value']
    
    GM_deleteValue("value")            // 从存储中删除"名称"
    
    console.log(GM_listValues())       // => []

    GM_add/removeValueChangeListener

    // @grant        GM_setValue
    // @grant        GM_addValueChangeListener
    // @grant        GM_removeValueChangeListener
    
    GM_addValueChangeListener('value', function (name, old_value, new_value, remote) {
    
        console.log(name, old_value, new_value, remote)
    
        // 3秒后输出 =>value old_value new_value false
    
    })
    
    setTimeout(() => {
    
        GM_setValue('value', 'new_value')
    
    }, 3000)
    
    setTimeout(() => {
    
        GM_removeValueChangeListener(add)  // 按 ID 删除侦听器
    
        console.log('已删除');
    
        GM_setValue('value', 'new_value1') // 这里改变'value'的值后侦听器不会再执行
    
    }, 6000)
    

    GM_reg/unregisterMenuCommand

    // @grant        GM_registerMenuCommand
    // @grant        GM_unregisterMenuCommand
    
    let menu = GM_registerMenuCommand('hello world', function () {
    
        alert('hello world')
    
        GM_unregisterMenuCommand(menu) // 按id删除一个菜单
    
    }, 'H') // 快捷键

    GM_xmlhttpRequest

    // @grant        GM_xmlhttpRequest
    
    let ajax = GM_xmlhttpRequest({
    
        method: "GET",                        // 请求方法 GET POST
    
        // headers: {},                       // 消息头
    
        // data: '',                          // 通过 POST 请求发送的字符串
    
        // timeout: 10000,                    // 超时(毫秒)
    
        responseType: "json",                 // 响应的数据类型 text arraybuffer blob document json
    
        // overrideMimeType: "text/xml",      // 请求的 MIME 类型
    
        url: 'url',                           // 请求的 URL
    
        onabort: function () {},              // 如果请求中止,则要执行的回调
    
        onerror: function () {},              // 如果请求最终出现错误,则要执行的回调
    
        onloadstart: function () {},          // 在请求开始时执行的回调
    
        onprogress: function () {},           // 如果请求取得了一些进展,则要执行的回调
    
        onreadystatechange: function () {},   // 在请求的就绪状态发生更改时要执行的回调
    
        ontimeout: function () {},            // 如果请求由于超时而失败,则要执行的回调
    
        onload: function (xhr) {              // 如果加载了请求,则要执行的回调
    
            console.log(xhr);
    
        }
    })
    
    abort(ajax)                               // 调用以取消此请求

    GM_download

    // @grant        GM_download
    
    let download = GM_download({
    
        url: 'url',                           // 下载文件的 URL 地址
    
        name: "文件名.后缀",                   // 不填则自动获取文件名
    
        saveAs: true,                         // 布尔值,显示"保存为"对话框
    
        onerror: function (error) {           // 如果下载最终出现错误,则要执行的回调
    
            console.log(error)
    
        },
    
        onprogress: (pro) => {                // 如果此下载取得了一些进展,则要执行的回调
    
            console.log(pro.loaded)           // 文件加载量
    
            console.log(pro.totalSize)        // 文件总大小
    
        },
    
        ontimeout: () => {},                  // 如果此下载由于超时而失败,则要执行的回调
    
        onload: () => {}                      // 如果此下载完成,则要执行的回调
    })
    
    abort(download)                           // 调用以取消此下载

    GM_notification & GM_openInTab & GM_setClipboard

    // @grant        GM_openInTab
    // @grant        GM_notification
    // @grant        GM_setClipboard
    
    GM_notification({
    
        title: "标题",
    
        image: "图像链接",
    
        text: "通知内容",
    
        highlight: true,                   // 布尔值,是否突出显示发送通知的选项卡
    
        silent: false,                     // 布尔值,是否播放声音
    
        timeout: 10000,                    // 设置通知隐藏时间
    
        onclick: function () {             // 在单击通知时调用
    
            GM_openInTab("url", true)      // 使用此 URL打开一个新标签页
    
            //or
    
            GM_setClipboard("text")        // 将数据复制到剪贴板
    
        },
    
        ondone() {}                        // 在通知关闭(无论这是由超时还是单击触发)或突出显示选项卡时调用
    })
    已有1人评分好评 油猫币 理由
    wwwwwllllk + 1 + 7 ggnb!

    查看全部评分 总评分:好评 +1  油猫币 +7 

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    857

    回帖

    1356

    积分

    荣誉开发者

    积分
    1356

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-3-17 22:24:17 | 显示全部楼层
    补充几个我遇到过的问题:
    GM_addStyle在部分油猴版本中不可用。
    注册多个同名菜单时(第一个参数相同),只有一个生效。
    overrideMimeType是响应的mime类型,请求的写在headers里。
    GM_download支持的文件类型有限,且在某些情况下会强制修改后缀。另外还有GM_download(url, filename)这种同步写法,错误信息将被忽略。
    GM_setClipboard通过监听copy事件实现,如果copy事件被其他插件或脚本阻止,将会影响这个函数的执行。

    点评

    ggnb  发表于 2022-3-17 22:28
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    284

    主题

    3810

    回帖

    3739

    积分

    管理员

    积分
    3739

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-3-17 13:51:27 | 显示全部楼层
    ggnb 辛苦整理
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    19

    回帖

    47

    积分

    助理工程师

    积分
    47
    发表于 2022-3-17 15:00:24 | 显示全部楼层

    GM_notification

    本帖最后由 dahua1 于 2022-3-17 15:12 编辑

    这个我怎么用不了呢
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:07
  • 签到天数: 684 天

    [LV.9]以坛为家II

    27

    主题

    733

    回帖

    7199

    积分

    荣誉开发者

    精通各种语言的HelloWord!

    积分
    7199

    荣誉开发者油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-3-17 15:28:32 | 显示全部楼层

    ggnb 辛苦整理
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-3 00:00
  • 签到天数: 117 天

    [LV.6]常住居民II

    27

    主题

    588

    回帖

    521

    积分

    专家

    积分
    521

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-3-17 16:04:02 | 显示全部楼层
    哥哥辛苦了,都老是记不住,得随时查
    祝哥哥早中晚各一发
    入驻爱发电 让这世界充满爱 https://afdian.net/a/vpannice
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    284

    主题

    3810

    回帖

    3739

    积分

    管理员

    积分
    3739

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-3-18 10:47:49 | 显示全部楼层
    dahua1 发表于 2022-3-17 15:00
    这个我怎么用不了呢

    建议直接发代码。看看是不是@grant没声明
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    19

    回帖

    47

    积分

    助理工程师

    积分
    47
    发表于 2022-3-18 11:31:03 | 显示全部楼层
    王一之 发表于 2022-3-18 10:47
    建议直接发代码。看看是不是@grant没声明

    现在可以了
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    620

    主题

    5084

    回帖

    5958

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    5958

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-3-19 14:47:28 | 显示全部楼层
    还有一个,overrideMimeType如果在本地请求里我印象里是不会生效的
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表