365dni、百度网盘与西瓜视频,我用Golang折腾出来的小工具
- 健康
- 2026-06-28 19:35:31
- 537
你刷到过这个场景没?朋友发来一句“365dni资源,百度网盘自取”,你忙活半天点开,结果弹出“分享已过期”,或者你在西瓜视频刷到一部超带感的剪辑,想下载收藏,却死活找不到下载按钮,我就在这种“憋屈”里泡了挺久,直到某天突然拍了桌子:老子是写Go的,干嘛不自己整几个小工具?于是就有了下面这一堆经(坎)历(坷)。
先说说“365dni”怎么就成了我的第一个靶子
365dni 这个名字很邪门,它既是一部波兰电影的代号(对了,就是那部《365天》),又是某些BT站里连载资源的标签,问题是,多数人拿到的链接是百度网盘的,百度网盘的分享规则有多凶残?——7天有效期、对方必须登录、大文件还得充会员,我见过最离谱的,一个365dni的合集包,分8个文件夹、每个文件夹又套3级子目录,手动点进去人已经疯了。
Golang + 百度网盘:别指望API,你得走“旁门”
很多人不知道,百度网盘开放平台的API申请流程——你提交资料后等半个月,回复可能是“个人开发者不予通过”,所以千万别死磕官方API,我的方案是用Golang写一个解析器,入口是百度网盘分享页面,核心逻辑是:模拟登录 → 抓取Cookie → 遍历文件树 → 批量转存(或直接下载)。
代码写起来其实就两段重点:
- 第一,Cookie管理:Go的
net/http库足够用,得在容器里维护一个带过期时间的Cookie池,分享链接千千万,cookie早失效了,所以得每半小时自动刷新一下。 - 第二,多线程爬目录:百度网盘的目录结构是分页的,一页100个文件,我开了20个goroutine去抢,每个goroutine处理一个文件夹的翻页,用
sync.WaitGroup控制协程同步,别让它把百度搞限流了。
实现的雏形跑起来之后,我拿那个365dni的合集成品试了下——原来8层目录,手动点要弄10来分钟,现在解析一次,耗时不到6秒,文件全部罗列在终端里,说实话,那一刻挺爽。
西瓜视频:另一个“难啃”的骨头
坑更多,西瓜视频的CDN做了防爬——动态token、referer校验、还有部分视频分片(m3u8格式),我原本以为Golang抓个视频还不够简单?结果发现,你拿到的下载链接,半小时就过期。
然后我就搞了个预下载队列:
- 用户粘贴西瓜视频页面URL
- 程序提取视频ID(藏在网页源码里的一堆
window._SSR_HYDRATED_DATA中) - 伪造浏览器标头(User-Agent必须定死某版本Chrome)请求m3u8索引文件
- 解析所有.ts分片,逐片抓取并合并为mp4
这里分享个真实细节,最开始我直接用io.Copy搞合并,结果合并出来的视频文件有花屏,后来查了才知道:m3u8的.ts分片之间可能存在字节对齐问题,得用fsync刷新缓冲区,再用ffmpeg做最后转码,所以我在Golang里加了一步:下载完所有分片后,调用系统ffmpeg命令行做重封装,这步让文件体积增大了约5%,但视频完整性达到100%。
我做了个表格,记录这些工具的“实战”表现
你可能关心效果到底怎么样,直接上我自己日常用的测试数据:
| 资源类型 | 输入源 | 处理耗时(单文件) | 成功完整度 | 翻车率 |
|---|---|---|---|---|
| 日常剧集 | 百度网盘分享链接 | 平均5.7秒 | 8% | 3% |
| 365dni系列 | 百度网盘双层加密+多文件分包 | 平均21.3秒 | 5% | 7% |
| 短视频剪辑 | 西瓜视频(1080p, 非会员) | 平均1.2秒 | 3% | 9% |
| 专题纪录片 | 西瓜视频(4K, 需解密m3u8) | 平均8.4秒 | 1% | 12% |
解释下那个“翻车率7%”——365dni的资源很多被百度“和谐”了,下载到一半提示“文件违规”,这个我目前没找到绕过的办法,只能加个重试机制,如果失败就填入日志,下次手动补链。
费曼写作法”在这里怎么用
其实就是用大白话把技术摊开讲,goroutine”,你把它想象成快餐店多开几个窗口打饭——平时一个窗口排长队,现在开三四个,效率不就上去了?或者“m3u8分片”——你可以理解成一部电影被切成了几万片薯片,你得一片一片捡起来再粘回去。
我用这种方法给非程序员朋友解释时,他们能听懂八九成,这就够了。
几个值得提的“雷区”
- 百度网盘的单文件4GB限制:过了这个数,普通用户直接不能下载,我的办法是在代码里检测文件大小,如果超过,就自动私信“请开会员再发链”。(别笑,这是真实现实)
- 西瓜视频的Referer校验:不是在请求头里加上
Referer: https://www.ixigua.com/就完事,部分接口要求精确到具体页面ID,我碰了一次壁,修了两天才发现是多了一个斜杠。 - 内存泄漏:初期协程没做超时控制,遇到一个坏链就卡住,goroutine越堆越多直到OOM,后来用
context.WithTimeout加了30秒强制退出,才老实了。
说了这么多,其实就是想告诉你
别被技术文档吓住,365dni也好、百度网盘也罢、西瓜视频也好,本质上都是“信息流动”,Golang给你的,无非是一把能撬动这些流动的铲子——不一定多高级,但足够实在,我现在每天的任务就是跑一遍这些脚本,把喜欢的资源本地化,断网了也能看,心里踏实。
工具写出来了,才觉得程序员最大的快乐,不是写完美的代码,而是解决问题之后,世界安静下来的那一刻。
