欢迎光临散文网 会员登陆 & 注册

记一次 aria2 chrome 扩展的琢磨过程

2021-02-03 20:06 作者:-l0_0l-  | 我要投稿

目录

1 查看全部代码

Github 仓库

2 起因

aria2 安装在别的电脑上,有时想用 aria2 下载东西的时候,可以直接复制链接; 但部分文件需要 cookie,每次手动复制有点麻烦。 网上搜索 aria2 的 chrome 扩展,也试用过,但觉得不太好用, 因为大部分扩展勾选使用 aria2 下载后,下载时就直接发送 addUri 请求了; 不勾选 aria2 下载,那只有右键菜单有下载选项。 但我想要的下载过程是这样的:

因此萌生了自己写一个扩展的想法。

3 结果

大致可以满足需求(只考虑一次下载一个的情况),但有一些点暂时不知道怎么解决:

  • 如何在下载未开始前就获取到下载链接(部分文件不支持多次下载)

  • 如何不自动弹出内置下载器

  • 新建的窗口如何固定大小/位置,以及如何置顶,如何隐藏标题栏(主要是关闭按钮)

4 过程

不能科学上网,导致很多文档看不到,只能侧面摸索。

4.1 参考

4.2 新建 chrome extension

这部分网上有,下面展示一些自己用到的字段。

关于权限部分,「downloads」用来监听下载事件, 「cookies」用来获取请求链接对应的 cookie , 「*://*/*」用来获取 HTTP/HTTPS/WebSocket 链接的访问权限。

需要注意的是,如果只给了「cookies」权限,但没给对应的 URL 访问权限,也是获取不到对应的 cookie 的。

4.3 获取重新下载所需要的信息

4.3.1 通用信息

downloadItem 里包含 filename/finalUrl/referrer/fileSize …

注意事项: suggest 一定要执行一次,无论同步还是异步,无论是否取消下载。

4.3.2 cookies

4.3.3 组装 request header

4.4 使用 aria2 下载

到这一步,可以将所有下载链接重新用 aria2 下载, sendHttp 部分可从网上找。

4.5 添加提示框

一开始是用「confirm」和「prompt」来实现一个选择的效果, 但因为有个解决不了的问题:内置下载器会自动弹出来。 因此想使用定时器来自动取消下载,但使用「confirm」和「prompt」会中止代码运行,使得定时器不生效。 假设在选择操作前设置定时器自动取消下载,如果想「suggest」在选择操作完成之后才运行,那就有可能在等待的过程中, 定时器没生效,而且 chrome 自己把 「suggest」弹出来了,这时再选择的话,就会导致「suggest」重复运行,从而报错。

由于定时器不生效及操作步骤的原因,考虑实现自定义弹框。

本来想用 JavaScript 实现自定义的「confirm」和「prompt」,不过只找到将控件 显示/隐藏 的逻辑。 之后想起用到的「沙拉查词」扩展,有快捷键显示查询面板,粗略看了下,应该是使用 chrome extension 中的 content scripts,要在当前网页插入代码。 感觉略微复杂,继续找,发现 background 能自定义 HTML,但用处不大,因为这个页面是不显示的。 之后就找到 chrome.windows.create ,可以创建「popup」窗口,也算能满足我的需求。

页面布局和消息通讯就没什么好讲的,网上也能找到。

关于按钮点击事件的要注意一下,因为 chrome extension 不允许将字符串转为可执行代码, 因此要用别的方法实现点击操作:

还有一个小问题,就是这个弹框的关闭按钮不知道怎么隐藏,因此只好加上 window.onbeforeunload 。 如果在 createdCallback 中调用 chrome.windows.remove ,那也会触发 window.onbeforeunload

5 额外内容(JavaScript export/import)

扩展可以加一个设置界面,但感觉不会用到,又想有一个地方配置一些数据,因此想抽出一个配置文件。 「background」想要引入别的文件的话,要用一个 HTML 以「module」的形式引入 JavaScript。


记一次 aria2 chrome 扩展的琢磨过程的评论 (共 条)

分享到微博请遵守国家法律