🚨零成本打造永久不炸机的图床 API

🚨零成本打造永久不炸机的图床 API

bonnie366
1月5日发布

前言:为什么要自建?

你是不是也遇到过这种情况:
博客背景图用了别人的免费随机 API,结果某天打开博客,背景一片空白,或者直接弹出一个大大的 Error 1033

免费的永远是最贵的。 别人的服务器随时可能炸机、跑路,或者因为流量太大而开启防盗链。

既然我们手里有 Oracle ARM (4核 24G内存 100G硬盘) 这种“神机”,硬盘大、性能强,只做代理或建站未免有点太浪费了,为什么不自己搭建一个专属的随机图库呢?

自建优势:

  1. 永久稳定:服务器在自己手里,想开多久开多久。
  2. 全球加速:配合 Cloudflare Tunnel,国内访问速度飞快,晚高峰也不虚。
  3. 内容可控:想看二次元、风景还是小姐姐,全凭你心情,不再看别人脸色。

准备工作

  1. VPS 一台:推荐 Oracle Cloud ARM 实例。
  2. 安装好 宝塔面板。没有安装的,使用下面的代码一键安装

    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
  3. 域名一个:托管在 Cloudflare 上。
  4. Cloudflare 账号:用于配置内网穿透加速。

第一步:在宝塔搭建“图库基地”

我们需要一个网站环境来运行简单的 PHP 代码。

  1. 登录 VPS 的 宝塔面板
    2026-01-26_22-13-58.webp
  2. 点击左侧菜单的 【网站】 -> 【添加站点】
    2026-01-26_22-14-38.webp
  3. 填写信息

    • 域名:填一个你想用的二级域名,比如 api.yourdomain.com
    • PHP版本:选择 PHP-7.4 或更高(需安装 fileinfo 扩展)。
    • 数据库:选择 不创建(用不上)。
      2026-01-26_22-15-33.webp
  4. 点击 【确定】

第二步:部署核心“发牌员”代码

我们需要一段代码,当用户访问时,它能自动从文件夹里“抽”一张图发给用户。

  1. 在网站列表中,点击刚才创建的网站根目录(例如 /www/wwwroot/api.yourdomain.com/)。
    2026-01-26_22-20-08.webp
  2. 删除目录下默认的 全部文件
    2026-01-26_22-33-12.webp
  3. 新建文件,命名为 index.php
    2026-01-26_22-34-15.webp
    2026-01-26_22-34-40.webp
  4. 双击编辑,复制粘贴以下代码
<?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);
?>
  1. 创建存放目录

    • 在根目录下新建文件夹 image
      2026-01-26_22-36-33.webp
    • image 里新建两个文件夹:pc (放横屏图) 和 mobile (放竖屏图)。
      2026-01-26_22-37-44.webp

第三步:批量抓取壁纸

手动上传太累了,我们让服务器自己去网上“进货”。这里提供一个抓取 360壁纸库 的脚本。

  1. 点击宝塔左侧 【计划任务】
  2. 添加任务

    • 类型Shell 脚本
    • 名称图库自动进货
    • 执行周期:建议 每天 执行一次。
      2026-01-26_22-50-46.webp

脚本内容(直接复制):

# ------------------ 自动抓图脚本 ------------------
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的高质量图片,
2026-01-26_22-51-45.webp

脚本内容

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替换为自己的域名。)

  1. 点击 【执行】 一次。稍等片刻,去 image/pc 文件夹里看看,是不是已经塞满了高清壁纸?
    2026-01-26_22-46-02.webp
    可以看到,已经有不少图片了。现在再去执行另一个脚本,这样不管横屏、竖屏就都有图片了。

第四步:接入 Cloudflare Tunnel 加速

Oracle 的直连线路在晚高峰可能会丢包、卡顿。为了让我们的 API 加载如丝般顺滑,我们要把它挂载到 Cloudflare Tunnel 上。

这一步不需要在 VPS 上敲命令,只需要在 Cloudflare 网页后台操作。

  1. 登录 Cloudflare 面板,点击左侧菜单中的 Zero trust
    2026-01-26_22-56-11.webp
  2. 点击左侧菜单 网络 -> 连接器
    2026-01-26_22-59-25.webp
  3. 创建隧道,名字随便取
    2026-01-26_23-01-47.webp
    2026-01-26_23-02-09.webp
    2026-01-26_23-02-31.webp
  4. 找到刚创建的隧道,点击右侧的三个点 -> Configure (配置)
    2026-01-26_23-06-46.webp
  5. 点击上方的 已发布应用程序路由 标签页。
    点击 添加已发布应用程序路由 按钮。
    2026-01-26_23-08-04.webp

重点配置如下:

  • Subdomain (子域名):填 api (对应你刚才建站的 api.yourdomain.com)。
  • Domain (域名):在下拉框选择你的主域名。
  • Path (路径):留空不填。
  • Service (服务)

    • Type: 选择 HTTP
    • URL: 填写 localhost:80
    • (解释:因为宝塔建立的网站默认监听 80 端口,Tunnel 会把来自公网的请求转发给本地的 80 端口,也就是你的图床网站。)
      2026-01-26_23-09-02.webp

    点击右下角的 保存

  1. 选择菜单中的概述,接下来使用xshellputty等ssh工具登录VPS,让vps连接刚建立的隧道。
    (VPS建议使用debian或ubuntu系统)
    2026-01-26_23-16-37.webp
    2026-01-26_23-17-13.webp

请按顺序复制到VPS上运行。这样隧道就算搞定了! 现在,全球的 Cloudflare 节点都在为你的图床提供 CDN 加速。


第五步:享受成果

现在,打开浏览器,访问:
https://api.yourdomain.com/

  • 电脑访问:你会看到一张横屏的高清壁纸。
  • 手机访问:你会看到一张适配手机的竖屏壁纸。
  • 刷新一下:图片变了!

如何使用?

  • 作为博客背景(CSS):

    body {
        background-image: url('https://api.yourdomain.com/');
        background-size: cover;
    }
  • 作为论坛签名(Markdown):

    ![随机美图](https://api.yourdomain.com/)

总结

通过这个方案,我们充分利用了:

  1. Oracle VPS 的存储空间(存几万张图都没问题)。
  2. 宝塔面板 的便捷管理(脚本自动抓取)。
  3. Cloudflare Tunnel 的全球加速(隐藏真实 IP,防攻击,速度快)。

从此,你拥有了一个完全属于自己的、永不关停的随机图库。快去试试吧!


版权声明:本文由 赛博61区 原创发布,转载请注明出处。
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消 登录评论
SSL