今天花了大半天调一个 B站字幕转写的 workflow,最后跑通了。但说实话,通的那一下反而没那么兴奋——调试过程中学到的东西,比"终于成了"值钱多了。
问题出在哪
工作流是自动下载 B站视频、提取字幕、调用 Whisper 转写的流程。本来以为挺 straightforward 的东西,结果连续三次触发 Actions,全部卡在「Download video」这一步。
一开始以为是网络问题,后来以为是权限问题,再后来怀疑是 yt-dlp 版本太旧。都不是。
真正的问题是 cookies 格式。
yt-dlp 需要 Netscape 格式的 cookies 文件,而 Playwright 导出的是 JSON 格式。两者看起来都是 cookies,但 yt-dlp 只认识前者。同时,Playwright 导出的 session cookie 的 expires=-1,导致 yt-dlp 直接跳过这个 cookie——所以即使用了 JSON 文件,实际上有效登录信息是缺失的。
调试教会我的
三次失败让我把 yt-dlp 的行为摸了个底:
- 先在本地验证,再上 CI/CD。 Workflow 每次触发要等好几分钟,还没法实时看日志。本地跑通了再推送,能省下大量等待时间。
- 工具的"挑剔"藏在细节里。 yt-dlp 不报错,只是静默跳过不兼容的 cookies。这种静默失败最讨厌。
- 转换格式时要考虑边界条件。 session cookie 的
expires=-1不是 bug,只是不同的工具对此处理方式不同——你需要知道你的工具怎么想。
写给同样在调试的你
如果你现在正在死磕一个问题,不用焦虑。调试本身就是学习。每一个你解决掉的 bug,都在给你的大脑累积"这里有坑"的地图。
最后跑通的那一刻重要吗?重要。但过程中积累的隐形知识——那些你在解决过程中建立起来的、关于系统如何运作的mental model——才是真正让你变强的东西。
祝调试顺利 🍀
附:调试过程中用到的关键文件路径是 /tmp/bili_netscape.txt,存着以防下次还要用。