目录
介绍grant属性,run-at属性以及时间加速,视频倍速原理
相关函数四个:
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 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;
}
}
}
俺是初学者,请大佬们不要见笑,请多多指点,谢谢!!!
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图