代码不规范,调试两行泪。
一个简单的随机图API实现
实现代码
<?php
//用户配置开始
$output = '1'; // 0使用CDN,1本机输出
$cdnChoose = '1'; // CDN供应商选择,列表见$cdnUrlList
$defaultAlbum = 'Genshin-Impact'; // 默认相册
// 用户配置结束
$genshin_impact = array("91247220_p0.webp","88477282_p0.webp","96821803_p0.webp","97555581_p0.webp","95828445_p0.webp","91988144_p0.webp","97313182_p0.webp","100249400_p0.webp","84666651_p0.webp","93077129_p0.webp","93015888_p0.webp","101595682_p0.webp","96542642_p0.webp","93239045_p0.webp","90904448_p0.webp","80172617_p0.webp","92564859_p0.webp","101664845_p0.webp","102169815_p0.webp","89219826_p0.webp","97833640_p0.webp","85339379_p0.webp","85467403_p0.webp","95579662_p0.webp","101414698_p0.webp","84938851_p0.webp","95605647_p0.webp","84808425_p0.webp","91623339_p0.webp","90549488_p0.webp","91364618_p0.webp","92161881_p0.webp","93077711_p0.webp","93113675_p0.webp","95028648_p0.webp","101893893_p0.webp","85984123_p0.webp","95916021_p0.webp","90285518_p0.webp","93604793_p0.webp","89419792_p0.webp","96539574_p0.webp","89490341_p0.webp","95789722_p0.webp","90640803_p0.webp","93200241_p0.webp","102113894_p0.webp","96839227_p0.webp","99693557_p0.webp","87977808_p0.webp","98215752_p0.webp","97312948_p0.webp","97618836_p0.webp","85543107_p0.webp","89261893_p0.webp","97744644_p0.webp","102162661_p0.webp","101036223_p0.webp","85030428_p0.webp","95852258_p0.webp","88695126_p0.webp","88127990_p0.webp","89905880_p0.webp","88450801_p0.webp","92229768_p0.webp","96965922_p0.webp","93187055_p0.webp","94974343_p0.webp","95640265_p0.webp","87550307_p0.webp","92080599_p0.webp","90842631_p0.webp","85998905_p0.webp","93068198_p0.webp","88640994_p0.webp","83935073_p0.webp","101462757_p0.webp","90080062_p0.webp","86644511_p0.webp","83902210_p0.webp","91501751_p0.webp","95732886_p0.webp","84720532_p0.webp","95734855_p0.webp","95527533_p0.webp","80567870_p0.webp","86612443_p0.webp","101157273_p0.webp","84396140_p0.webp","94332366_p0.webp","87541340_p0.webp","85109066_p0.webp","102241526_p0.webp","84699476_p0.webp","93526437_p0.webp","83266050_p0.webp","88504507_p0.webp","101490359_p0.webp","99214743_p0.webp","93414470_p0.webp","84655195_p0.webp","85612639_p0.webp","90575757_p0.webp","96160341_p0.webp","90863688_p0.webp","86221335_p0.webp","101573593_p0.webp","92791077_p0.webp","101462661_p0.webp","79627564_p0.webp","95681846_p0.webp","92004086_p0.webp","96514892_p0.webp","89639050_p0.webp","101553430_p0.webp","84672028_p0.webp","85011957_p0.webp","93083916_p0.webp","84824171_p0.webp","93798842_p0.webp","83658524_p0.webp","100784767_p0.webp");
$yuri = array("83928473_p0.webp","102567973_p0.webp","82542737_p0.webp","91194235_p0.webp","60537176_p0.webp","97333993_p0.webp","78612478_p0.webp","56907845_p0.webp","89172772_p1.webp","93122161_p0.webp","94908514_p0.webp","87857349_p0.webp","94106688_p0.webp","84571732_p0.webp","100475697_p0.webp","87710894_p0.webp","99192203_p0.webp","74822118_p0.webp","94118936_p0.webp","88603735_p0.webp","68146165_p0.webp","94277636_p0.webp","83245109_p0.webp","83419740_p0.webp","99066456_p0.webp","96080487_p0.webp","64535082_p0.webp","83088427_p0.webp","100385857_p0.webp","98717421_p0.webp","101704443_p0.webp","87108518_p0.webp","85769778_p0.webp","85397299_p0.webp","100339292_p0.webp","61198628_p0.webp","99906124_p0.webp","97083888_p0.webp","100056160_p0.webp","78341619_p0.webp","88609517_p1.webp","91885680_p0.webp","100236457_p0.webp","98259659_p0.webp","74451788_p0.webp","22386076_p0.webp","74010555_p0.webp","99870140_p0.webp","85262834_p0.webp","98089060_p0.webp","37320565_p0.webp","85077923_p0.webp","94173069_p0.webp","94955814_p0.webp","77240141_p0.webp","85524069_p0.webp","78875099_p0.webp","79906379_p0.webp","100567610_p0.webp","77734148_p0.webp","59649097_p0.webp","98281111_p0.webp","100039624_p0.webp","101473348_p0.webp","85460920_p0.webp","86141867_p0.webp","76771613_p0.webp","80567870_p0.webp","100960965_p0.webp","91191150_p0.webp","100930872_p0.webp","78663174_p0.webp","97495003_p0.webp","82135005_p0.webp","87745777_p0.webp","74635611_p0.webp","97146726_p0.webp","102825244_p0.webp","100365012_p0.webp","78173773_p0.webp","97941568_p0.webp","75854071_p0.webp","79851098_p0.webp","73081851_p0.webp","80598441_p0.webp","96099152_p0.webp","90153492_p0.webp","85465269_p0.webp","85376171_p0.webp","101811971_p0.webp","62519151_p0.webp","89172772_p2.webp","100376755_p0.webp","94394808_p0.webp","70246393_p0.webp","78491685_p0.webp","65293627_p0.webp","83101983_p0.webp","100780504_p0.webp","85730157_p1.webp","84350788_p0.webp","72300506_p0.webp","91303180_p0.webp","77359441_p0.webp","69938888_p0.webp","98201866_p0.webp","99435308_p0.webp");
$kano_horizontal = array("kano_pc_28.webp","kano_pc_25.webp","kano_pc_18.webp","kano_pc_23.webp","kano_pc_09.webp","kano_pc_31.webp","kano_pc_03.webp","kano_pc_12.webp","kano_pc_27.webp","kano_pc_32.webp","kano_pc_19.webp","kano_pc_15.webp","kano_pc_29.webp","kano_pc_21.webp","kano_pc_11.webp","kano_pc_26.webp","kano_pc_13.webp","kano_pc_16.webp","kano_pc_02.webp","kano_pc_17.webp","kano_pc_07.webp","kano_pc_30.webp","kano_pc_06.webp","kano_pc_04.webp","kano_pc_24.webp","kano_pc_01.webp","kano_pc_20.webp","kano_pc_14.webp","kano_pc_05.webp","kano_pc_10.webp","kano_pc_08.webp","kano_pc_22.webp");
$kano_vertical = array("kano_mobile_05.webp","kano_mobile_06.webp","kano_mobile_02.webp","kano_mobile_04.webp","kano_mobile_01.webp","kano_mobile_03.webp");
$albumList = array("Genshin-Impact"=>"genshin_impact","yuri"=>"yuri","kano-horizontal"=>"kano_horizontal","kano-vertical"=>"kano_vertical"); // 相册列表
$albumLocalDir = array("genshin_impact"=>"./library/genshin-impact/","yuri"=>"./library/yuri/","kano_horizontal"=>"./library/kano/horizontal/","kano_vertical"=>"./library/kano/vertical/"); // 本地相册文件夹路径
$albumCDNDir = array("genshin_impact"=>"/genshin-impact/","yuri"=>"/yuri/","kano_horizontal"=>"/kano/horizontal/","kano_vertical"=>"/kano/vertical/"); // CDN相册文件夹路径
$cdnUrlList = array("https://cdn.ilulu.ink/img/api-100","https://image.kanochan.net/library","https://api.hellonewworld.net/iro/KanoChan/library");
/**
* 输出跳转至图片CDN地址
*/
function outputImageWithCDN($imageName,$imageDir) {
global $cdn_url;
header("Location:".$cdn_url . $imageDir . $imageName);
}
/**
* 以二进制输出图片数据
* @param $type 图片的二进制类型
* @param $imagePath 源图片路径
*/
function outputImageWithPassthrough($imagePath) {
ob_clean();
$imgData = file_get_contents($imagePath); //获取图片二进制流
$type = getimagesize($imagePath)['mime']; //获取图片文件类型
header('Access-Control-Allow-Origin:*'); //允许所有域名跨域
header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
header('Access-Control-Allow-Headers:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization');
header("Content-Type:{$type}");
echo $imgData; //输出二进制图片
}
/**
* 格式化URL参数
*/
function convertUrlQuery($query)
{
$queryParts = explode('&', $query);
$params = array();
foreach ($queryParts as $param) {
$item = explode('=', $param);
if (empty($item[0])) {
$item[0] = 'undefined';
}
if (empty($item[1])) {
$item[1] = 'undefined';
}
$params[$item[0]] = $item[1];
}
return $params;
}
/**
* 默认输出
*/
function outputImageWiDefault()
{
global $defaultAlbum,$output,$albumList,$genshin_impact,$yuri,$kano_vertical,$kano_horizontal,$albumCDNDir,$albumLocalDir;
$album = $albumList[$defaultAlbum];
$n = count(${$album}) - 1;
$x = rand(0, $n);
$imageName = ${$album}[$x]; //图片文件名
$imageDir = $albumCDNDir[$album];
if ($output=='0') {
outputImageWithCDN($imageName,$imageDir);
} else {
$imagePath = $albumLocalDir[$album] . $imageName;
outputImageWithPassthrough($imagePath);
}
}
$cdn_url = $cdnUrlList[$cdnChoose];
$urlQuery = $_SERVER['QUERY_STRING']; //获取URL参数
// url参数缺失处理
if (empty($urlQuery)) {
outputImageWiDefault();
exit();
}
$arrQuery = convertUrlQuery($urlQuery); //如果参数存在,则格式化
if (empty($arrQuery['album'])) {
outputImageWiDefault();
exit();
} else {
$albumName = $arrQuery['album'];
}
if (!key_exists($arrQuery['album'],$albumList)) {
outputImageWiDefault();
exit();
}
$album = $albumList[$albumName];
$n = count(${$album}) - 1;
$x = rand(0, $n); //数量范围内生成随机数
$imageName = ${$album}[$x];
$imageDir = $albumCDNDir[$album];
if ($output=='0') {
outputImageWithCDN($imageName,$imageDir);
} else {
$imagePath = $albumLocalDir[$album] . $imageName;
outputImageWithPassthrough($imagePath);
}
exit();
?>
特色
目前共三个相册:原神、百合、kano,大部分图片收集自P站,人肉精选。图片比例约为16:9,分辨率2160P。原始图片通过PhotoShop使用“保留细节2.0”超分(或超采样缩放)至4K,后在PS中转码为webp格式,在质量与图片体积中平衡取舍。
三个自定义参数:
- output:0使用CDN,1使用本机输出
- cdnChoose:选择哪个CDN(如果有)
- defaultAlbum:未指定相册或URL参数错误时默认输出的相册
请确保数组里的文件名和磁盘(或CDN)中的文件对得上,文件夹结构一致。需要修改的话,两者都要修改,否则404。
可以配置多个CDN地址,如CDN异常可在API中快速进行切换,前端无需调整。
不使用CDN时不做302跳转,直接进行二进制输出,对服务器性能有略微的影响,服务器带宽小不建议使用直出的方式。
API代码未作任何输入校验和错误处理。
图包下载:library.zip
图片文件名即为PIXIV ID,图片均收集自网络,非商业化使用,如有侵权,请联系我删除!
如何使用
基本使用
API URL:https://api-images.kanochan.net/api.php
https://api-images.kanochan.net/api.php
将图片URL替换成上面的API URL即可,同一页面多次引用在末尾加上随机字符以做区分,如:
https://api-images.kanochan.net/api.php?250
进阶使用
API URL:https://api-images.kanochan.net/api.php?album=yuri&
https://api-images.kanochan.net/api.php?album=yuri&
album=相册名称
用于指定输出相册,未指定则以defaultAlbum
中的相册输出。
可选的相册:
- 原神:https://api-images.kanochan.net/api.php?album=Genshin-Impact&
- Yuri:https://api-images.kanochan.net/api.php?album=yuri&
- kano(竖向):https://api-images.kanochan.net/api.php?album=kano-verticalt&
- kano(横向):https://api-images.kanochan.net/api.php?album=kano-horizontal&
图片一览
- 原神Genshin Impact(慎入!可能需要250MB流量)
- Yuri
只是觉得女孩子们之间真是好啊(慎入!可能需要280MB流量) - kano
可用的CDN列表
唔,这是ilulu赞助的,需要refferer加白名单。
这是萝莉控ilolicon赞助的,可以托管5GB的图片哦,快联系TA吧
使用Cloudflare,速度随缘。
- .......正在等待更多大佬赞助CDN(划掉)
一些帮助
这个小函数可以帮你把文件夹里的图片输出为数组,本来想集成进API里,算了算了。
<?php
/**
* 获取图库数据
* @param $dir 要查找的文件路径
* @param $dirArray 存储文件名的数组
* @param $albumName 相册名称,以目录来命名
*/
function getImgList($dir, &$dirArray)
{
// 读取当前目录下的所有文件和目录(不包含子目录下文件)
$filesList = scandir($dir);
if (is_array($filesList)) {
foreach ($filesList as $val) {
// 跳过. 和 ..
if ($val == '.' || $val == '..')
continue;
// 判断是否是目录
if (is_dir($dir . '/' . $val)) {
getImgList($dir . '/' . $val, $dirArray); //遇到目录递归继续往下寻找
} else {
$albumName = end(explode('/',$dir)); //获取图片文件所在的目录名称
$dirArray[$albumName]['imgDir'] = $dir; //记录图片相对路径
$dirArray[$albumName]['imgLib'][] = $val; //记录图片文件名
}
}
}
}
$imgList = array ();
$dir = './library';
getImgList($dir, $imgList);
print_r($imgList);
exit();
?>
Comments NOTHING