前言:为什么要自建?
你是不是也遇到过这种情况:
博客背景图用了别人的免费随机 API,结果某天打开博客,背景一片空白,或者直接弹出一个大大的 Error 1033?
免费的永远是最贵的。 别人的服务器随时可能炸机、跑路,或者因为流量太大而开启防盗链。
既然我们手里有 Oracle ARM (4核 24G内存 100G硬盘) 这种“神机”,硬盘大、性能强,只做代理或建站未免有点太浪费了,为什么不自己搭建一个专属的随机图库呢?
自建优势:
- 永久稳定:服务器在自己手里,想开多久开多久。
- 全球加速:配合 Cloudflare Tunnel,国内访问速度飞快,晚高峰也不虚。
- 内容可控:想看二次元、风景还是小姐姐,全凭你心情,不再看别人脸色。
准备工作
- VPS 一台:推荐 Oracle Cloud ARM 实例。
安装好 宝塔面板。没有安装的,使用下面的代码一键安装
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec- 域名一个:托管在 Cloudflare 上。
- Cloudflare 账号:用于配置内网穿透加速。
第一步:在宝塔搭建“图库基地”
我们需要一个网站环境来运行简单的 PHP 代码。
- 登录 VPS 的 宝塔面板。

- 点击左侧菜单的 【网站】 -> 【添加站点】。

填写信息:
- 域名:填一个你想用的二级域名,比如
api.yourdomain.com。 - PHP版本:选择
PHP-7.4或更高(需安装fileinfo扩展)。 - 数据库:选择
不创建(用不上)。
- 域名:填一个你想用的二级域名,比如
- 点击 【确定】。
第二步:部署核心“发牌员”代码
我们需要一段代码,当用户访问时,它能自动从文件夹里“抽”一张图发给用户。
- 在网站列表中,点击刚才创建的网站根目录(例如
/www/wwwroot/api.yourdomain.com/)。
- 删除目录下默认的
全部文件。
- 新建文件,命名为
index.php。

