插件
云取的插件是一段 JavaScript:不用编译、不用打包 APK —— 写一个 .js 文件,装进应用,启用,它就开始工作。它负责认出链接、算出真正的下载地址、拼请求头、算签名,以及任务结束后做点收尾的事。
插件市场在应用里:设置 → 插件市场。那一页管「哪里能拿到插件」——加源、看源里有什么、从源里装、检查更新;旁边那一行 设置 → 插件 管「本机装了什么」——启停、看运行状态、卸载。
插件不经手下载数据流
这一条是刻意的边界,不是还没做完:插件只在下载任务开始之前和结束之后参与。没有流式 API,没有 body 句柄,没有「每收到一块数据调一次」的回调;插件也不能注册下载后端(试着注册会直接返回 unsupported)。
分片与字节面留在 Kotlin 里,脚本就永远不会站在数据路径上。否则一个写得不好的插件(或者干脆是恶意的)会变成整条下载链路的带宽瓶颈 —— 而且每个数据块都要跨一次 JS 边界,代价比下载本身还大。所以插件的定位是「算 URL / 拼头 / 签名 / 解析分享链接」,不是「自己实现一个下载器」。
认链接、算下载地址
注册解析器:把一个分享链接变成一条或多条可下载的请求。
改提交前的任务
提交前钩子:拼请求头、算签名、改写这次请求。
任务结束后收尾
结束后钩子:记日志、清理临时转存这类只观察的事。
块数约为连接数的四倍:慢连接不会独占最后剩下的那点工作
官方插件源
官方源就是 YunGet-Plugins 这个仓库:一份 JSON 索引 + 插件源码 + 公钥,没有服务器、没有后台。App 拉的是它根目录下的 plugins.json。本页的条目直接从那份索引里读出来渲染,当前源里有 2 个插件。
| 源 | 自称等级 | 签名 keyId | 验签算法 / 载荷 |
|---|---|---|---|
| 云取官方插件源 official | official | official-2026 | ed25519 / raw-script-bytes |
本节的所有数字都是从那份索引文件里读的,不是手抄的
支持页
链接解析
Example Cloud Parser
示例插件:example:// 链接 → 一条 https 下载请求(含权限声明、文件名清洗、签名样例)
申请的能力:http、crypto —— 装之前请看清楚,http 意味着它能把你的链接发出去。最低宿主版本 2.6.22。签名验证通过:keyId=official-2026、sha256=b1aa85197621be29…。签名覆盖脚本原始字节,任何改动都会让校验失败并拒绝安装。签名只回答「内容有没有被改过、是不是这把钥匙发的」,不回答「作者写得好不好」。首次发布:example:// 链接解析、文件名清洗、stableKey 去重、可选 ?resolve=1 直链解析。
怎么装
方式一:在应用里从市场装(推荐)
- 云取 → 设置 → 插件市场;
- 加一个源:添加源 → 填索引地址 → 选信任等级 → 点「只添加源」。官方源的索引地址是 https://raw.githubusercontent.com/jiayuxuan123/YunGet-Plugins/main/plugins.json;
- 源会列出它里面有哪些插件,点进某个插件看权限与信任等级;
- 点「安装」—— 装之前会弹一次权限确认,确认之前不下载;
- 装完默认就是启用状态,在 设置 → 插件 里能看到它注册了什么、占多少内存。
方式二:手动导入一个 .js 文件
- 从插件的源码地址下载那个 .js 文件;
- 云取 → 设置 → 插件 → 底部 从文件导入,选中它;
- 也可以直接 粘贴脚本:粘贴时先点「校验」——校验只解析、不执行,会告诉你它会注册什么、声明了哪些能力。
能力级别:手机上只有一档
插件还有能力级别这一维。它回答的是「这东西能碰到多大范围的能力」以及「改了要不要重启 App」。云取曾经规划过两档:沙箱里的 JS(L1)与宿主进程内的原生代码(L2)。Android 端现在只保留 JS 一档——原生插件在手机端暂时停用,后续出 Windows 版时在 Windows 端启用。
| 级别 | 运行位置 | 能做什么 | 生效时机 |
|---|---|---|---|
| JS 插件 level: "js" | 应用内的 JS 沙箱,进程内 | 网盘登录 / 解析 / 取直链、网页与 API 调用、规则与轻逻辑 | 可热加载,装上或更新后立即生效 |
| 原生插件(手机端暂时停用) level: "native" | 宿主进程内,Kotlin/JVM 原生代码 | 曾经用来承载新的下载后端、Adapter 与文件 Handler | 手机端不生效:条目会被拒绝,并说明原因;计划在 Windows 端启用 |
索引里没写 level 的存量条目一律按 JS 读;条目写着 native 时,应用会拒绝安装它,并给出「原生插件在手机端暂时停用,后续 Windows 版将启用」这句明确说明 —— 而不是含糊地提示去升级应用。
信任等级:四级都能装,差别在提醒
等级说的是「这个源 / 这个插件的身份可信到什么程度」,四级都能装,差别在界面上怎么显示、低等级时有没有醒目提示。
| 等级 | 什么情况下给 | 界面怎么显示 | 能装吗 |
|---|---|---|---|
| 官方 official | 源的身份是官方,且签名公钥随应用内置 | 主色实心徽标,标「官方」 | 能 |
| 已验证 verified | 用户主动添加的源,条目带签名,公钥由该源自带(有签名,但发布者身份靠源自己声明) | 次级样式容器,标「已验证」 | 能 |
| 社区 community | 用户主动添加的源,条目带签名但公钥来自网络 | 中性样式,标「社区」 | 能 |
| 未验证 untrusted | 没有签名,或公钥拿不到(含从文件 / 粘贴导入的脚本) | 错误色系,标「未验证」+ 明确风险提示 | 能 |
官方 = 源是官方 且 公钥随应用内置;其余等级只有签名,发布者身份靠源自己声明
分类来自插件清单,不是客户端写死的
实际授予 = 声明 ∩ 加载器上限 ∩ 用户已确认 —— 没有任何 API 能改它
所以「网盘接口变了要等应用更新」这件事,对内置的那几个成立、对插件不成立
两条不肯让步的规则:
- 内置公钥只认官方源。判定 official 要「源的身份 + 公钥来源」两个条件同时满足 —— 不能因为某个第三方源用了同一把公钥就把它当官方,那意味着任何人拿到官方签名过的插件就能自建一个「官方源」。
- 等级只影响显示与提示,不影响校验。无论哪一级,安装都要求 sha256 + 签名齐备。低等级不是「可以少验一点」,而是「验完了仍然要提醒你」。
另外两条实情:用户为该源选的等级优先于索引自称的等级(索引自称高于用户所给时取用户的),所以 fork 一份索引把 trustLevel 改成 official 没有用;自建源被添加时默认就是 community,不是「已验证」。完整的校验链、以及这份机制不做的那些承诺,写在插件安全模型里。
开发自己的插件
插件 API 是一套稳定 ABI:注册解析器与钩子、发 HTTP 请求、算摘要与 HMAC、读写自己的小存储、打日志、用定时器。所有函数、参数与上限都有文档,官方源里那个示例插件就是可以直接照着改的模板。
插件源仓库
官方源在 GitHub 上:https://github.com/jiayuxuan123/YunGet-Plugins。里面有索引、每个插件的源码与清单、公钥,以及签名工具 tools/sign_plugin.py(零依赖可用)。想提插件就 fork 它、提 PR;想自建一个源,也只需要一个能通过 https 访问的静态目录。