Yiero 发表于 2023-9-12 17:10:27

[油猴脚本开发指南] 使用a链接触发迅雷下载

本帖最后由 Yiero 于 2023-9-12 21:18 编辑

> 本帖最后由 Yiero 于 2023-9-12 17:13 编辑

# a链接触发迅雷下载

虽然我不用迅雷, 总有人会用到呢?

> 我也想不到这个的使用场景, 有需求的可以说说具体什么情况下会使用到?

## 原理

电脑在安装迅雷之后就会支持 `thunder` 协议, `thunder` 协议是迅雷自己支持的协议, 点击一个 `thunder` 协议的链接就会触发迅雷的下载框.


所以我们需要做的就是将一个下载链接转化成 `thunder` 协议的链接.

## thunder 协议

原理其实很简单:

1. 首先在链接的首尾添加特殊字符: 开头添加 **AA** , 结尾添加 **ZZ**
2. 再将其进行 **base64** 编码;
3. 最后再添加thunder协议头, 将其返回 **thunder://**.

***

比如:

现在有一张图片, 这是我在网上随便搜的一张 Bilibili 图标.

```js
let link = 'https://p1.ssl.qhimg.com/t01cf7f93a00e61e5e9.jpg';
```

如果直接打开, 或者通过 `<a href="https://p1.ssl.qhimg.com/t01cf7f93a00e61e5e9.jpg">` 打开, 都是浏览器直接出现一张图片. 因为只有在同源情况下, 才能够直接通过 a 标签下载, 使用 HTML5 的 [`download`](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/a#%E5%B1%9E%E6%80%A7) 属性也是一样的.

> 如果需要下载跨域资源, 需要在Js中操作链接生成Blob再下载, 感兴趣可以查看 [\](https://www.npmjs.com/package/downloadjs?activeTab=code) 这个库的实现.

**Step-1 添加特殊字符**

首先, 我们在链接的首尾添加上特殊字符:

```js
link = `AA${link}ZZ`;
// -> 'AAhttps://p1.ssl.qhimg.com/t01cf7f93a00e61e5e9.jpgZZ'
```

**Step-2 进行base64编码**

```js
link = btoa(link);
// -> 'QUFodHRwczovL3AxLnNzbC5xaGltZy5jb20vdDAxY2Y3ZjkzYTAwZTYxZTVlOS5qcGdaWg=='
```

> 参考文档(Base64转换): (https://developer.mozilla.org/zh-CN/docs/Web/API/btoa)

**Step-3 添加thunder协议头**

```js
link = `thunder://${link}`;
// -> 'thunder://QUFodHRwczovL3AxLnNzbC5xaGltZy5jb20vdDAxY2Y3ZjkzYTAwZTYxZTVlOS5qcGdaWg=='
```

***

经过这三步, 一个链接就被我们转化成了一个 thunder 协议的链接, 如果将这个链接赋予某个 a 标签的 `href` 属性, 那么点击该 a 标签就会弹出迅雷打开许可通知, 允许之后就会使用迅雷下载这张图片.

## 示例 - 将页面中带有 `data-thunder` 标识的a标签转化成迅雷链接

本示例是使用了本地的网页进行演示, 如果是脚本也是一样的, 就是获取需要转换的a标签的 href 链接, 然后调用 `transformThunderLink()` , 最后将原链接替换成转化后的 thunder 链接.

**HTML代码片段**

```html
<a data-thunder href="https://p1.ssl.qhimg.com/t01cf7f93a00e61e5e9.jpg">下载</a>

<script>
    /**
   * 将链接转化成 thunder 协议的链接
   * @param { string } link
   * @Return { string }
   * */
    function transformThunderLink( link ) {
       // 1. 首先在链接的首尾添加特殊字符:首AA, 尾ZZ ( `AA${ link }ZZ` )
       // 2. 再将其进行base64编码 ( btoa() )
       // 3. 最后再添加thunder协议头, 将其返回 thunder://
       return `thunder://${ btoa( `AA${ link }ZZ` ) }`;
    }
   
    // 将所有带data-thunder标识的a链接转化成迅雷链接
    document
          .querySelectorAll( 'a' )
          .forEach( link => {
             link.href = transformThunderLink( link.href );
          } );
</script>
```

**图示**

!(data/attachment/forum/202309/12/170603tzc2cbz6p1pm68n8.png)

```
```

李恒道 发表于 2023-9-12 20:43:35

这个有意思!一直没有迅雷下载的相关资料

李恒道 发表于 2024-3-19 05:55:04

已整理进指南,麻烦哥哥后续该文章如果更新告诉我一声~
页: [1]
查看完整版本: [油猴脚本开发指南] 使用a链接触发迅雷下载