一行脚本 不断自动恢复下载

1. 问题

你遇到过这样的情况么?用浏览器下载文件,网速不给力,或者你知道在从服务器到你的座机间网络的某个节点有个什么限制了下载速度,然而你无能为力。所以同一个文件在学校可能只需要15秒下载完毕,在家里就需要15分钟,而且时间不稳定,还可能慢慢变长。

可能突然就会这样,超时了。右边的叉(取消)变成了带箭头的圈(重试/恢复),你及时点击它,可以续传。

如果你一眼没照顾到,过一会儿就彻底超时了,只能重新下载。

如果只需要几分钟还可以忍受,但是往往涨成几十分钟,把你绑在椅子上,又不能安心去做别的。

为什么没有这样的工具呢?(也许有吧)我怀疑是因为在这个世界上并非处处都有你我遇到的这一困难,别人的网速没准特别快,根本不需要手动续传,甚至不会触发超时。

面临这个问题时,我通常在心里诅咒,然而于事无补。后来我终于忍无可忍写了一行脚本,替我看着下载进度,一旦需要恢复/重试,就去自动点击一下。

2. 使用方法(在Firefox下测试通过)

使用方法很简单,不需要会编程序。之所以没有做得界面更友好,是因为我懒,所以需要按以下步骤操作。

第一步 开始下载你的目标文件。

第二步 在地址栏中输入 about:downloads,回车。

Ctrl-J 并非总能符合下一步的要求。

第三步 F12,得到 console。

第四步 在 console 中输入以下这行代码,回车

setInterval(function myTimer(){$("[data-l10n-id='downloads-cmd-retry']").click()},1000)

这就是唯一可以算作我工作的部分,一会儿解释原理。

得到如下效果,其中的82可能是其他数字,不必关心。

效果是,从现在开始,所有正在下载的文件,如果出现 恢复/重试 按钮,会在1秒钟内自动被点击。我保持开着这个页面,切到后台,时不时过来瞅一眼,看进度还在,再放心切回去干别的活儿。这个页面关掉,也会不断在1秒内重试,直到关闭浏览器。

3. 原理

原理是,about:downloads 这个页面也是HTML/CSS/JS的,所以可以在 console 中在线修改。

点击inspector (这并不是它的名字,那个按钮的名字叫做 Pick an element from the page),

然后点击带箭头的圆圈,得到按钮的HTML代码。

既然能手动找到按钮,(1)我们可以用代码

 $("[data-l10n-id='downloads-cmd-retry']") 

找到这个按钮。

(2)找到按钮以后,我们用

$("[data-l10n-id='downloads-cmd-retry']").click()

点击它。

(3)触发动作的时机,我偷懒,并未(轮询或中断/回调)检测 恢复/重试 出现,而是每1秒钟尝试点击一次。

setInterval(function myTimer(){$("[data-l10n-id='downloads-cmd-retry']").click()},1000)

即使按钮并不是 恢复/重试 状态,此处也不会报错。

如果有多个恢复/重试按钮,这段代码会逐一点击。

4. 未尽事宜/后续工作

我本想写成 tampermokey 脚本,这样大家(以及我)用起来更方便一些。但是我遇到了困难。tampermonkey 脚本应该匹配特定站点,只在特定站点或地址执行。我不知道如何把 about:downloads写入 // @match 这一行。

如果有多个恢复/重试按钮,这段代码会逐一点击。这并不是我原始的态度,不够优雅。我本打算 想设置哪个文件为不断重试,就只重试它自己。然而,我在 console 中不会指定特定的某个按钮。试过用下标区分匹配的按钮,即类似 $("[data-l10n-id='downloads-cmd-retry']")[0] 这样的写法,实验表明需要在 tampermonkey中

// @require http://code.jquery.com/jquery-latest.js

才能支持下标语法。或者会触犯 firefox 或 chrome 的安全规则?总之我没成功。

在 Chrome 的 console 下我不知道如何(在不触犯安全规则未能导入jquery)使用 $("focus-type='retry']")

找到 恢复/重试 按钮。所以向 Chrome 移植失败。

哪位大侠知道如何改进,还请不吝指导,我尝试成功以后补进以后的博客中。在这之前,对付着用吧。

Leave a Reply

Your email address will not be published. Required fields are marked *