侧边栏壁纸
博主头像
躺平小站-记录生活分享经验 博主等级

立马躺下,不要犹豫!

  • 累计撰写 7 篇文章
  • 累计创建 9 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

自建PHP随机图片API

予我与你丶
2025-07-27 / 0 评论 / 0 点赞 / 25 阅读 / 0 字

效果展示:


可能部分场景会不适用,自测

API介绍:

http://域名/分类名 #直接访问即可返回图片

采用用本地图片+别的api混用的方式,以此实现更多的图源,自己的图暂时不够也不怕,把别人的链接添加进来就可以了!!

使用方法

1.在根目录创建 index.php,并将以下代码复制到里面

<?php
// 多分类随机图片API - 直接通过域名/分类 访问
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 调试模式
$debug = false;

// 检查并定义GLOB_BRACE常量(如果未定义)
if (!defined('GLOB_BRACE')) {
    define('GLOB_BRACE', 16);
}

// 第三方API配置(分类名 => API地址)
$thirdPartyApis = [
    '动漫' => 'https://t.alcy.cc/pc',
    '壁纸' => 'https://t.alcy.cc/pc',
    // 可添加更多分类和对应API
];

// 配置图片目录和访问URL
$imageBaseDir = __DIR__ . '/images';
$imageBaseUrl = '/images'; // 图片目录对应的URL路径

// 从URL路径中提取分类
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$pathParts = explode('/', trim(str_replace('/index.php', '', $requestUri), '/'));
$category = $pathParts[0] ?? '';

// 关键修改:对分类名进行URL解码
$category = urldecode($category);

// 错误处理
if (empty($category)) {
    http_response_code(400);
    die('请指定图片分类,例如: /动漫, /头像');
}

$categoryDir = $imageBaseDir . '/' . $category;

if (!is_dir($categoryDir) && !isset($thirdPartyApis[$category])) {
    http_response_code(404);
    die("分类 '$category' 不存在");
}

// 收集可用的图片来源
$availableSources = [];

// 添加本地图片来源(如果目录存在)
$localImages = [];
if (is_dir($categoryDir)) {
    foreach (['jpg', 'jpeg', 'png', 'gif'] as $ext) {
        $localImages = array_merge($localImages, glob($categoryDir . "/*.$ext"));
    }
    if (!empty($localImages)) {
        $availableSources['local'] = $localImages;
    }
}

// 添加第三方API来源(如果配置存在)
if (isset($thirdPartyApis[$category])) {
    $availableSources['api'] = $thirdPartyApis[$category];
}

// 检查是否有可用来源
if (empty($availableSources)) {
    http_response_code(404);
    die("分类 '$category' 下没有找到图片");
}

// 随机选择来源
$sourceType = array_rand($availableSources);

// 调试输出
if ($debug) {
    echo "可用来源: " . implode(', ', array_keys($availableSources)) . "<br>";
    echo "随机选择的来源: $sourceType<br>";
}

// 根据选择的来源处理请求
if ($sourceType === 'local') {
    // 使用本地图片
    $randomImage = $availableSources['local'][array_rand($availableSources['local'])];
    
    // 获取图片文件名和扩展名
    $fileName = basename($randomImage);
    $fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
    
    // 如果请求中包含图片名称,使用它;否则生成一个随机编号
    $displayName = !empty($requestedImageName) 
        ? pathinfo($requestedImageName, PATHINFO_FILENAME) . ".$fileExt"
        : sprintf("%02d.%s", rand(1, 99), $fileExt);
    
    // 构建固定格式的图片URL
    $imageUrl = "/{$category}/{$displayName}";
    
    // 调试输出
    if ($debug) {
        echo "分类目录: $categoryDir<br>";
        echo "找到 " . count($localImages) . " 张图片<br>";
        echo "随机选择: $randomImage<br>";
        echo "显示名称: $displayName<br>";
        echo "图片URL: $imageUrl<br>";
        die();
    }
    
    // 重定向到随机选择的真实图片
    header("Location: {$imageBaseUrl}/{$category}/{$fileName}");
    exit;
} else {
    // 使用第三方API
    $apiUrl = $availableSources['api'];
    
    // 使用cURL获取第三方API内容
    $ch = curl_init($apiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时时间
    
    // 执行请求
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    curl_close($ch);
    
    // 调试输出
    if ($debug) {
        echo "API地址: $apiUrl<br>";
        echo "HTTP状态码: $httpCode<br>";
        echo "内容类型: " . ($contentType ?: '未知') . "<br>";
        echo "响应大小: " . (strlen($response) ?: '0') . " 字节<br>";
        die();
    }
    
    // 检查请求是否成功
    if ($httpCode == 200 && $response) {
        // 生成一个固定格式的URL
        $displayName = sprintf("%02d.jpg", rand(1, 99));
        $imageUrl = "/{$category}/{$displayName}";
        
        // 重定向到第三方API
        header("Location: {$apiUrl}");
        exit;
    }
    
    // 如果API请求失败,尝试使用本地图片(如果有)
    if (!empty($localImages)) {
        $randomImage = $localImages[array_rand($localImages)];
        $fileName = basename($randomImage);
        
        // 重定向到本地图片
        header("Location: {$imageBaseUrl}/{$category}/{$fileName}");
        exit;
    }
    
    // 所有尝试都失败
    http_response_code(404);
    die("无法获取分类 '$category' 下的图片");
}
?>

2.根目录创建images件夹,再在images下创建分类,如动漫、壁纸等,每个分类下的图片会被自动识别。

例如:

images/
├── 动漫/
├── 头像/
├── 风景/
├── 游戏/
├── 壁纸/
└── 摄影/

修改 Nginx 配置文件(参考)

1. root指令位置调整

原配置

nginx

root /www/sites/api/index; 
location ~ [^/]\.php(/|$) {
    # ...
}

修改后

nginx

location / {
    root /www/sites/api/index;  # 将root移至location块内
}

作用
明确指定root作用范围,确保所有请求都从正确的目录读取文件。

2. 添加 URL 重写规则

新增配置

nginx

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

作用
当请求的文件或目录不存在时,将请求转发给index.php处理,这是实现域名/分类访问的核心配置。

3. 优化 PHP 处理规则

原配置

nginx

location ~ [^/]\.php(/|$) {
    # 复杂的PATH_INFO处理逻辑
}

修改后

nginx

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    # ...
}

作用

  • 使用更简洁的正则表达式匹配所有 PHP 文件

  • 通过fastcgi_split_path_info自动处理 PATH_INFO,避免手动编写复杂的if逻辑

4. 安全增强

新增配置

nginx

if (!-f $document_root$fastcgi_script_name) {
    return 404;
}

作用
防止攻击者通过不存在的 PHP 文件路径进行探测或攻击。

5. 静态文件处理优化

新增配置

nginx

location / {
    # 静态文件直接返回
}

作用
优先处理静态文件请求,提高性能。

总结

https://域名/分类名 每次都会随机一张图片


0

评论区