编写一个实用的 图片/一言 API

编写一个实用的 图片/一言 API

最近在给我的新主题搞API呢【顺便给 大绵阳打黑工
我就转念一想,为何不搞些一些通用的API以后对接那些产品呢?
于是我撸起袖子说干就干!搞api的话坑定不是随随便便就输出图片就ok的拉!
肯定是要做的完善才好啊!【我可不想被人说我的代码是史山!

所以我就在研究怎么写才是最好的,写了将近一晚上吧!我算是把这个API写出来,个人感觉是够个人或者我们自己的产品使用了!
接下来就可以看看我写的代码吧!!题外话我也不想多说了,内容我全写在代码中了!

随机图片↓

API的搭建步骤

  1. 创建一个名为api/picture的文件目录也就是【网站根目录/api/picture

  2. 在picture文件下创建两个文件夹animation和scenery

  3. 继承 第二步骤之后 分别在创建好的两个文件夹下创建两个文件夹pc和mobile

  4. 继承 第三步骤之后 在两个文件夹内分别塞入对应的图片【这步骤都不会的话不建议往下看了

  5. 在picture下创建一个名为index.php的文件,并将下列代码添加其中

<?php
/**
*  设置变量用于截取到调用的url的参数
*  增加新的参数格式为
*  采用了php的三元运算符来做值的判断
*  $变量名 =  isset($_GET['变量名']) ? $_GET['变量名'] : '默认变量值';
*  例子:
*  $sort = isset($_GET['sort']) ? $_GET['sort'] : 'animation'; // 默认 'animation'
*   ↑                     ↑               ↑           ↑
*             变量名也就是获取到url的值           |  当没有获取到url附带的值时这便是值
*
*/
$sort = isset($_GET['sort']) ? $_GET['sort'] : 'animation'; // 默认 'animation'
$terminal = isset($_GET['terminal']) ? $_GET['terminal'] : 'PC'; // 默认 'PC'
$type = isset($_GET['type']) ? $_GET['type'] : 'img'; // 默认 'img'
$width = isset($_GET['width']) ? explode('-', $_GET['width']) : null;  // 可选分辨率范围,例:1000-1100
$height = isset($_GET['height']) ? explode('-', $_GET['height']) : null;  // 可选分辨率范围,例:1200-1300

/**
*  定义可用类型及对应的目录路径
*  需要添加新的类型的话请写在尾]的 【前方】 格式为:
*  '文件目录' => '类型名称', //最好一致
*/ 
$allowedsorts = [
    'animation' => 'animation',
    'nature' => 'scenery',
];

/**
*和上面的同理但是不建议修改默认就行了
*/
$allowedTerminals = ['PC', 'mobile'];

/**
*  对url传过来的值进行判再输出内容
*  如果传过来的值对不上上方数组内其中任何一个值的话则 返回为false 且if内的json错误输出并在此 终止/退出  代码的运行
*  下方的三个判断都是这个效果
*/
if (!array_key_exists($sort, $allowedsorts)) {
    echo json_encode([
        'status' => '101 error',
        'message' => '没有此类型'
    ]);
    exit;
}

// 检查 terminal 是否有效,默认为 PC
if (!in_array($terminal, $allowedTerminals)) {
    echo json_encode([
        'status' => '102 error',
        'message' => '没有此端'
    ]);
    exit;
}

// 检查 type 参数是否有效,必须是 img 或 json
if (!in_array($type, ['img', 'json'])) {
    echo json_encode([
        'status' => '103 error',
        'message' => '无效的输出类型'
    ]);
    exit;
}

// 根据 sort 和 terminal 拼接图片目录路径
$imageDir = $allowedsorts[$sort] . '/' . strtolower($terminal);

// 获取指定目录下的所有图片文件
$images = glob($imageDir . '/*.{jpg,jpeg,png,gif,webp}', GLOB_BRACE);

// 如果目录中没有图片,则返回错误
if (!$images) {
    echo json_encode([
        'status' => '100 error',
        'message' => '未在文件夹中找到图片'
    ]);
    exit;
}

// 筛选符合指定宽高范围的图片(如果提供了 width 和 height)
$filteredImages = [];

foreach ($images as $image) {
    $imageSize = getimagesize($image);  // 获取图片的宽度和高度

    if ($imageSize !== false) {
        $imgWidth = $imageSize[0];
        $imgHeight = $imageSize[1];

        // 检查宽度和高度是否在指定范围内
        if (
            (!$width || ($imgWidth >= $width[0] && $imgWidth <= $width[1])) &&
            (!$height || ($imgHeight >= $height[0] && $imgHeight <= $height[1]))
        ) {
            $filteredImages[] = $image;
        }
    }
}

