图床是指专门用于存储图片并生成外链的服务器。对于笔记或者博客而言,一个稳定、快速、免费的图床可以极大提升工作效率和阅读体验。Gitee是一个国内的代码托管平台,通过它我们可以方便地搭建自己的图床。
Gitee免费提供了单仓库500MB,单文件50MB的容量。
在早期,Gitee公共仓库内的文件可以无限制的外链访问,因此曾经作为图床非常流行。然而现在Gitee加了防盗链系统,对于大部分图片格式的外链通常都会失效,此外,把文件放在公共仓库也不太安全,所以这里我们可以部署一个Cloudflare Worker,调用Gitee的OpenAPI来实现私有仓库图床。
Cloudflare Worker是一种Serverless服务,我们可以使用JavaScript编写一些代码并免费部署到Cloudflare Worker平台,用于提供HTTP接口服务。Cloudflare Worker是免费使用的,不过有一些调用次数的限制(每日100000次)和CPU执行时间的限制,但对于个人用户来说已经完全够用了。
为了使用OpenAPI,我们需要创建一个私人令牌,它可以理解为调用API的Token。
根据文档,我们调用获取Raw文件接口即可获取仓库内的文件。
Cloudflare Worker工程可以在本地创建随后部署到平台上,也可以直接在Cloudflare控制台的页面上创建,由于我们的代码特别简单,其实两种方式都可以使用。有关Cloudflare的其它介绍可以参考这篇文章。
总而言之,我们需要编写这样一些代码。
const accessToken = '';
const owner = '';
const repo = '';
const ref = 'master';
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
const path = url.pathname;
const req = `https://gitee.com/api/v5/repos/${owner}/${repo}/raw/${path}?access_token=${accessToken}&ref=${ref}`;
let response = await fetch(req, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
},
});
return new Response(response.body, {
status: response.status,
body: response.body,
headers: response.headers,
});
},
};
代码中,accessToken
是Gitee的私人令牌,owner
是你的Gitee用户名,repo
是你的Gitee仓库名,ref
是分支名称,我们这里使用master分支。代码逻辑也很简单,其实就是把文件从Gitee下载下来,转发给用户的浏览器。
部署到Cloudflare Worker平台后我们就可以使用了。Cloudflare会给Worker分配一个默认的域名,我们也可以将Worker绑定到我们自己的域名上。假如我们的Worker域名是cloudflare-gitee-imgbed.gacfox.workers.dev
,那么我们访问https://cloudflare-gitee-imgbed.gacfox.workers.dev/1.png
,即可获取Gitee仓库中对应Repo下master分支的/1.png
文件。
我们可以用Postman添加Referer
请求头来测试,可以看到经过Cloudflare Worker,防盗链系统被绕过了。
当然,这种方式也存在一些不足,比如:速度比原来直接访问Gitee慢很多,Cloudflare Worker有调用次数限制等,而且使用Gitee代码仓库作为图床或是网盘本身也是一个灰色地带,它可以被归类为一种滥用行为,Gitee未来可能会持续封堵这些漏洞。如果有条件,其实还是使用国内外云厂商的OSS(对象存储服务)更为合适。