微信图片防盗链怎么办?我用 jsDelivr + GitHub 搭了个零成本图床

作者 潮汕阿幸 · · 笔记

做博客最扫兴的一刻,是把一篇微信文章搬过来,排版都调好了,打开预览,图全变成裂开的小图标。我第一次遇到时还以为是自己代码写错了,查了半天才搞明白,问题出在微信的图片防盗链。

这篇文章写一个我亲测能用的解法,用 GitHub 公开仓库存图,再用 jsDelivr 这个免费 CDN 把图发出来。整套不花一分钱,不用备案,国内访问也稳。读完你能给自己搭一个长期可用的图床,也能顺手把历史上传过的微信图批量搬过去。

你需要的东西很简单,只要一个 GitHub 账号。会一点 git 更好,不会也没关系,文章里给了不敲命令、直接网页拖拽的上传法。最容易卡住的有两处,一是链接格式写错导致图还是不显示,二是仓库越塞越大以后推送变慢,这两点我后面专门讲。

为什么图会破

微信文章里的图,地址是 https://mmbiz.qpic.cn/mmbiz_png/... 这种样子,关键在那个域名 mmbiz.qpic.cn。微信在那台服务器上做了防盗链,它会看请求来自哪个网站(技术上讲是 HTTP 请求头里的 Referer)。从微信自己的页面点开,Referer 是微信的域,图正常返回;从你自己的博客打开,Referer 变了,服务器直接拒绝,浏览器只能显示裂图。

锅在微信的图片防盗链。微信不让外站白嫖它的图,所以你代码写得再对,图也显示不出来。直接把 mmbiz.qpic.cn 的链接贴进自己网页的 img 标签,在微信里看没事,在自己站上看必破。

我试过的弯路

直接引原链接,如上,破。

找过几个免费图床,要么容量小,要么隔阵子就挂,还有的要登录验证才能传,长期用不放心。

也考虑过买对象存储,一算账,博客才起步,为几张图开个套餐不划算。

后来我想要的就是三件事,免费、稳定,而且文件在我自己手里。GitHub 加 jsDelivr 刚好都满足。

用 jsDelivr 加 GitHub 搭图床

先说这两样是什么。GitHub 你大概知道,存代码的地方,能建公开仓库,里面的文件有个固定网址可以直接访问。jsDelivr 是一个免费的公共 CDN,专门做一件事,把 GitHub 公开仓库里的文件,通过离用户更近的节点发出来,速度比直接拉 GitHub 快,还自带缓存。

关键是 jsDelivr 不认防盗链,你仓库里有什么它就发什么。这就绕开了微信的限制。

第一步 建一个公开仓库

登录 GitHub,新建仓库,名字随便取,比如 my-cdn。可见性一定要选 Public(公开),私有的 jsDelivr 读不到。

第二步 把图传上去

最省事的办法,在仓库页面点 Add file,把图片直接拖进去,写个提交说明,点 Commit changes,图就进仓库了。

会 git 的话也能本地推上去

git init
git add .
git commit -m "add images"
git branch -M main
git remote add origin https://github.com/你的用户名/my-cdn.git
git push -u origin main

第三步 拼出图片链接

jsDelivr 的链接格式长这样

https://cdn.jsdelivr.net/gh/你的用户名/仓库名/图片在仓库里的路径

你的仓库里 242/1.png 这张图,链接是下面这样

https://cdn.jsdelivr.net/gh/你的用户名/my-cdn/242/1.png

我自己的博客就用这套。下面这串是真实链接,你现在打开它就能看到图。

https://cdn.jsdelivr.net/gh/Axinchaoshan/axing-cdn/242/1.png

第四步 在网页里用

把上面那串链接放进 img 的 src 就行

<img src="https://cdn.jsdelivr.net/gh/你的用户名/my-cdn/242/1.png" alt="说明">

到这一步,你的图再也不怕防盗链了。

进阶 整站图片批量搬

如果你像我一样,已经搬了两百多篇文章,图全在微信服务器上,一张张下、一张张传、再一篇篇改链接,能干但人得疯。我写了个脚本批量处理,思路不复杂,你照着也能写一个。

核心四步。

第一,扫一遍所有文章,找出里面 mmbiz.qpic.cn 的图链接。

第二,把这些图下载到本地,按文章编号建文件夹,比如 242/1.png、242/2.png。下载时顺手校验一下,确认下回来的是真图片而不是微信回的一句报错,微信拒绝时常常返回一段网页代码。

第三,把文章里的原链接,逐条替换成对应的 jsDelivr 链接。

第四,把本地图片文件夹推到 GitHub 仓库。

我那个脚本还加了断点续传,已经下过的图跳过,下次跑只处理新增的,失败了记进日志不中断。全站跑完,两百多篇的图就全换成自己的图床了。

几个容易踩的坑

链接格式最容易写错。jsDelivr 用的是 cdn.jsdelivr.net/gh/用户名/仓库,不是 GitHub 网页那个 raw.githubusercontent.com 的地址,两个长得像,用错就 404。

改完图想立刻生效,可能要等 jsDelivr 刷新缓存。它一般几分钟就更新,急的话去 jsDelivr 官网有个 purge 工具,贴链接强制刷新。

仓库别塞太大。jsDelivr 对单文件大小有限制,大约 20MB,图片太多建议按文章分文件夹,也方便管理。上传前把图压一压,博客图宽度一千像素出头、质量 80% 左右,肉眼几乎看不出差别,体积能小一大半。

图床这东西,文件在你自己仓库里最踏实。哪天 jsDelivr 不顺心,换个别的 CDN 指到同一个仓库就行,链接逻辑不用重来。

常见问题(FAQ)

微信图片为什么会破图?

微信图在 mmbiz.qpic.cn 上做了防盗链,会检查请求来源(Referer);从自己站打开来源变了,服务器直接拒绝。

怎么用 GitHub + jsDelivr 搭图床?

建公开仓库 → 上传图片 → 拼 jsDelivr 链接(cdn.jsdelivr.net/gh/用户名/仓库/路径)→ 放进 img 的 src。

搭这个图床要花钱吗?

免费,GitHub 公开仓库加 jsDelivr 公共 CDN 都不收费,不用备案,国内访问也稳。

链接格式怎么写才不 404?

用 cdn.jsdelivr.net/gh/用户名/仓库名/路径,不是 raw.githubusercontent.com 那个地址,两个长得像但用错就 404。

单文件有大小限制吗?

jsDelivr 单文件约 20MB 限制,建议按文章分文件夹、上传前把图压一压。

已有文章的微信图怎么批量搬?

扫出 mmbiz 链接 → 下载校验 → 逐条替换成 jsDelivr 链接 → 推到仓库;可写脚本带断点续传。

浏览「效率软件」专题全部 31 篇 ›
← workbuddy限免期快过了,我找了个新的免费AI模型!看完我的女友景甜全文,孙宇晨的文笔还是不错的! →