乐于分享
好东西不私藏

想保存视频号视频?不装软件,也能直接下载

想保存视频号视频?不装软件,也能直接下载

我最近做了一件挺有意思的事。

把一个原本需要在本机运行、依赖微信客户端和系统代理的视频号下载项目,拆出其中的在线解析能力,部署到了 Cloudflare。

现在打开 https://wx.defou.ai,粘贴一个视频号分享链接,就可以直接查询视频信息并下载。

整个过程没有购买服务器,也没有配置 Docker,没有部署 Go 后端,更没有自己维护一台 VPS。

不过,这个过程并不是把整个项目直接丢到 Cloudflare 上。

原项目的主体是桌面下载器,它需要在 macOS 或 Windows 本机上运行,依赖微信客户端、本机证书和系统代理。Cloudflare Workers 不能替代本机微信,也不能替代本机代理。

真正适合部署到 Cloudflare 的,是仓库里已经存在的视频号分享链接在线解析功能。

这也是整个部署过程中最重要的判断。

不要先问一个项目能不能上云,先拆开看,项目里究竟是哪一部分适合上云。

项目里真正适合部署的部分

项目地址:

https://github.com/ltaoo/wx_channels_download

下载项目:

git clone https://github.com/ltaoo/wx_channels_download.gitcd wx_channels_download

视频号在线解析功能位于:

internal/api/sph/

主要文件是 worker.js 和 index.html

用户在网页中粘贴分享链接,页面向 /api/fetch_video_profile 发送 POST 请求。

Worker 收到请求后做两步工作。

第一步,把分享链接提交给元宝接口,得到视频导出信息。

第二步,根据导出的 Token 和 ID,请求视频号 Feed 信息,拿到真正的视频地址。

最终把结果返回给前端。

为什么没有直接使用原来的 Go 部署命令

原项目已经提供 sph_deploy 命令,可以通过 Go 代码调用 Cloudflare REST API 发布 Worker。

这个方式可以使用,但如果以后要接 GitHub Actions,或者交给别人维护,标准 Wrangler 项目更直观。

因此进入目录后,先安装依赖:

cd internal/api/sphnpm install

然后使用:

npx wrangler loginnpx wrangler whoami

完成 Cloudflare OAuth 登录。

先 dry-run,再部署

执行:

npm run check

它会生成图标模块、检查 worker.js 语法,并执行 Wrangler dry-run。

成功后再执行:

npm run deploy

第一次部署会得到一个 workers.dev 地址。先用 curl 检查主页返回 200,再继续配置 Secret。

为什么需要元宝 Cookie

视频号分享链接的解析依赖元宝 Web 端接口,而这个接口需要认证状态。

获取方法是,在元宝页面登录后打开开发者工具,切换到 Network,提交一个视频号分享链接,找到 get_parse_result 请求,然后查看 Request Headers 中的 Cookie。

真正需要的字段只有:

hy_sourcehy_userhy_token

不要把完整浏览器 Cookie 写进项目,也不要把 Cookie 放进 wrangler.toml

正确方式是:

npx wrangler secret put COOKIE

写入之后,Worker 可以通过 env.COOKIE 读取。

如果忘记设置,接口会返回:

{  "error": "COOKIE secret is not configured"}

这样问题会非常明确,不需要从上游错误里猜原因。

验证视频解析

curl -X POST \  https://wx-channels-download.<你的子域名>.workers.dev/api/fetch_video_profile \  -H 'Content-Type: application/json' \  --data '{"url":"https://weixin.qq.com/sph/你的分享链接"}'

返回内容会包含作者信息、视频描述、互动数据、封面地址,以及可播放的视频地址。

本次实际验证返回 HTTP_STATUS=200,说明 Cookie Secret 已生效,分享链接解析成功,视频地址可以返回到前端。

页面改造

原页面有一个原始 JSON 展示模块。它适合开发调试,但不适合普通用户,所以删除了。

页面保留:

  • • 视频播放器
  • • 视频封面
  • • 作者头像和名称
  • • 视频描述
  • • 点赞、评论和转发数量
  • • 普通下载按钮
  • • 原始视频下载按钮

页脚增加了开源项目入口和 X 入口:

<a href="https://github.com/ltaoo/wx_channels_download">  开源项目</a><a href="https://x.com/wangdefou">  X · @wangdefou ↗</a>

之后根据实际使用体验,顶部品牌文案也被删除,只保留页脚入口。

绑定自定义域名

默认的 workers.dev 域名可以使用,但长期对外提供服务时,自己的域名更合适。

这次使用:

wx.defou.ai

在 wrangler.toml 中加入:

routes = [  { pattern = "wx.defou.ai", custom_domain = true }]

关键是 custom_domain = true。它会让 Cloudflare 自动处理 Worker Custom Domain、DNS 记录、HTTPS 证书和请求路由。

重新部署:

npm run deploy

如果 Wrangler 显示:

wx.defou.ai (custom domain)

就说明绑定已经创建。

自定义域名验证

检查主页:

curl -I https://wx.defou.ai/

测试解析接口:

curl -X POST \  https://wx.defou.ai/api/fetch_video_profile \  -H 'Content-Type: application/json' \  --data '{"url":"https://weixin.qq.com/sph/你的分享链接"}'

最终验证结果:

主页,HTTP 200视频解析接口,HTTP 200HTTPS,正常DNS,正常视频下载,正常X 跳转入口,正常

现在最终访问地址就是:

https://wx.defou.ai

GitHub Actions 自动部署

为了以后修改代码后自动发布,增加了:

.github/workflows/cloudflare-sph.yml

GitHub Secrets 需要配置:

CLOUDFLARE_ACCOUNT_IDCLOUDFLARE_API_TOKENSPH_COOKIE

工作流顺序是:Checkout、安装 Node.js、npm ci、dry-run 检查、部署 Worker、写入 COOKIE Secret。

首次部署时必须先部署 Worker,再写入 Secret。如果反过来,Worker 还不存在,Secret 写入可能会失败。

常用维护命令

cd /Users/Wangdefou/wx_channels_download/internal/api/sphnpm installnpm run devnpm run checknpm run deploynpx wrangler whoaminpx wrangler secret listnpx wrangler secret put COOKIE

最后总结

这次部署真正做的事情,不是把整个桌面下载器搬到 Cloudflare,而是从一个复杂项目里找到最适合云端运行的部分。

桌面端继续负责微信客户端集成、本机代理、证书安装和本地下载控制。

Cloudflare Worker 负责接收视频号分享链接、调用解析接口、返回视频信息、提供网页界面和支持全球访问。

最后形成了一个很轻的在线入口:

https://wx.defou.ai

它没有服务器运维成本,也不需要用户安装程序。

打开网页,粘贴视频号链接,直接查询和下载。

对用户来说,只有一个输入框。

粘贴链接。

点击查询。

下载视频。

这可能就是把一个复杂工具做成产品的第一步,不是把所有复杂性都暴露给用户,而是把复杂性藏在后面,只留下一个真正能用的入口。