我的 Dev.to CLI 收到了第一份社区 PR:从终端上传图片
来源:dev.to — 2026-09-03
📋 概述
devpub 发布三周后,作者收到了一位素未谋面的贡献者 Harish 的 pull request——对方读懂了 issues、挑了一个作者搁置数周的功能并完整实现:devpub upload,那个本应在第一天就存在的命令,却因 Forem API 根本不提供图片上传端点而一直做不出来。文章既讲了如何通过逆向浏览器上传机制(POST /image_uploads + 会话 cookie + CSRF token + Origin)绕过 API 限制,也分享了这份优质开源贡献好在哪:fail before the network、灵活的响应解析、cookie 宽容处理,以及清晰的模块边界与 29 个测试。这正是「不只是能跑的代码,而是解释为何这样写的代码」。
🔑 核心要点
- Forem API V1 没有图片上传端点,只能引用已存在的 URL,不能创建 URL——所以 devpub upload 必须逆向 Web 编辑器的 POST /image_uploads 机制
- 该端点不认 API key,要 Devto Forem Session cookie、CSRF token 和匹配的 Origin header;devpub 把这当登录凭证存进被 gitignore 的 .env,并在 401/403 时明确提示而非报晦涩错误
- 贡献者 Harish 的实现:文件存在性/扩展名/25MB 大小校验全部在发起网络请求前完成,文件打错字不浪费任何一次网络往返
- 响应解析很灵活——links.url、image.url、images[0]、裸字符串都能处理,都不匹配就抛错并附完整响应体,因为错误 URL 悄悄进文章比大声报错更糟
- cookie 宽容处理:粘贴完整 cookie header 或只贴会话值都行,因为从 DevTools 里复制容易出错
- 好贡献不止于能跑:设计取舍说明、测试钉住请求形状而非线上响应、建议发布前用真实会话冒烟测试,还有把后续功能(push 时自动上传改写、封面图快捷键)明确划出范围
💡 金句
好的开源贡献不只是能跑的代码,而是能解释为何那样写的代码。
👍 0
👎 0
← 返回 dev.to 首页