最近在给我的新主题搞API呢【顺便给 大绵阳打黑工
我就转念一想,为何不搞些一些通用的API以后对接那些产品呢?
于是我撸起袖子说干就干!搞api的话坑定不是随随便便就输出图片就ok的拉!
肯定是要做的完善才好啊!【我可不想被人说我的代码是史山!
所以我就在研究怎么写才是最好的,写了将近一晚上吧!我算是把这个API写出来,个人感觉是够个人或者我们自己的产品使用了!
接下来就可以看看我写的代码吧!!题外话我也不想多说了,内容我全写在代码中了!
随机图片↓
API的搭建步骤
创建一个名为api/picture的文件目录也就是【网站根目录/api/picture
在picture文件下创建两个文件夹animation和scenery
继承 第二步骤之后 分别在创建好的两个文件夹下创建两个文件夹pc和mobile
继承 第三步骤之后 在两个文件夹内分别塞入对应的图片【这步骤都不会的话不建议往下看了
在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" }
请求参数
额外扩展
当一个页面中有多个img时,但是想要每个图片都输出不同的调用图片可以尝试写成这样↓
http{s}://域名/api/picture/index?rand=JzNLbSh59xDAYzNwemhHF4UjwBzkVc8L
index.php后面可以增加一个参数?rand=随机字符串/时间戳
随机一言
API的搭建步骤
创建一个名为api/one-word的文件目录也就是【网站根目录/api/one-word
在picture文件下创建text文件夹
继承 第二步骤之后 在创建好的文件夹下创建 animation.txt | movie.txt | saying.txt
在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》