- 双击编辑,复制粘贴以下代码:
<?php
// ================= 配置区 =================
// 图片存放的主文件夹
$image_folder = 'image';
// =========================================
// 智能识别:如果是手机访问,优先去 mobile 文件夹找竖屏图
// 如果是电脑访问,去 pc 文件夹找横屏图
function isMobile() {
if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false) {
return true;
}
return false;
}
// 路径逻辑
$target_dir = isMobile() ? $image_folder . '/mobile' : $image_folder . '/pc';
// 扫描图片 (支持 jpg, png, gif, webp)
$img_array = glob($target_dir . '/*.{gif,jpg,png,jpeg,webp}', GLOB_BRACE);
// 容错处理:如果对应文件夹没图,就去另一个文件夹借一张,防止报错
if(count($img_array) == 0) {
$backup_dir = isMobile() ? $image_folder . '/pc' : $image_folder . '/mobile';
$img_array = glob($backup_dir . '/*.{gif,jpg,png,jpeg,webp}', GLOB_BRACE);
}
// 如果还是没图,那就没办法了
if(count($img_array) == 0) {
die('图库空空如也,请先上传图片!');
}
// 随机抽取一张
$img_path = $img_array[array_rand($img_array)];
// 输出图片头信息,伪装成一张静态图片
$mime = mime_content_type($img_path);
header("Content-Type: $mime");
// 禁止浏览器缓存,保证每次刷新都能看到新老婆
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");
// 输出图片内容
readfile($img_path);
?>创建存放目录:
- 在根目录下新建文件夹
image。
- 在
image里新建两个文件夹:pc(放横屏图) 和mobile(放竖屏图)。
- 在根目录下新建文件夹
第三步:批量抓取壁纸
手动上传太累了,我们让服务器自己去网上“进货”。这里提供一个抓取 360壁纸库 的脚本。
- 点击宝塔左侧 【计划任务】。
添加任务:
- 类型:
Shell 脚本。 - 名称:
图库自动进货。 - 执行周期:建议
每天执行一次。
- 类型:
脚本内容(直接复制):
# ------------------ 自动抓图脚本 ------------------
cat > /tmp/crawl.py <<EOF
import requests
import os
import time
# === 修改这里:你的图片保存路径 ===
# 电脑壁纸存到 pc 目录
SAVE_DIR = "/www/wwwroot/api.yourdomain.com/image/pc"
# ==============================
# 360壁纸接口 (36=4K分类, 6=美女, 9=风景)
# 这里设置下载 50 张 美女壁纸
URL = "http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByOrder&order=create_time&start=0&count=50&from=360chrome&cid=6"
if not os.path.exists(SAVE_DIR):
os.makedirs(SAVE_DIR)
try:
print("正在连接图库...")
res = requests.get(URL, timeout=10).json()
count = 0
for item in res.get('data', []):
img_url = item.get('url')
if not img_url: continue
file_name = img_url.split('/')[-1]
save_path = os.path.join(SAVE_DIR, file_name)
if not os.path.exists(save_path):
try:
content = requests.get(img_url, timeout=10).content
with open(save_path, 'wb') as f:
f.write(content)
count += 1
print(f"下载成功: {file_name}")
time.sleep(0.2) # 温柔一点
except:
print("下载失败,跳过")
else:
print("已存在,跳过")
print(f"任务完成!本次入库 {count} 张。")
except Exception as e:
print(f"出错: {e}")
EOF
# 运行爬虫
python3 /tmp/crawl.py
# ------------------------------------------------再添加一个竖屏的,这次抓取wallhaven的高质量图片,
脚本内容:
cat > /tmp/crawl_mobile_wallhaven.py <<EOF
import requests
import os
import time
# === 存到 mobile 文件夹 ===
SAVE_DIR = "/www/wwwroot/api.yourdomain.com/image/mobile"
# ========================
# Wallhaven API 参数解析:
# categories=001 (只抓人物)
# purity=010 (只抓性感/Sketchy,不色情也不普通)
# ratios=9x16,10x16 (只抓竖屏!关键!)
# sorting=random (随机)
API_URL = "https://wallhaven.cc/api/v1/search?categories=001&purity=010&ratios=9x16,10x16&sorting=random&seed={}"
if not os.path.exists(SAVE_DIR):
os.makedirs(SAVE_DIR)
try:
# 随机种子
seed = str(time.time())
target_url = API_URL.format(seed)
print("正在请求 Wallhaven (竖屏性感模式)...")
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)'}
res = requests.get(target_url, headers=headers, timeout=15)
data = res.json()
count = 0
for item in data['data']:
img_url = item['path']
file_name = img_url.split('/')[-1]
save_path = os.path.join(SAVE_DIR, file_name)
if not os.path.exists(save_path):
print(f"下载: {file_name}")
try:
img_data = requests.get(img_url, headers=headers, timeout=20).content
with open(save_path, 'wb') as f:
f.write(img_data)
count += 1
time.sleep(1.5) # Wallhaven 限制严格,慢点抓
except:
pass
print(f"任务完成,入库 {count} 张竖屏美图。")
except Exception as e:
print(f"出错: {e}")
EOF
python3 /tmp/crawl_mobile_wallhaven.py(注:请将上面两段代码中api.yourdomain.com的yourdomain替换为自己的域名。)
- 点击 【执行】 一次。稍等片刻,去
image/pc文件夹里看看,是不是已经塞满了高清壁纸?
可以看到,已经有不少图片了。现在再去执行另一个脚本,这样不管横屏、竖屏就都有图片了。
第四步:接入 Cloudflare Tunnel 加速
Oracle 的直连线路在晚高峰可能会丢包、卡顿。为了让我们的 API 加载如丝般顺滑,我们要把它挂载到 Cloudflare Tunnel 上。
这一步不需要在 VPS 上敲命令,只需要在 Cloudflare 网页后台操作。
- 登录 Cloudflare 面板,点击左侧菜单中的 Zero trust。

- 点击左侧菜单 网络 -> 连接器。

- 创建隧道,名字随便取



- 找到刚创建的隧道,点击右侧的三个点 -> Configure (配置)。

- 点击上方的 已发布应用程序路由 标签页。
点击 添加已发布应用程序路由 按钮。
重点配置如下:
- Subdomain (子域名):填
api(对应你刚才建站的 api.yourdomain.com)。 - Domain (域名):在下拉框选择你的主域名。
- Path (路径):留空不填。
Service (服务):
- Type: 选择
HTTP。 - URL: 填写
localhost:80。 - (解释:因为宝塔建立的网站默认监听 80 端口,Tunnel 会把来自公网的请求转发给本地的 80 端口,也就是你的图床网站。)

点击右下角的 保存。
- Type: 选择
- 选择菜单中的
概述,接下来使用xshell、putty等ssh工具登录VPS,让vps连接刚建立的隧道。
(VPS建议使用debian或ubuntu系统)

请按顺序复制到VPS上运行。这样隧道就算搞定了! 现在,全球的 Cloudflare 节点都在为你的图床提供 CDN 加速。
第五步:享受成果
现在,打开浏览器,访问:https://api.yourdomain.com/
- 电脑访问:你会看到一张横屏的高清壁纸。
- 手机访问:你会看到一张适配手机的竖屏壁纸。
- 刷新一下:图片变了!
如何使用?
作为博客背景(CSS):
body { background-image: url('https://api.yourdomain.com/'); background-size: cover; }作为论坛签名(Markdown):

总结
通过这个方案,我们充分利用了:
- Oracle VPS 的存储空间(存几万张图都没问题)。
- 宝塔面板 的便捷管理(脚本自动抓取)。
- Cloudflare Tunnel 的全球加速(隐藏真实 IP,防攻击,速度快)。
从此,你拥有了一个完全属于自己的、永不关停的随机图库。快去试试吧!
版权声明:本文由 赛博61区 原创发布,转载请注明出处。