第三个脚本——时间加速and视频倍速

news2024/9/28 9:32:04

目录

本文主要内容

granr属性介绍

run-at属性

时间加速原理

视频倍速原理

完整示例


本文主要内容

介绍grant属性,run-at属性以及时间加速,视频倍速原理

granr属性介绍

相关函数四个:

GM_setValue
GM_getValue
GM_listValues
GM_deleteValue

当然,还有存储内容变动时相关的函数

GM_addValueChangeListener
GM_removeValueChangeListener

接下来分别介绍一下

GM_setValue: 

假设代码 GM('myName', 'woonigh'

在Tampermonkey管理的存储中,把名字是myName的存储,设置值为 'woonigh' 

GM_getValue:

GM_getValue('myName', 'woonigh')

就是把名字是 myName 的存储的值读取出来,

如果找不到myName的值呢?那就用默认的值 'woonigh' 

GM_listValues: 

这个没有参数,就是把所有存储的名字罗列出来。

返回结果是 Array类型 

适合于:

  • 你的应用很大,需要做存储数据管理
  • 你的应用数据很乱

GM_deleteValue:

假设代码 GM_deleteValue('myName')

就是删除名字叫做 myName 的存储。

和上面 GM_listValues 一样,多用于数据管理。两者是一对。  

GM_addValueChangeListener:

对指定的名字进行监听,该函数返回一个id

该函数可以跨函数通信

格式为

GM_addValueChangeListener(name, function(name, old_value, new_value, remote) {

})

name为值的名称

函数的name也是

old_value为旧值

new_value为新值

remote区分这个值的改变的所属,如果是由本标签页引起的,则为false,如果由其他标签页引起的,为true。

GM_removeValueChangeListener:

移除一个监听器

GM_removeValueChangeListener(listener_id)
根据监听器的 ID,把监听器移除

示例如下:

// 存储中 增加一个存储量,名字叫 'myName', 值是'woonigh'
let my_name = GM_setValue('myName', 'Woonigh');

// 读取存储中的,名字叫 'hisName' 的值, 如果没有这个名字的存储的话,那返回来的值就叫 'Tony'
let his_name = GM_getValue('hisName', 'Tony');

// 把存储中所有的存储名字罗列出来
let all_value_names = GM_listValues();
console.log(all_value_names); // 输出  ["myName"]

// 给名字叫 'myName' 的存储添加一个监听器
let listener1 = GM_addValueChangeListener('myName', function (name, old_value, new_value, remote) {
  console.log(`
    发生变化的存储名是: ${name},
    ${name} 原来的值是 ${old_value},
    ${name} 新的值是 ${new_value},
    这个值的变动是由${remote ? '本标签页' : '其他标签页'} 引起的。
  `);
});

GM_setValue('myName', 'Maxwell');

// 把 id 是listener1 的监听器移除
GM_removeValueChangeListener(listener1);

// 把名字叫 'myNamae' 的存储删除掉
GM_deleteValue('myName');

run-at属性

一个比较重要的属性

当我们设置为:// @run-at document-start  

表示希望脚本能尽快注入,在时间加速时希望抢在前端调用setInterval之前来替换掉setInterval函数

时间加速原理

  如网站:时间校准_北京时间校准_北京时间在线校准_现在北京时间

但是该网站的时间加速已经失效了

一般情况下,都是使用setInterval来做定时器,我们只要把这个定时器的时间缩短,比如之前是1s触发一次,现在变成500ms触发一次,那么就相当于时间缩短了一倍.
怎么缩短呢?我们可以劫持setInterval这个函数,传入值为1000,我们把他变为500.代码类似下面这样:

let hookSetInterval=window.setInterval;//将系统提供的setInterval保存
window.setInterval=function(a,b){//将系统的setInterval替换为我们自己的
    return hookSetInterval(a,b/2);//经过处理后再调用系统的setInterval
}

在脚本中也是类似的代码,不过如果使用//@grant unsafeWindow的话,window替换为unsafeWindow,
也就是:

// @grant        unsafeWindow
let hookSetInterval=unsafeWindow.setInterval;//将系统提供的setInterval保存
unsafeWindow.setInterval=function(a,b){//将系统的setInterval替换为我们自己的
    return hookSetInterval(a,b/2);//经过处理后再调用系统的setInterval
}

视频倍速原理

视频倍速主要涉及h5的video,里面有一个播放速度的属性:playbackRate,最高为16倍.

解释网址如:HTMLMediaElement.playbackRate - Web API 接口参考 | MDN

像B站的视频页面,我们可以直接通过document.querySelector('video')获取,,如果有多个选择器写好也没问题.代码如下:

document.querySelector('video').playbackRate=2;

完整示例

但是关于时间加速的网站,已经不能通过此方法实现,B站可以但也有一定局限性,大家可以仿照写其他网站的,我们也可能遇到一下问题

1.视频暂停再取消会重置倍速

2.网站代码与脚本冲突

解决方法

1.固定playbackRate属性,或者让他网页的js不重置倍速,再暴力点可以通过计时器定时设置倍速

2.进行延迟注入

3.追根溯源,找到最根本的问题,一次性解决

// ==UserScript==
// @name         视频加速与时间加速
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1
// @description  用于:http://time.tianqi.com/的时间加速和用于bilibili的一个视频倍速:https://www.bilibili.com/video/BV1ys411p7To
// @author       You
// @match        http://time.tianqi.com/
// @match        https://www.bilibili.com/video/*
// @run-at       document-start
// @grant        unsafeWindow
// ==/UserScript==

let rate=4;//倍速

if(unsafeWindow.location.href.indexOf('time.tianqi.com')!=-1){
    //时间网站,用时间加速
    let hookSetInterval=unsafeWindow.setInterval;//将系统提供的setInterval保存
    unsafeWindow.setInterval=function(a,b){//将系统的setInterval替换为我们自己的
        return hookSetInterval(a,b/rate);//经过处理后再调用系统的setInterval
    }
}else{
    //bilibili用视频加速
    unsafeWindow.onload=function(){
        //在元素都加载完成后再监听video的播放时间,再进行倍速设置
        unsafeWindow.document.querySelector('video').onplay=function(){
            unsafeWindow.document.querySelector('video').playbackRate=rate;
        }
    }
}

俺是初学者,请大佬们不要见笑,请多多指点,谢谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

json基本使用与简介

一、简介 二、json两种构造结构 三、js解析JSON 1、JSON2解析JSON 2.用eval()方法把JSON字符串转化成JSON对象. 3.使用JSON2中的JSON对象的parser()方法解析JSON字符串 4. 使用JSON2中的JSON对象的stringify ()方法把JSON对象转换成字符串 5、案例 四、Java解…

【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(1)

系列文章目录 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署(0) 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署(1) 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署(2) 文章目录…

深度学习训练营之灵笼人物识别

深度学习训练营之灵笼人物识别原文链接环境介绍前置工作设置GPU导入数据数据查看数据预处理加载数据可视化数据检查数据配置数据集prefetch()功能详细介绍:归一化查看归一化后的数据构建VGG-19网络VGG优点VGG缺点利用官方给到的网络网络结构编译模型训练结果可视化预…

第03讲:GitHub的使用

一、创建远程仓库 访问GitHub官方网站,并创建账号,然后按照以下图示创建项目 复制仓库地址 二、远程仓库的操作 命令作用git remote -v查看当前所有远程地址别名git remote add 别名 远程地址起别名git push 别名 分支推送本地分支上的内容到远程仓库…

vscode+opencv+mingw+cmake配置vscode下的opencv环境

目录介绍安装VsCode安装mingw安装cmake安装opencv,以及其扩展库 opencv_contrib安装python利用cmake生成opencv的Makefile文件cmake命令进行编译,安装配置opencv环境变量配置VSCODE测试DEMO介绍 参考链接:https://www.cnblogs.com/czlhxm/p/…

教育行业回访话术

近些年来,随着知识经济的快速发展,教育市场呈现良好的增长态势。越来越多的人开始通过参加各种培训来提升自己,教育行业竞争十分激烈。 前言 近些年来,随着知识经济的快速发展,教育市场呈现良好的增长态势。而且由于受…

人力资源软件对中小企业的七点重要性

对于中小企业(SMB)来说,员工就意味着一切。你的员工几乎掌握着企业的整体增长和发展,他们可以成就企业,但也能破坏企业的发展。为了提高员工效率,中小型企业需要出色的人力资源管理。员工只有在受到重视和培…

被新手忽视的 自谐振频率点

在MHz的DCDC和RF LNA电路中,被新手忽视的 自谐振频率点Self-Resonant Frequency 计算公式为 下图显示了 1μF,封装为 1206 的陶瓷电容器的阻抗(MLCC有经典的V型阻抗-频率曲线。随着频率升高,寄生电感的影响开始凸显,阻…

Faster RCNN网络源码解读(Ⅴ) --- GeneralizedRCNNTransform图像初始化代码解析

目录 一、代码作用(transform.py) ​编辑 二、代码解析 2.1 GeneralizedRCNNTransform类 2.1.1 初始化函数__init__ 2.1.2 normalize标准化处理 2.1.3 将图像以及bndbox进行缩放resize 2.1.4 batch_images 2.1.5 正向传播 forward 2.1.6 后…

分布式系统共识机制:一致性算法设计思想

分布式系统共识机制:一致性算法设计思想Paxos 算法节点角色算法流程Raft 算法节点角色核心机制leader选举日志复制PBFTHotstuff门限签名核心机制二阶段提交协议三阶段提交协议这次以一个宏观的角度去总结 自己学习过的一致性算法。一致性算法的目标就是让分布式系统…

Java开发 - 树(二叉树,二叉排序树,红黑树)

目录 前言 你好,认识一下,我是树 二叉树与二叉排序树 二叉排序树特点 为什么说二叉排序树查询效率要高于链表呢? 元素的类型 比较器 手写二叉排序树 定义一棵二叉树 增加元素 查询元素 修改元素 删除元素 遍历二叉树 重写toS…

JAVA注解处理API实战

简介 ​ 插件化注解处理(Pluggable Annotation Processing)API JSR 269提供一套标准API来处理Annotations( JSR 175),实际上JSR 269不仅仅用来处理Annotation,它建立了Java 语言本身的一个模型,它把method、package、constructor、type、variable、enum、annotatio…

工业远程I/O模块 CANopen 通讯

1.对象字典OD 对象字典是每个CANopen设备必须具有的功能,它包含了设备所有可以被访问的参数,客户端使用索引(Index)和子索引(Sub-index)来读写对象字典里的参数。 对象字典主要用来设定设备组态及进行非即时的通讯。每个对象采用16位索引的方式来寻址&…

01Editor最新破解

文章目录01Editor最新版注册算法逆向1.定位注册算法代码2.整体注册算法3.Check1算法分析4.Check2算法分析5.获得正确的任意用户名对应的序列号01Editor最新版注册算法逆向 1.定位注册算法代码 【版本】13.0.164bit\textcolor{green}{【版本】13.0.1\ 64bit}【版本】13.0.1 64b…

Redis集群系列七 —— 散列插槽分析

集群状态日志分析 Redis 分片集群引入了一个逻辑上的插槽或哈希槽概念,将集群划分为16384(0~16383)个槽位,集群中的每个节点占据一部分槽位数,在逻辑上将集群中的所有节点构成了一块完整的内存空间。 这个日志中可以通…

对象定义-解构-枚举属性遍历以及对象内函数

属性名表达式 定义对象的属性有两种方式 1、直接使用标识符作为属性名 obj.name 2、以表达式作为属性名 obj[ab] 10 let obj {} obj.name 孙悟空 // 孙悟空 obj[a b] 10 // 10 console.log(obj); // {name: 孙悟空, ab: 10}es5中字面量定义对象只能使用一种方法 var …

4.3.3、划分子网的 IPv4 地址

若有一个大型的局域网需要连接到因特网 若需要申请一个 C 类网络地址,其可分配的 IP 地址数量只有 254254254 个,不够使用 因此申请了一个 B 类网络地址,其可分配的 IP 地址数量达到了 655346553465534 个 给每台计算机和路由器的接口分配一…

实验九、消除互补输出级交越失真方法的研究

一、题目 互补输出级交越失真消除方法的研究。 二、仿真电路 基本互补电路和消除交越失真互补输出级如图1所示。晶体管采用 NPN 型晶体管 2N3904 和 PNP 型晶体管 2N3906。二极管采用 1N4009。 在实际的实验中,几乎不可能得到具有理想对称性的 NPN 型和 PNP 型管…

网络编程套接字----UDP协议

文章目录前言一、理解源IP地址和目的IP地址二、认识端口号理解"端口号"和"进程ID"理解源端口号和目的端口号三、认识TCP协议四、认识UDP协议五、网络字节序六、socket编程接口socket常见APIsockaddr结构sockaddr结构sockaddr_in 结构in_addr结构七、地址转…

第三方软件测试▏有效保障软件产品质量的关键性步骤

软件测试作为软件产品生命周期中不可或缺的重要步骤,被许多软件企业所重视。主要是通过对软件产品进行全面的测试,确保软件质量以及满足用户需求。但软件测试不仅仅是个简单的检测工作,而是一个系统性的、有组织性的测试过程,包含…