XIU2 / UserScript

🐵 自用的一些乱七八糟 油猴脚本~
https://greasyfork.org/users/457025
GNU General Public License v3.0
7.66k stars 607 forks source link

[Github 增强 - 高速下载] Raw文件加速 失效(在使用Firefox+Violentmonkey时) #356

Open Yukari0201 opened 1 year ago

Yukari0201 commented 1 year ago

问题描述

问题及复现步骤:

在使用 Firefox+Violentmonkey 时,从项目仓库(例如:https://github.com/XIU2/UserScript ) 左键单击 打开任意一个文件,Raw文件加速会失效;
此时,若 Ctrl+R 刷新界面,则Raw文件加速正常生效; 如果是从项目仓库 新标签页打开链接,则Raw文件加速也可以正常生效。

打开任意文件后,点击左边“Code”一栏切换文件时,Raw文件加速也会失效,依旧保持着上一个文件的加速链接(若上个文件没生效,则也不会生效)。

补充:

我测试过 Firefox+Tampermonkey、Chrome+Tampermonkey、Chrome+Violentmonkey ,Raw文件加速均可正常生效;
但仅在使用 Firefox+Violentmonkey 时,需要刷新界面才能生效。
我尝试 禁用其他扩展和脚本、删除重装该脚本(已从回收站彻底删除),但问题依旧。
到这里,由于我个人水平有限,无法继续进行有效的测试来排查了,希望大佬能帮忙,指出一些我漏掉的还需要排查的问题。

最后,感谢大佬的脚本,实实在在帮助了我。

附加截图

Firefox(国际版)和Violentmonkey版本如下: 图片 图片

一些出问题时的截图: 图片 注意看左下角红框框住的部分

XIU2 commented 1 year ago

我测试了下,结果大致符合你的描述。 不同的点在于,我这边 Chrome+Violentmonkey 下,直接点击文件后不会显示 Raw 加速按钮,但是我点击左侧列表里的其他文件后,就可以正确显示出来了(当然显示的是新文件的加速 URL),其他的都和你说的差不多。

初步判断是 Violentmonkey 与 Tampermonkey 的差异导致的,毕竟我主用 Tampermonkey,Violentmonkey 也就是因为兼容 Tampermonkey 所以才适配了的,但这两者在细微之处存在差异。

我会研究下原因的。

Yukari0201 commented 1 year ago

谢谢大佬回复,以及抱歉没有仔细测试 Chrome+Violentmonkey 的情况。

我刚刚又试了未登录时的情况:
Chrome+Violentmonkey,未登录时 直接点击文件后可以显示Raw加速按钮。(已关闭uBlock)
图片

但 Firefox +Violentmonkey 未登录时就不行
图片

XIU2 commented 1 year ago

已登录、未登录 其实对应的就是 新版界面、旧版界面。

我测试的情况是,在 Chrome+Violentmonkey 下,新版界面不正常(已登录,情况如我楼上所说),旧版界面正常(未登录)。 而 Firefox+Violentmonkey 下,则都不正常。

XIU2 commented 1 year ago

根据我以前的经验,Violentmonkey 在加载脚本时间上存在差异,于是我尝试延迟加载 addRawFile() 函数(该函数就是加 Raw 加速按钮的),Chrome+Violentmonkey 新版界面下正常了,但 Firefox+Violentmonkey 依然不行。

调试了下,似乎是监听网页 URL 变化的代码方面的问题,因为 Tampermonkey 自带了该函数(监听网页 URL 变化),而为了兼容 Violentmonkey 等其他脚本管理器,我需要一个类似功能的函数,但因为 Tampermonkey 不是开源的,因此我是自己仿造的该功能函数。 我刚刚测试该函数,在 Chrome 上是可以工作正常的,在 Firefox 上似乎有点问题,可能又是可恶的兼容性问题吧,我研究研究吧。。。

XIU2 commented 1 year ago

我这边测试只需要将脚本 145 行的代码:

addRawFile();

改为这样:

if (GM_info.scriptHandler === 'Tampermonkey') {addRawFile();} else {setTimeout(addRawFile, 1000);}

Chrome+Violentmonkey 新版界面下就会完全工作正常了。

即非 Tampermonkey 的都延迟 1 秒后再执行函数。

但这个改动对 Firefox+Violentmonkey 无效,因为这个组合下我排查后问题还是出在 监听网页 URL 变化 的代码上。 Chrome+Tampermonkey、Firefox+Tampermonkey 用的都是 Tampermonkey 自带的函数来监听网页 URL 变化的,都没有问题。 而 Chrome+Violentmonkey、Firefox+Violentmonkey 用的是我仿写的函数来监听网页 URL 变化的,而该函数在 Chrome+Tampermonkey/Violentmonkey 上工作正常,但在 Firefox 上工作不正常(无论是哪个脚本管理器),但我把该函数手动在 Firefox 浏览器开发者工具中执行又能正常工作。

所以问题就是出在 Firefox 与 我仿写的这个函数 之间了。

XIU2 commented 1 year ago

研究后发现,似乎不算是兼容性问题,而是 Firefox 存在一些限制。

我仿写的函数会覆盖 window.history 函数来监听网页 URL 变化,但在 Firefox 浏览器上,无论是什么脚本管理器均无法覆盖,哪怕我加上 // @grant unsafeWindow 也不行(该标识让脚本可以完全控制网页内的变量等等),而在 Firefox 浏览器开发者工具下手动运行该函数覆盖的话,却可以正常工作(脚本功能也恢复正常)。

XIU2 commented 1 year ago

好像确实是有限制。

我看了下 Violentmonkey 的注入方式说明: https://violentmonkey.github.io/posts/inject-into-context/ 想要脚本影响网页,就需要 page 方式注入,但这又会导致脚本被 Github 的 CSP 限制注入。

// @inject-into page

而使用其他方式,不会被 Github 的 CSP 限制注入,但却会导致我仿写的 监听网页 URL 变化 函数无法生效。。。

Tampermonkey 也有类似的东西,即我脚本里写的:

// @sandbox      JavaScript

也是专门解决 Firefox 浏览器的该类问题(上述所说的)。

XIU2 commented 1 year ago

研究了半天,也问了问 ChatGPT,依然没找到解决方案。。。该问题陷入僵局。。。

Iey4iej3 commented 8 months ago

想要脚本影响网页,就需要 page 方式注入,但这又会导致脚本被 Github 的 CSP 限制注入。

Firefox 在 content 方式注入有办法影响网页的:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Sharing_objects_with_page_scripts

之前折腾过,忘记了。如果我没记错的话,本质上是把需要注入 page 的部分分离,用那些 API 去注入。我记得还有些权限问题,比如 https://github.com/syhyz1990/baiduyun/pull/223/files 记不清楚为什么了。