前言

我的个人博客首页顶部设置的是一个随机的大图展示,最近发现顶部大图的 API 失效了。可能是该 API 的提供者停止了项目开放共享吧,也可能其他原因。为了避免以后再次遇到类似的问题,我决定自建一个输出随机图片的 API 接口。毕竟,自己掌控的接口最为可靠。经过一番研究后,我选择了使用 PHP 项目来实现这个功能,因为 PHP 实现起来最为简单快捷。

效果展示

每次刷新首页大图都会变化,符合场景需求。

搭建操作

准备 PHP 运行环境

我服务器使用的管理面板是 1Panel(也可使用宝塔面板),搭建运行环境操作如下:

编辑执行文件

搭建好环境后,进入服务根目录。创建文本文件 img.txt 里面填写图片来源 URL(图片可以来自图床,如果没有图床也可以将图片上传博客的附件库;或者更为直接的将需要的图片上传到根目录,文本中填写相对路径读取图片),修改 index.phprandom.php,默认内容全部替换为我们的脚本代码。

img.txt 内容示例:

random.php 中写入以下代码:

<?php
// 存有image链接的文件名
$filename = "img.txt";
 
// 检查文件是否存在
if (!file_exists($filename)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '文件不存在']);
    exit;
}
 
// 从文本文件中读取链接
$pics = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
 
// 检查是否读取到了图片链接
if (empty($pics)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '没有找到图片链接']);
    exit;
}
 
// 从数组中随机选择一个链接
$pic = $pics[array_rand($pics)];
 
// 根据请求参数返回指定格式
$type = isset($_GET['type']) ? $_GET['type'] : '';
 
switch ($type) {
    case 'json':
        header('Content-Type: application/json');
        echo json_encode(['pic' => $pic]);
        break;
 
    default:
        header("Location: $pic");
        exit;
}
?>

请求地址

接口请求地址为: https://域名/random.php ,例如我的API地址为:https://img.dangks.online/random.php

若使用的 Halo 主题是 Theme-Joe3 则 API 配置如下图所示。

带缓存的方案

如上面的方案,每刷新一次网页请求,返回的图片就会立即变换一次,当然有可能会觉得图片刷新过于频繁,比如我想要实现 1分钟内再次请求不变化图片 的功能,于是就引入缓存机制,可以通过在服务器端存储一个缓存文件来实现这一点。具体操作如下。

在根目录创建缓存目录 cache,然后在目录下创建文件random_image_cache.json ,json 文件内什么都不用写,接口请求时会写入缓存信息。然后使用下面的代码完全替换掉 random.php 的内容。

缓存功能代码

<?php
// 存有image链接的文件名
$filename = "img.txt";
$cache_file = 'cache/random_image_cache.json';
 
// 检查文件是否存在
if (!file_exists($filename)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '文件不存在']);
    exit;
}
 
// 从文本文件中读取链接
$pics = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
 
// 检查是否读取到了图片链接
if (empty($pics)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '没有找到图片链接']);
    exit;
}
 
// 检查缓存文件是否存在并且没有过期
$cache_duration = 60; // 缓存持续时间为1分钟
$cache_is_valid = false;
$pic = null;
 
if (file_exists($cache_file)) {
    $cache_time = filemtime($cache_file);
    if (time() - $cache_time < $cache_duration) {
        $cache_is_valid = true;
        $cache_data = json_decode(file_get_contents($cache_file), true);
        $pic = $cache_data['pic'];
    }
}
 
// 如果缓存有效,直接使用缓存中的图片链接
if (!$cache_is_valid) {
    // 从数组中随机选择一个链接
    $pic = $pics[array_rand($pics)];
 
    // 将新的图片链接和当前时间保存到缓存文件中
    $cache_data = [
        'pic' => $pic,
        'time' => time()
    ];
    file_put_contents($cache_file, json_encode($cache_data));
}
 
// 根据请求参数返回指定格式
$type = isset($_GET['type']) ? $_GET['type'] : '';
 
switch ($type) {
    case 'json':
        header('Content-Type: application/json');
        echo json_encode(['pic' => $pic]);
        break;
 
    default:
        header("Location: $pic");
        exit;
}
?>

总结

通过以上的解决方案,我成功实现了具备两种效果的随机图片 API,您可以根据个人需求选择最适合的方案进行搭建。