aliyundrive-webdav 诞生记

起源

2021年8月份的时候开始使用阿里云盘，某天在 V2EX 上看了一个帖子《当 [Infuse] 遇上 [阿里云盘] 🚀》了解到可以通过 @zxbu 开源的webdav-aliyundriver 项目给阿里云盘添加 WebDAV 协议支持，从而可以将阿里云盘通过 rclone、davfs 和 RaiDrive 等软件挂载为磁盘使用，或者通过 Infuse 访问作为媒体服务器，而 Infuse 支持 Apple TV 并且能够自动扫描媒体文件抓取封面、字幕等构建媒体库，作为一个 Apple TV 用户自然很喜欢看云盘视频内容更方便了。

前不久也入手了一个 NanoPi R4S 软路由，配置一个双核 Cortex-A72 和一个四核 Cortex-A53、4G 内存性能不错可以跑 Docker，想着可以把 webdav-aliyundriver 容器跑在软路由上，尝试了之后遇到 network_mode 为 bridge 运行报错的问题，改成 host 后正常。不过由于它是 Java 语言实现的，占用内存随随便便就几百兆了比较高，看着挺不舒服的，况且程序员嘛本来就喜欢自己捣鼓，于是就萌发了使用 Rust 语言自行实现一套的想法，这就诞生了 aliyundrive-webdav 项目。

发展

第一个版本

说干就干，Chrome 网络调试分析了一遍阿里云盘网页版本的接口之后，大约花了三个晚上的时间，发布了只支持下载功能的第一个 0.1.0 版本，从一开始就有了比较完善的基于 GitHub Actions 的 CI/CD 流程自动构建基于 musl libc 的二进制文件打包发布到 GitHub Releases，得益于 [maturin] 项目非常方便地将这个 Rust 编译的二进制文件像一个普通 Python wheel 一样发布到 PyPI 上使得主流操作系统如 macOS、Linux 和 Windows 可以通过 pip install aliyundrive-webdav 安装使用。

OpenWrt 插件

前面提到的二进制包已经可以在 NanoPi R4S 软路由上运行了，但因为没有 init 配置，在路由器重启后不能自动启动，另外程序运行需要配置阿里云盘 refresh_token 参数，而该参数存在有效期虽然程序会自动定时刷新，但当需要提供全新的 refresh_token 参数时没有配置界面不是很方便，于是便学习了 OpenWrt Packages 文档，又在参考了一些现成的 OpenWrt 插件源代码之后完成了第一个版本的 OpenWrt 插件开发，同样集成了完善的 .ipk 文件 CI 自动编译打包流程。

Rust 编译的基于 musl libc 的二进制文件因为是全静态链接文件大小比较大，而很多路由器可用的存储空间都比较小，为了尽可能减少 .ipk 文件大小，增加了 Link Time Optimization 和 opt-level = "z"（优化产出物大小），并自动 strip debug symbols，即便如此二进制文件仍然有 5MB 左右，祭出大杀器 upx 对二进制进行压缩后直接减少约 44% 至 2.2MB 左右，非常厉害。不过后来也遇到过 upx 3.96 压缩的 MIPS 架构二进制文件启动即卡死的问题，只能降级到 3.95 版本解决。

梅林插件

当时手上还有个洋垃圾网件 R8000 路由器，刷了 Koolshare 的梅林系统有个软件中心可以安装第三方插件，就想着能不能我也写个梅林插件做个简单的配置界面方便使用，在参阅了《梅林软件中心插件开发教程详解》和一些梅林插件源代码之后，做了第一个支持比较老的梅林 ARM380 固件的 aliyudrive-webdav 插件。可惜后来这个因为空调漏水，这个洋垃圾路由器壮烈牺牲。现在换了国产辣鸡红米 AC2100 纯当 AP 使用，因为是 MIPS 架构的 CPU，偶尔也能用来测试一下。

论坛宣传

迭代了几个小版本后，在 V2EX 上发帖《阿里云盘 WebDAV 路由器版本》宣传了一下，得到了一些网友们的回应，带来了一些流量，GitHub issue 上渐渐多了一些提问和 feature requests。逐渐增加了 armv7、armv5te、x86_64 和 MIPS 等架构支持并发布了支持多种 CPU 架构的 Docker 镜像，还开发了呼声较高的上传文件功能。

社区贡献

@flyhigherpi 贡献了梅林 384/386 固件版本的支持，也吸引了国内 OpenWrt 社区比较活跃的 @Beginner-Go 的贡献改进了我的菜鸡 OpenWrt package 代码使之更加标准和规范化，后来还将 aliyundrive-webdav 提交收录至国内比较流行的 lede Lean's OpenWrt source 代码仓库，逐渐被各个 OpenWrt 固件发行版本收录编译方便用户安装使用。

为了支持 armv5te 和 MIPS 架构，也对依赖的两个不兼容的 Rust crates 提了 Pull Request 或者 Issue，通过与上游合作，增加了此类 32 位系统的支持，比如 quanta 和 moka。也许 aliyundrive-webdav 这个项目不会很长久，但开发过程中产出的对 Rust 社区 crates 的改进会长久留存下去，Rust 这个比较年轻的语言的生态会越来越好。

Star History

aliyundrive-webdav 项目至今三个月，GitHub Star 增长速度可能是我目前的开源项目中最快的，如下图

Takeaways

这个用爱发电的开源项目，几乎没有带来任何收入，但却能让人看到开源社区有趣的一面，尽管大家互不相识，却能热情、高效地解决遇到的问题和困难。

另外，永远不要假设你的产品用户一定会怎么用，尽管我最初是想在 NanoPi R4S 这样的相对较高性能的软路由上跑来看视频的，也有些喜欢捡垃圾的用户却要跑在斐讯N1盒子、玩客云、威联通 NAS 等各式各样的平台上，用 rclone、davfs 或者 RaiDrive 配合 NAS 的文件同步服务比如群晖 CloudSync 单向/双向同步文件。

因为我目前工作在蚂蚁集团，正好也在阿里云盘内部反馈钉钉群中，也看到一些内部用户向官方团队提出需要 TV 版本或者 WebDAV 协议支持的需求，一开始他们是拒绝的回复说 WebDAV 是很老的协议兼容性也不好什么的，后来有一天改口说 WebDAV 协议支持设计中了，期待官方支持上线的那一天。

[maturin]: https://github.com/PyO3/maturin

爱发电上赞助