554 字
1 分钟
自建PHP随机图片接口
自建PHP随机图片接口
一个支持多分类、本地图片和第三方API混用的随机图片API实现方案。
效果展示
可能部分场景会不适用,已自测。
API介绍
访问方式
http://域名/分类名直接访问即可返回随机图片。
特点
采用本地图片 + 别的API混用的方式,以此实现更多的图源。自己的图暂时不够也不怕,把别人的链接添加进来就可以了!
使用方法
第一步:创建PHP文件
在根目录创建 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' 下的图片");}?>第二步:创建图片目录
根目录创建 images 文件夹,再在 images 下创建分类,如动漫、壁纸等,每个分类下的图片会被自动识别。
例如:
images/├── 动漫/├── 头像/├── 风景/├── 游戏/├── 壁纸/└── 摄影/Nginx 配置
1. root指令位置调整
原配置:
root /www/sites/api/index;location ~ [^/]\.php(/|$) { # ...}修改后:
location / { root /www/sites/api/index; # 将root移至location块内}作用: 明确指定root作用范围,确保所有请求都从正确的目录读取文件。
2. 添加 URL 重写规则
新增配置:
location / { try_files $uri $uri/ /index.php$is_args$args;}作用: 当请求的文件或目录不存在时,将请求转发给index.php处理,这是实现域名/分类访问的核心配置。
3. 优化 PHP 处理规则
原配置:
location ~ [^/]\.php(/|$) { # 复杂的PATH_INFO处理逻辑}修改后:
location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; # ...}作用:
- 使用更简洁的正则表达式匹配所有 PHP 文件
- 通过
fastcgi_split_path_info自动处理 PATH_INFO,避免手动编写复杂的if逻辑
4. 安全增强
新增配置:
if (!-f $document_root$fastcgi_script_name) { return 404;}作用: 防止攻击者通过不存在的 PHP 文件路径进行探测或攻击。
5. 静态文件处理优化
新增配置:
location / { # 静态文件直接返回}作用: 优先处理静态文件请求,提高性能。
总结
- 访问
https://域名/分类名每次都会随机返回一张图片 - 支持本地图片和第三方API混用
- 支持多分类管理
- 自动降级:API失败时使用本地图片
注意事项
- 确保PHP环境已安装
curl扩展 - 图片目录需要有正确的读写权限
- 第三方API需要支持HTTP重定向
- 建议配置CDN加速图片访问
部分信息可能已经过时