// 如果没有符合条件的图片,使用所有图片
if (empty($filteredImages)) {
    $filteredImages = $images;
}

// 随机选择一张符合条件的图片
$randomImage = $filteredImages[array_rand($filteredImages)];

// 获取图片的完整URL路径
$imageUrl = 'https://' . $_SERVER['HTTP_HOST'] . '/' . $randomImage;

// 根据 type 参数输出
if ($type === 'img') {
    // 使用 302 重定向到图片的实际 URL
    header('Location: ' . $randomImage);
    exit;
} else {
    // 输出 JSON
    header('Content-Type: application/json');
    echo json_encode([
        'status' => 'success',
        'image_url' => $imageUrl
    ]);
    exit;
}
?>

使用教程

请求地址 http{s}://域名/api/picture

返回数据 { "status":"success", "image_url":"https:\/\/api.9wt.cn\/animation\/pc\/15b6b0c6826ec03629ae17c5b2db7c28.jpg" }

请求参数

参数名称

类型

参数值

描述

sort

可选

animation | scenery

animation:动漫 scenery:风景

terminal

可选

PC | mobile

PC:电脑 mobile:手机

type

可选

json | img

json:json格式 img:url格式

width

可选

1980-2000

选取两值中间的图片 这个是选取宽为1980px到2000px 也可以写成1980-1980 【不填写输出各种分辨率的图片|数字中间的-必须写上】

height

可选

1080-1100

选取两值中间的图片 这个是选取高为1080px到1100px 【不填写输出各种分辨率的图片|数字中间的-必须写上】

额外扩展

当一个页面中有多个img时,但是想要每个图片都输出不同的调用图片可以尝试写成这样↓

http{s}://域名/api/picture/index?rand=JzNLbSh59xDAYzNwemhHF4UjwBzkVc8L

index.php后面可以增加一个参数?rand=随机字符串/时间戳

随机一言

API的搭建步骤

  1. 创建一个名为api/one-word的文件目录也就是【网站根目录/api/one-word

  2. 在picture文件下创建text文件夹

  3. 继承 第二步骤之后 在创建好的文件夹下创建 animation.txt | movie.txt | saying.txt

  4. 在one-word下创建一个名为index.php的文件,并将下列代码添加其中


<?php
// 获取传递的 'sort' 和 'type' 参数,默认为 'animation' 和 'text'
$sort = isset($_GET['sort']) ? $_GET['sort'] : 'animation';
$type = isset($_GET['type']) ? $_GET['type'] : 'text'; // 默认返回 text

// 定义可用类型及对应的文件路径
$allowedSorts = [
    'animation' => 'animation.txt',
    'movie' => 'movie.txt', 
    'saying' => 'saying',
];

// 根据 sort 参数选择对应的文件,默认为 'animation.txt'
$file = __DIR__ . '/text/' . (isset($allowedSorts[$sort]) ? $allowedSorts[$sort] : 'animation.txt');

// 检查文件是否存在
if (file_exists($file)) {
    // 将文件内容按行读取到数组中
    $quotes = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    // 检查文件是否为空
    if (!empty($quotes)) {
        // 使用 array_rand 随机选择一个索引
        $randomKey = array_rand($quotes);
        $quoteLine = $quotes[$randomKey];

        // 解析名言、作者和来源
        list($quote, $author, $source) = explode('|', $quoteLine);

        // 根据 type 参数选择返回格式
        if ($type === 'text') {
            // 输出文本格式 "quote——author《source》"
            header('Content-Type: text/plain; charset=utf-8');
            echo $quote . " ———— " . $author . "《" . $source . "》";
        } else {
            // 返回 JSON 格式
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode([
                'status' => 'success',
                'quote' => [
                    'quote' => $quote,
                    'author' => $author,
                    'source' => $source,
                ],
            ]);
        }
    } else {
        // 文件为空
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode([
            'status' => '101错误',
            'message' => '文件为空,无法获取一言。',
        ]);
    }
} else {
    // 文件不存在
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'status' => '100错误',
        'message' => '文件不存在。',
    ]);
}
?>

使用教程

请求地址 http{s}://域名/api/one-word

返回数据

JSON:{"status":"success","quote":{"quote":"所谓长大成人,就是不断的聚了散,散了又聚,为了让彼此不会受伤害而保持一个适当的距离。","source":"EVA"}}

text:所谓长大成人,就是不断的聚了散,散了又聚,为了让彼此不会受伤害而保持一个适当的距离。———— 渚薰《EVA》

请求参数

参数名称

类型

参数值

描述

sort

可选

animation | movie | saying

animation:动漫 movie:电影 saying:名言

type

可选

json | img

json:json格式 text:文字文本格式

转载请留源地址,谢谢你的配合。