random-api-go GO重构版

仓库地址

示例


前景提要

原来的nodejs和worker版本: Random-Api 随机文件API

之所以使用go重构, 还是因为性能和并发问题. 使用go重构后, 单个处理速度一般在5微秒, 内存占用低至4M


特性

  • 动态加载和缓存 CSV 文件内容
  • 支持图片和视频随机分发
  • 可自定义的 URL 路径配置
  • Docker 支持,便于部署和扩展
  • 详细的日志记录

部署方法

docker compose:

以上参数解释

BASE_URL

这个现在改了, 改成了你的部署后访问域名, 末尾不要带斜杠

OAUTH_CLIENT_ID和OAUTH_CLIENT_SECRET

这两个是登录授权用的, 需要到 https://connect.czl.net 随便一个方式登录后去新建个应用. 大概就这样:

别的都不重要, 回调地址填对了就行.

https://random-api.czl.net/api/admin/oauth/callback

把前面的域名改成你的.

然后把下面的Clinet ID和Client Secret 作为参数就行.

自己用的话, 就不要打开公开, 这样只有自己可以登录, 别人登录不了.

如果要让朋友或者别人也可以登录, 就选择公开后输入别人的CZL Connect ID, 这样可以限制只有哪几个人能登录.


以上参数完成后, 直接运行就可以了.

运行配置

登录入口

页面最下方

导航

处理逻辑

逻辑是这样的:

  1. 设置端点, 也就是别人可以访问进来的入口. 这里可以配置是否首页可见和是否启用

  1. 设置数据源, 一个端点可以对应多个数据源. 目前数据源支持:
  • 兰空图床API
  • S3协议存储桶
  • 自己手输(兼容之前的csv, 把以前的csv复制进来就行了)
  • GET/POST, 可以反代一些别的随机API, JSON返回的那种
  • 其他端点(比如ALL, 可以选中别的已有端点)

截图示例

新建端点配置

一个端点对应多个数据源

兰空图床API

手动输入url

已有端点

第三方API

小小api: https://xxapi.cn/ , 他的接口返回很快, 4k图片质量也很高

S3协议- B2存储桶

S3协议 - Minio

不理解的下面再留言

URL替换规则

可以针对全部接口/某个接口, 把最终图片的url一部分给替换掉.

比如我一个数据源, 有两个接口使用. 默认数据源提供的url是 a.com/1.png这种.

然后我第二个接口直接使用已有端点功能复用了第一个接口, 这里我想给图片替换成b.com这个国内CDN域名, 那么就进行替换即可.

也可以替换兰空图床的API给出的图片url, 有需要可以试试.

首页配置

用markdown写, 显示在首页的.

注意事项

  1. 图片url为了速度, 是存在内存的, 所以刚启动时如果兰空数据源等需要的数据比较大, 比如我一个二次元图床里面是1886张图片, 启动时需要先获取数据, 就需要稍等会儿才能用, 视图片url数量.
  2. GET/POST 别的接口, 是实时获取的, 如果上游接口反应慢, 我们反应也会慢些
  3. 首页的背景图, 是调用相对路径/pic/all的, 所以建议弄个这个接口, 哪怕一张图片也行.
  4. 兰空和s3, 默认24小时更新一次, 如果你新加了文件想马上更新, 可以手动进数据源点一下同步

你可以把你的站点url贴在评论, 速度不错的可以贴在本帖顶部.

其他问题再留言

更新日志

2025-06-14

  1. 完全重构, 后端引入sqlite, gorm, 内存缓存等逻辑
  2. 前端改为nextjs
  3. 抛弃外部配置, 全部为可视化配置.

2025-06-15凌晨

  1. 升级依赖
  2. 优化数据预缓存
  3. 优化数据存储
  4. 优化兰空图床接口429的指数退避重试策略

2025-06-15 夜

  1. 新增s3协议数据源

2025-06-16

  1. 修复当a端点引用b端点, a端点的url替换规则不生效的问题

2025-06-18

  1. 修复 "手动同步数据源依旧从内存中获取, 不会从数据源重新抓取"的问题

大佬 我在用呀。不会部署了。。。

研究明白哦 :rofl:

额, 晚点我写下

大佬有没有考虑把minio适配给加上?

这是我踩的坑
base_url 那一项你写的是这个https://random-api.czl.net 我改成我自己的url后,后面加了一个/ 认证那边就说 重定向URI不匹配, 删除 / 就好了。

对的, 这个没去单独写兼容.

部署流程上面写好了

minio是s3协议呀, 咋获取, 遍历的话好像不太行. 等我有空可以研究下看看.


感觉需要这些参数就能读取到文件了
假如我的桶名称是random-video 以下的url就能显示视频了 (桶那边自己设置所有人可读)
https://minio.huamei-tokyo.com/random-video/80835.mp4

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials"
)

func main() {
	endpoint := "minio.huamei-tokyo.com"
	accessKeyID := "你的AccessKeyID"
	secretAccessKey := "你的SecretAccessKey"
	useSSL := true

	// 初始化 MinIO 客户端
	minioClient, err := minio.New(endpoint, &minio.Options{
		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
		Secure: useSSL,
	})
	if err != nil {
		log.Fatalln(err)
	}

	bucketName := "blog"
	ctx := context.Background()

	// 列出 bucket 中的对象
	fmt.Printf("列出 Bucket [%s] 中的对象:\n", bucketName)
	objectCh := minioClient.ListObjects(ctx, bucketName, minio.ListObjectsOptions{
		Recursive: true,
	})

	for object := range objectCh {
		if object.Err != nil {
			log.Fatalln(object.Err)
		}
		fmt.Println("文件:", object.Key)
	}
}

我不会写让chatgpt写的 能作为参考么?

要支持minio的话, 就不会只支持minio了, 肯定是按s3协议来写.

它写的这个没用, 还要考虑数据缓存, url拼接, 外置cdn等, 之后看看

@whc95800 我加了, 上面还加了个minio的示意图, 可以用了

太感谢大佬了,辛苦大佬半夜还写我提出的需求 :saluting_face:

president obama youre welcome GIF