Skip to content

Instantly share code, notes, and snippets.

@CKylinMC
Created March 11, 2022 19:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CKylinMC/fccf93a134f6e8182fe1b149dc347814 to your computer and use it in GitHub Desktop.
Save CKylinMC/fccf93a134f6e8182fe1b149dc347814 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name 合并扩展模块
// @namespace showav-sideload-mods
// @version 1.0
// @description 一次添加多个扩展模块
// @author CKylinMC
// @match https://www.bilibili.com/video*
// @match https://www.bilibili.com/medialist/play/*
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
(function(){
if(!unsafeWindow.ShowAVModules) unsafeWindow.ShowAVModules = {};
Object.assign(unsafeWindow.ShowAVModules,{
'showVideoType':{
name: "投稿类型",
description: "投稿是否为原创",
onload: function(){
const {infos}=this;
return document.createTextNode("投稿类型:"+(infos.copyright===1?"原创":"转载"));
},
onclick: function (e){
const {infos,CKTools}=this;
CKTools.modal.alertModal('投稿类型','此投稿为'+(infos.copyright===1?"原创":"转载")+'投稿','OK');
},
onhold: ()=>{}
},
'showVideoCate':{
name: "投稿分区",
description: "投稿所在分区",
onload: function(){
return document.createTextNode("分区:"+(unsafeWindow.channel?unsafeWindow.channel:"未知"));
},
onclick: function (e){
const {infos,CKTools}=this;
CKTools.modal.alertModal('投稿分区','此投稿所在分区为'+(unsafeWindow.channel?unsafeWindow.channel:"未知"),'OK');
},
onhold: ()=>{}
}
});
})();
// ==UserScript==
// @name 显示投稿分区
// @namespace showav-sideload-showvideotype
// @version 1.0
// @description 显示投稿所在分区
// @author CKylinMC
// @match https://www.bilibili.com/video*
// @match https://www.bilibili.com/medialist/play/*
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
// 此方法不能确保稳定,最稳定方法为获得分区编号然后判断所在分区。
(function(){
if(!unsafeWindow.ShowAVModules) unsafeWindow.ShowAVModules = {};
unsafeWindow.ShowAVModules['showVideoCate'] = {
name: "投稿分区",
description: "投稿所在分区",
onload: function(){
return document.createTextNode("分区:"+(unsafeWindow.channel?unsafeWindow.channel:"未知"));
},
onclick: function (e){
const {infos,CKTools}=this;
CKTools.modal.alertModal('投稿分区','此投稿所在分区为'+(unsafeWindow.channel?unsafeWindow.channel:"未知"),'OK');
},
onhold: ()=>{}
}
})();
// ==UserScript==
// @name 显示投稿类型
// @namespace showav-sideload-showvideotype
// @version 1.0
// @description 显示投稿是否原创
// @author CKylinMC
// @match https://www.bilibili.com/video*
// @match https://www.bilibili.com/medialist/play/*
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
(function(){
if(!unsafeWindow.ShowAVModules) unsafeWindow.ShowAVModules = {};
unsafeWindow.ShowAVModules['showVideoType'] = {
name: "投稿类型",
description: "投稿是否为原创",
onload: function(){
const {infos}=this;
return document.createTextNode("投稿类型:"+(infos.copyright===1?"原创":"转载"));
},
onclick: function (e){
const {infos,CKTools}=this;
CKTools.modal.alertModal('投稿类型','此投稿为'+(infos.copyright===1?"原创":"转载")+'投稿','OK');
},
onhold: ()=>{}
}
})();

上面提供了两个基本模块的两种使用方法。

脚本分为三个部分。

1. 脚本信息部分

此部分是脚本管理器识别脚本的重要组成部分。

// ==UserScript==
// @name         合并扩展模块
// @namespace    showav-sideload-mods
// @version      1.0
// @description  一次添加多个扩展模块
// @author       CKylinMC
// @match        https://www.bilibili.com/video*
// @match        https://www.bilibili.com/medialist/play/*
// @grant        unsafeWindow
// @run-at       document-start
// ==/UserScript==

这是一个示例脚本信息块,包含脚本名@name、命名空间@namespace、版本号@version等信息,其中脚本名和命名空间最好不要重复,@match代表脚本在哪里运行。 根据需要,可以自己增加运行的页面。*是通配符,代表任意字符。 @grant是授权。脚本想要访问页面内容需要声明权限具体可以参考下面的文档。@run-at是指脚本运行时机,时机错误可能导致模块失效。

脚本信息文档:https://www.tampermonkey.net/documentation.php#metadata

下方脚本代码全部运行于闭包模式((function(){})()),这段不再讲述。

2. 模块缺省声明

if(!unsafeWindow.ShowAVModules) unsafeWindow.ShowAVModules = {};

如果模块是第一个运行的模块,那么页面中可能还没有创建用于存储模块信息的对象,这里提前判断和创建这个对象。

3. 模块内容

模块内容又可以分为4个部分,模块信息(模块ID、模块名、模块介绍),模块加载运行函数,模块点击运行函数,模块长按运行函数。

3.1 模块信息

以前一种模块定义方式为例。

//...
    unsafeWindow.ShowAVModules['showVideoCate'] = {
            name: "投稿分区",
            description: "投稿所在分区",
//...

这里在模块根(ShowAVModules)下创建ID为showVideoCate的模块,定义模块显示名为投稿分区,描述为投稿所在分区

模块ID必须是唯一的,后定义的会覆盖先定义的模块。

模块名和模块描述用于在设置中显示模块,不产生实际效果。模块描述可以不写。

3.2 加载函数

//...
            onload: function(){
                return document.createTextNode("分区:"+(unsafeWindow.channel?unsafeWindow.channel:"未知"));
            },
//...

此段代码创建键onload,并定义了函数作为值。 当ShowAV载入信息条时,此处方法将被调用,其返回值将被插入到信息条中显示,因此返回值必须是有效的HTML节点。

模块可以使用脚本提供的很多预置工具,如CKTools等,它们被传递到了this中。使用方法是将它们从this中解构出来,然后直接调用。

一些常用的工具:

     * av_root : 容器HTML节点
     * config : 脚本的配置
     * av_infobar : 原本信息条HTML节点
     * infos : 视频API信息
     * CKTools : CKTools组件(domHelper, modal, bili等)
     * popNotify : 右上角浮动信息条组件
     * tools : 其他工具,比如 copy : 复制,copy('要复制的文本')

使用方法:

const {infos,CKTools,tools}=this;
infos.xxx//...

推荐使用CKTools.domHelper创建DOM。

modal和popNotify分别对应弹窗和提示条,参考脚本示例即可。

3.3 点击函数和长按函数

//...
            onclick: function (e){
                const {infos,CKTools}=this;
                CKTools.modal.alertModal('投稿分区','此投稿所在分区为'+(unsafeWindow.channel?unsafeWindow.channel:"未知"),'OK');
            },
            onhold: ()=>{}
//...

点击函数onclick和长按函数onhold是可选操作,但是必须填写。onclick函数在定义的模块被点击时触发,而长按函数在鼠标左键长按时触发。

onload相同,这两个函数中也可以使用this解构出工具,但是这两个函数不要求返回值。

若不需要,填写()=>{}即可忽略。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment