基于 B2 和 Cloudflare 搭建一个简单的随机图片 API

发布于 2022-02-17  112 次阅读


在之前本博客一直使用 api.maho.cc 的随机图片 API 作为主页 PC 背景图来源。但是用久了自然就产生自己整一个的想法,于是便有了这篇文章。

本文将利用 Backblaze 加入了 Cloudflare 带宽联盟的特性,搭建一个简单的随机图片 API.

感谢 Luminous 大佬「【对象存储】搭配CF带宽联盟实现流量免费」提供的灵感。

什么是 Cloudflare 带宽联盟?

在 Cloudflare 官网,带宽联盟在介绍时被称为 Bandwidth Alliance. 带宽联盟中的企业都与 Cloudflare 建立了合作,并且为这些企业用户降低或免除带宽费用。

在带宽联盟中有很多企业,包括阿里云、Azure、Oracle Cloud、腾讯云、Vultr 等,也包括我们今天要使用的 Backblaze。

但是值得注意的是,尽管阿里云加入了 Cloudflare 带宽联盟,但似乎只将优惠提供给了阿里云国际站的用户,国内站并不能享受带宽联盟带来的优惠。

详情可以查看 Cloudflare 关于 Bandwidth Alliance 的介绍页面。

创建 Backblaze B2

注册链接:https://www.backblaze.com/b2/sign-up.html

在注册时我们就可以看到「First 10 GB are free」的字样。也就是说,只要我们存储的内容不超过 10 GB,再配合使用 Cloudflare,就不会产生任何费用。

注册后完成邮箱验证,便可以开始创建 Bucket 了。

在创建时,需要注意将默认的 Private 改成 Public。

将 B2 连接至 Cloudflare

由于 B2 的服务器允许所有域名接入,因此我们可以直接将域名以 CNAME + CDN 的形式解析至 Backblaze.

首先我们在 Bucket 中随便上传一个文件,然后点击文件旁边的「信息」icon,获得「Friendly URL」中的域名。例如我的是「f004.backblazeb2.com」。

然后直接在 Cloudflare 添加 CNAME + CDN 解析即可。

之后我们还需要添加一个转换规则。

点击侧边栏中的规则——转换规则,然后新建一个 URL 重写规则。

When:
(http.host eq "[Your Domain]")
Then:
concat("/file/[Bucket Name]", http.request.uri.path)

这样我们就将 Friendly URL 中的 /file/[bucket_name]隐藏掉了。

搭建随机图片 API

这里我使用了 GitHub 上的一个基于 PHP 的随机图片项目:YieldRay/Random-Picture

这个程序其实只包含了两部分:api/中的 PHP 和根目录下的 url.csv。

只需要简单部署在服务器或者使用 README.md 中提到的 Vercel 进行部署即可。

将图片源上传至 B2,整理出每张图片的 URL,然后存储在 url.csv 即可。

当然,如果你不希望所有图片链接被暴露,也可以通过修改api/index.php的方法来「隐藏」你的 url.csv 文件。

效果

本博客的 PC 端主页随机图就是啦~

可以通过 api.sakurark.com/random-img 进行测试(虽然只有 10 张图


这里是一只萌新!