在Greasy Fork发布脚本并使用脚本猫的库
本帖最后由 firetree 于 2024-1-9 22:07 编辑> 本帖最后由 firetree 于 2024-1-9 21:14 编辑
太长不看:用ElementGetter可以这么require,可以发Greasy Fork
```js
// @require https://scriptcat.org/lib/513/2.0.0/ElementGetter.js#sha256=KbLWud5OMbbXZHRoU/GLVgvIgeosObRYkDEbE/YanRU=
```
我们写脚本的时候经常用到cxxjackie大佬的(https://bbs.tampermonkey.net.cn/thread-2726-1-1.html)这个好用的库。轻轻松松就可以实现元素的操作,这减少了无用的重复代码,对于针对播放器这类通用组件进行操作的脚本来说,可以说是如虎添翼。
> 这就是你脚本猫的库啊,异步操作元素真的是轻轻又松松啊,你们Greasy Fork有没有这么好的库啊?
可是众所周知,Greasy Fork对外部脚本限制严格。脚本猫的外部库,Greasy Fork根本不让require。这怎么办呢?Greasy Fork上有一个盗版的Element Getter,但是版本落后,而且用不可靠的盗版也不是个办法。
我在翻看(https://greasyfork.org/zh-CN/help/external-scripts)的时候,突然发现了这么一条:
> 附有子资源完整性散列的脚本
> 允许使用 (https://www.tampermonkey.net/documentation.php#Subresource_Integrity) 下的有[子资源完整性](https://developer.mozilla.org/docs/Web/Security/Subresource_Integrity)的 @require 和@resource URL。
我立刻点开这两个链接,学习了一番。可是当我试图自己构造一个这样的URL,却发现总是出现SRI Error。计算散列对我这样的不研究密码学的人来说,有点麻烦,而且我也不确切地知道SRI的散列值是用什么格式表示的。
好在,我在(https://developer.mozilla.org/zh-CN/docs/Web/Security/Subresource_Integrity)发现了这么一个工具:(https://www.srihash.org/)。我发现,给出URL,就可以给你一个支持SRI的HTML代码,真的太方便了!
可是,当我输入ElementGetter的地址,却发现出现了CORS的错误,原来脚本猫不支持跨源访问。这个工具也不支持你复制代码来计算散列,只支持URL。
好在,这个时候我有一个办法。那就是我在(https://deta.space)上部署的“私人”CORS代理。使用CORS代理计算了散列以后,我终于得到了下面这一串代码:
```html
<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的严格的规则中一个[后来加入](https://github.com/JasonBarnabe/greasyfork/issues/1070)的较为宽松的部分被成功“攻破”了,但是着却代表它更加包容,可以防止开发者为了脚本猫的库跑到脚本猫去;脚本猫的库被Greasy Fork上的开发者使用了,可是这也代表着它的库有机会走向更广阔的社区。~~ @王一之 竟然我们没想到这个
要不要开个专题讨论一下
李恒道 发表于 2024-1-9 21:42
@王一之 竟然我们没想到这个
要不要开个专题讨论一下
讨论什么呢?这个机制确实可以 你贴的这个链接:https://developer.mozilla.org/zh-CN/docs/Web/Security/Subresource_Integrity
里面不是给出了一个方案吗?用他的代码构建一个bat文件,然后将库下载到本地,再拖放到这个文件上执行就能得到hash值了,我试了一下,把代码里的384改成256,就能得到跟你一模一样的结果。
关于我为什么没有发布至GressyFork
一方面是我个人对GF社区的反感,另一方面是懒{:4_109:}对于转载/盗版行为我本身并不反对,也有人向我询问过,我都是许可了的,后来确实也有萌生过自己发布的想法,但目前GF上已有数个转载版本(善用搜索:https://greasyfork.org/zh-CN/scripts/libraries?q=ElementGetter),我再发一个更像是在添乱,因此作罢。 cxxjackie 发表于 2024-1-9 22:30
你贴的这个链接:https://developer.mozilla.org/zh-CN/docs/Web/Security/Subresource_Integrity
里面不是 ...
抱歉,曾经我也见过其中一些比较新的转载版本,但是我忘了,然后搜索了几次,因为搜索词略有错误而只搜到了一个版本落后的转载版本【捂脸】 广阔个社区个屁,那讨论区天天像造反派斗地主一样的 感谢分享{:4_97:} 本帖最后由 清华紫光 于 2025-4-30 14:56 编辑
# **亲测验证成功😀**
**让Greasy Fork的require用上了自有库**,不过中间走了不少弯路,这里给后来者一些经验。[生成SRI散列bat原代码](https://developer.mozilla.org/zh-CN/docs/Web/Security/Subresource_Integrity),使用bat前必须*先安装OpenSSL软件库包,并配置OpenSSL环境变量*。由于该bat代码过于简陋,这里贴上我改进过的**一键生成SRI散列工具**bat代码,打开bat后拖入文件回车,即可生成SRI散列,并到保存当前目录的sha.txt里。打开sha.txt,删除回车符把这段字符串加到脚本猫js库地址后面即可。
sha.txt文件示例
```
#sha256
=KbLWud5OMbbXZHRoU/GLVgvIgeosObRYkDEbE/YanRU=
```
自有库例子
```
// @require https://scriptcat.org/lib/513/2.0.0/ElementGetter.js#sha256=KbLWud5OMbbXZHRoU/GLVgvIgeosObRYkDEbE/YanRU=
```
一键生成SRI散列工具bat代码
```
@echo off
title 一键生成SRI散列工具1.4 %date%
color 1F
mode con cols=70 lines=25
:main
cls
echo\
echo使用条件:
echo1. 已安装OpenSSL并配置环境变量
echo2. 测试方法:WIN+R输入cmd,执行openssl version
echo\
:: 设置默认算法
set bits=sha256
:get_file
echo\
set file=
set /p file= 请拖入文件,回车执行:
if "%file%"=="" (
echo 错误: 未指定文件
ping -n 2 127.1>nul
goto get_file
)
if not exist "%file%" (
echo 错误: 文件不存在
ping -n 2 127.1>nul
goto get_file
)
:: 生成SRI散列
echo 正在生成%bits% SRI散列...
echo #%bits%=> sha.txt
openssl dgst -%bits% -binary "%file%" | openssl base64 -A >> sha.txt
if errorlevel 1 (
echo 错误: 生成失败,请检查OpenSSL配置
pause
goto main
)
:: 读取并显示结果 - 修改为只读取最后一行
for /f "delims=" %%a in ('type sha.txt ^| findstr /v "#"') do set "sri_hash=%%a"
echo\
echo ====== 生成结果 ======
echo 算法: %bits%
echo 文件: %file%
echo SRI散列: %sri_hash%
echo ====================
echo 结果已保存到sha.txt
echo 按任意键返回主菜单...
pause>nul
goto main
```
页:
[1]