自建随机图片API
1.前言
网上其实可以搜到很多关于随机图片的Api,但是很多已经年代久远、速度缓慢,或者是分类不全不太符合口味,所以选择自建一个,图片都是自己挑选的,不喜欢也可以更换,方便维护。
本次使用的是GitHub+jsdelivr 来构建,同样也使用于使用OSS云存储的用户。
有网络条件的可以直接使用Github完成搭建,完全免费。当然用本地存储的也是可以的,就是需要占用服务器硬盘。
由于jsdeliver已经被半墙,国内基本不能正常使用,建议自己找新的CDN,我已经改回阿里云OSS+阿里云CDN,在这不作使用解释。
2.实现步骤
①建立图片API,首先就得有图片,数量风格都可以自选,在这里推荐几个免费的图库——wallhaven.cc(已经半墙) 、Pixbay 、 Pexels
②把图片保持到本地后,文件名大多都是乱的,最好统一一下名称,排个序号,方便日后删除更换,在这里建议把图片格式转为webp
形式,可以有效提升加载时间。这边不建议使用太大的图片,因为在读取的时候会加载图片,一般图片10M左右已经要加载很久,所以我们需要压缩图片。可以选择TinyPNG实现,非会员支持最大5M和20张的图片处理,可以有效压缩图片大小且不会产出肉眼可见的影响。
③接着可以把图片上传到云存储或者网站空间,比如Github、Gitee、Onedrive等各大服务商。
(我原本是使用阿里云的OSS,但是奈何问题太多,现在已经转为Github+jsdelivr)
通过Github直接访问图片国内可能不太理想,这时可以使用jsdeliver进行 CDN 加速,他是免费开源的。
jsdeliver使用方法(已弃用)
使用非常简单,只需要把图片地址链接域名改为 CDN 的域名。格式如下:
https://cdn.jsdelivr.net/gh/<你的github用户名>/<你的图床仓库名>@<仓库版本号>/图片的路径
以 1.webp 图片为例
最终地址为(地址仅做为范例参考):
https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/1.webp
④以此类推,获取剩下图片的URl,然后保存到TXT文本里:
https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/1.webp
https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/2.webp
https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/3.webp
https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/4.webp
https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/5.webp
https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/6.webp
如果是使用某些云存储平台的直接使用图片的URL就可以了。
⑤把TXT文件放在云存储或者网站任意目录下,注意要跟下文中的PHP文件要放在同一级目录,比如同时放在……/Random/Photo/img.txt和……/Random/Photo/img.php
如果嫌麻烦,也可以用python自动输出解决:
# 作者(Author):TonaSmith
# 链接(URL):https://caoyongzhuo.cn/archives/466
#适用于序号编排的图片如1.png、2.png……
filename="D:\\文档\\imgs.txt" /*输出目录及文件名*/
randimgs=open(filename,"a")
for numbers in range(1,20): /*输出序号,这里是从1输出到20*/
randimgs.write("https://cdn.jsdelivr.net/gh/dogsking/randompicturePC/images/"+str(numbers)+".webp\n") /*修改此处的图片地址*/
randimgs.close()
⑥最后使用随机获取图片链接输出的PHP:
<?php
//此php和保存链接的txt文件放在同一目录下
$filename = "img.txt"; /*保存链接的txt文件名*/
if(!file_exists($filename)){
die('文件不存在');
}
//从文本获取链接
$pics = [];
$fs = fopen($filename, "r");
while(!feof($fs)){
$line=trim(fgets($fs));
if($line!=''){
array_push($pics, $line);
}
}
//从数组随机获取链接
$pic = $pics[array_rand($pics)];
//返回指定格式
$type=$_GET['type'];
switch($type){
//JSON返回
case 'json':
header('Content-type:text/json');
die(json_encode(['pic'=>$pic]));
default:
die(header("Location: $pic"));
}
?>
⑦在需要使用php文件的地方填入文件路径就可以访问这个随机图片php,即可调取图片输出。