本帖最后由 firetree 于 2024-1-9 22:07 编辑
本帖最后由 firetree 于 2024-1-9 21:14 编辑
太长不看:用ElementGetter可以这么require,可以发Greasy Fork
// @require https://scriptcat.org/lib/513/2.0.0/ElementGetter.js#sha256=KbLWud5OMbbXZHRoU/GLVgvIgeosObRYkDEbE/YanRU=
我们写脚本的时候经常用到cxxjackie大佬的ElementGetter这个好用的库。轻轻松松就可以实现元素的操作,这减少了无用的重复代码,对于针对播放器这类通用组件进行操作的脚本来说,可以说是如虎添翼。
这就是你脚本猫的库啊,异步操作元素真的是轻轻又松松啊,你们Greasy Fork有没有这么好的库啊?
可是众所周知,Greasy Fork对外部脚本限制严格。脚本猫的外部库,Greasy Fork根本不让require。这怎么办呢?Greasy Fork上有一个盗版的Element Getter,但是版本落后,而且用不可靠的盗版也不是个办法。
我在翻看Greasy Fork 对外部脚本的政策的时候,突然发现了这么一条:
附有子资源完整性散列的脚本
允许使用 Tampermonkey 格式 下的有子资源完整性的 @require 和@resource URL。
我立刻点开这两个链接,学习了一番。可是当我试图自己构造一个这样的URL,却发现总是出现SRI Error。计算散列对我这样的不研究密码学的人来说,有点麻烦,而且我也不确切地知道SRI的散列值是用什么格式表示的。
好在,我在MDN发现了这么一个工具:SRI Hash Generator。我发现,给出URL,就可以给你一个支持SRI的HTML代码,真的太方便了!
可是,当我输入ElementGetter的地址,却发现出现了CORS的错误,原来脚本猫不支持跨源访问。这个工具也不支持你复制代码来计算散列,只支持URL。
好在,这个时候我有一个办法。那就是我在Deta Cloud上部署的“私人”CORS代理。使用CORS代理计算了散列以后,我终于得到了下面这一串代码:
<script src="https://corsanywhere-1-b2405373.deta.app/https://scriptcat.org/lib/513/2.0.0/ElementGetter.js" integrity="sha256-KbLWud5OMbbXZHRoU/GLVgvIgeosObRYkDEbE/YanRU=" crossorigin="anonymous"></script>
立刻取其中的关键部分,构建了下面这个URL:
https://scriptcat.org/lib/513/2.0.0/ElementGetter.js#sha256-KbLWud5OMbbXZHRoU/GLVgvIgeosObRYkDEbE/YanRU=
可是我发现,竟然还是不让提交!
难道Greasy Fork的规则并不是允许SRI,只是支持带有SRI的允许其他规则的URL?好在我测试一番发现把-
改成=
就行了。说好的“Tampermonkey 格式”呢?
所以,最后我得到了这个URL。
https://scriptcat.org/lib/513/2.0.0/ElementGetter.js#sha256=KbLWud5OMbbXZHRoU/GLVgvIgeosObRYkDEbE/YanRU=
顺利提交。
如果要用别的什么库,恐怕还得这么来,希望有懂SRI的老哥能给出更方便的计算SRI的方法,否则就得搞到一个CORS代理了(属于是走大弯路)。
谁赢了?谁输了?Greasy Fork的严格的规则中一个后来加入的较为宽松的部分被成功“攻破”了,但是着却代表它更加包容,可以防止开发者为了脚本猫的库跑到脚本猫去;脚本猫的库被Greasy Fork上的开发者使用了,可是这也代表着它的库有机会走向更广阔的社区。