# 文艺复兴!我用Go语言实现了一个ed2k下载器

7 min read
文章目录

ed2k 早就过时了,但它还没有“死”

如果你经历过电驴时代,ed2k 这个名字不会陌生,它曾经是文件共享网络里非常重要的一环,但今天它确实过时了。生态萎缩、客户端老旧、资料零散,普通用户的行为习惯也彻底迁移到了更现代的协议和服务上。

但它并没有彻底消失。仍然有不少冷门资源只在这套网络里流通,特别是一些 Windows 系统镜像。

也正因为这样,我一直觉得:ed2k 虽然老,但还没到彻底失去价值。问题只在于,它太旧了,旧到几乎已经没人愿意再认真把它实现一遍。

早就埋下的一颗种子

其实在很早之前,就有用户在 Gopeed 的 issue 里提过 ed2k 的需求:

而且包括各大开源下载器里也有不少用户在问这个需求,比如 aria2、Motrix:

那个时候我就研究过在 Gopeed 上添加 ed2k 支持的可行性,结果发现这个协议的资料非常零散,连一份权威的官方协议文档都没有。能找到的资料大多散落在 wiki、论坛帖子、老项目源码和零碎博客里,而且不同实现之间还会出现行为差异,基本很难入手。它不像 BitTorrent 那样,官方有一套标准的 BEP 协议规范文档,几乎没法直接开展开发,除非自己去看源码、抓包分析协议细节。这工作量非常大,我怕我秃了都不一定能把它做出来,所以就一直拖着没做。

AI 的出现带来转机

但近一年 AI 编程 的兴起,让我看到了新的可能性。其实需求很简单,就是让 AI 参考开源的 ed2k 项目,并用 Go 语言 1:1 复刻一个 ed2k 下载器。不过由于之前 Code Agent 和大模型的能力还不够,我尝试了几次都没有成功,就先搁置了。最近我刚好开通了 ChatGPT Plus,想着用最新的 GPT-5.4codex 再试一次,结果这次居然出乎意料地成功了,最终复刻出了一个全功能的 ed2k 下载实现。

主要参考了以下两个开源项目:

  • jed2k: 一个java实现的ed2k下载器,功能比较全,代码也比较清晰,适合用来参考协议细节和实现逻辑。
  • aMule:市面上仅存的还在维护的ed2k下载器,由于它是C++实现的,代码比较复杂,不太适合直接参考,但可以用来验证协议细节和实现逻辑。

给AI的prompt就是先让它去复刻jed2k的功能实现,然后如果有遗漏和不完整的地方,再让它去参考aMule的实现来完善细节,最终成功复刻出了一个功能完整的ed2k下载器。

开源

目前已经开源在 goed2k,它既可以作为库被其他项目调用,也提供了一个内置的 终端下载器,可以直接安装体验。

特性支持

goed2k 目前已经覆盖了一套可用的 ED2K 客户端基础能力,主要包括:

  • ED2K 文件下载
  • 多任务并发下载
  • 多个 ED2K server 并发找源
  • server.met 加载
  • KAD bootstrap 和 source 查找
  • 资源搜索
  • 暂停、继续、删除任务
  • 状态持久化与恢复
  • 上传支持
  • 任务、peer、server、piece 状态快照
  • 任务进度订阅
  • 可交互的终端下载管理器

终端下载器

如果想体验的话,可以通过命令行安装使用:

Terminal window
go install github.com/monkeyWie/goed2k/cmd/goed2k@latest

安装完成后,就可以直接运行 goed2k 进入交互终端使用,支持 搜索下载,效果如下:

上面的演示里,先通过 /search 命令进入搜索面板搜索资源,然后选择了 2 个资源进行下载。速度也还不错,接近 1MB/s。在任务管理面板中,左边可以看到任务列表,右边可以看到下载详情,包括下载速度、文件信息、连接数等。

作为库被调用

goed2k库的使用也非常简单,下面是一个简单的示例:

package main
import (
"log"
"github.com/monkeyWie/goed2k"
)
func main() {
settings := goed2k.NewSettings()
settings.ReconnectToServer = true
client := goed2k.NewClient(settings)
if err := client.Start(); err != nil {
log.Fatal(err)
}
defer client.Close()
if err := client.ConnectServers("176.123.5.89:4725"); err != nil {
log.Fatal(err)
}
if _, _, err := client.AddLink(
"ed2k://|file|example-file.mp3|12345678|0123456789ABCDEF0123456789ABCDEF|/",
"./downloads",
); err != nil {
log.Fatal(err)
}
if err := client.Wait(); err != nil && err != goed2k.ErrClientStopped {
log.Fatal(err)
}
}

上面的示例里,先创建了一个 goed2k 客户端实例,然后连接到一个 ed2k 服务器,接着添加一个下载链接,最后等待下载完成。

更多示例可以在 examples 目录中找到,这里就不一一列举了。

结语

虽然 ed2k 协议已经过时了,但它在某些特定资源的下载场景里仍然有价值,尤其是一些冷门资源。借助 AI 的帮助,我成功复刻了一个 ed2k 下载器,并且已经将这个项目开源,希望能让更多人受益。

后续我会把它集成到 Gopeed 里,让用户更方便地使用 ed2k 下载功能,敬请期待!

My avatar

感谢阅读,欢迎扫码关注我的微信公众号Levi爱折腾,第一时间获取技术干货与实用分享。


More Posts

# 亲测有效:国内订阅 ChatGPT Plus,不用海外信用卡,安卓和 iPhone 皆可

10 min read

最近 Codex 开放了免费使用,体验下来确实很不错。不过免费版额度比较低,用不了多久就会触发限制,这时候就得想办法升级。问题是,在国内订阅 ChatGPT Plus 并不算容易,支付和网络环境都不太友好。所以这篇文章主要分享一下我个人的订阅经验:无需海外信用卡或虚拟卡,走国内可操作的正规渠道,实测有效,供大家参考。

阅读

评论区