用Cloudflare Worker和Gitee搭建图床

目录:杂谈  |  标签:Git  |  发表于:2024-06-29 11:57:16

图床是指专门用于存储图片并生成外链的服务器。对于笔记或者博客而言,一个稳定、快速、免费的图床可以极大提升工作效率和阅读体验。Gitee是一个国内的代码托管平台,通过它我们可以方便地搭建自己的图床。

Gitee图床和Cloudflare Worker

Gitee免费提供了单仓库500MB,单文件50MB的容量。

在早期,Gitee公共仓库内的文件可以无限制的外链访问,因此曾经作为图床非常流行。然而现在Gitee加了防盗链系统,对于大部分图片格式的外链通常都会失效,此外,把文件放在公共仓库也不太安全,所以这里我们可以部署一个Cloudflare Worker,调用Gitee的OpenAPI来实现私有仓库图床。

Cloudflare Worker是一种Serverless服务,我们可以使用JavaScript编写一些代码并免费部署到Cloudflare Worker平台,用于提供HTTP接口服务。Cloudflare Worker是免费使用的,不过有一些调用次数的限制(每日100000次)和CPU执行时间的限制,但对于个人用户来说已经完全够用了。

调用Gitee的API

为了使用OpenAPI,我们需要创建一个私人令牌,它可以理解为调用API的Token。

根据文档,我们调用获取Raw文件接口即可获取仓库内的文件。

创建Cloudflare Worker工程

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(对象存储服务)更为合适。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap