MENU

【代码札记】随机图片API的简易PHP实现

August 3, 2018 • 瞎折腾

如各位所见,自从打卡片式文章列表毕业之后,文章主图就成了影响网站美观的一个重要问题。但是因为一种不可抗力——懒——我又不太可能给每一篇文章精确配图,为了满足这个需要,随即图片API就出现了。我最早使用的是漫月API,但是后来它凉了;随后我转阵再见某人的api,关于他的连接可以在我的友链页面可以看到,不过没用几天,它也凉了。现在我用的是阿钰的API,但是我这边访问不太稳定,估计是老旧小区的宽带要背锅。但是无论怎么说,我现在网站托管在CN2 GIA服务器上,速度还不算慢,为何不自己弄一个随机图片API呢?速度还快,还挺好用。于是便有了接下来的文章:

题内话

首先说PHP,这东西我自然是不会写的,于是稍后你看到的代码全部是面向复制粘贴和搜索引擎编程,因此版权归属于互联网。
其次就是实现思路,虽然不会写PHP,但是我会Java啊,都是指令式编程,不是啥Haskell或者Lisp家族,自然在算法上就触类旁通。首先是获取指定文件夹下的文件列表,这个方法要支持二级目录以便后续给图片分类。获取到之后就是从列表中随机取一个出来并且将他的地址301或者302出去,这里我使用的是302临时重定向,防止一些缓存类功能的组建缓存图片。在这个过程中我还加入了对于文件后缀名的检测,以防止一些乱七八糟的东西混在图片文件夹进而导致出现问题。
然后,我觉得就没啥可说的了。挺简单的小程序,也没必要上传github,就放在下面留给诸位看吧,没写过php,各位嘴下留情。欢迎在评论区留言指正错误。

代码


<?php
//这里是复制来的,源 https://blog.csdn.net/markely/article/details/8805492
function get_allfiles($path,&$files) {
    if(is_dir($path)){
        $dp = dir($path);
        while ($file = $dp ->read()){
            if($file !="." && $file !=".."){
                get_allfiles($path."/".$file, $files);
            }
        }
        $dp ->close();
    }
    if(is_file($path)){
        $files[] =  $path;
    }
}
   
function get_filenamesbydir($dir){
    $files =  array();
    get_allfiles($dir,$files);
    return $files;
}
   
//这将得到一个文件夹中的所有文件的数组,可将参数改为你要获取的文件夹
//注意,如果是./xxx/这样的形式,会导致最终出现  https://aaa.com/bbb/picture//yyyyy/zzz.jpg
//问题在于网址中会出现//这样的情况导致404
$img_array = get_filenamesbydir("./picture");
//允许的后缀名列表 
$extentions = array("jpg", "png");
//循环取
do{
    //从数组中选择一个随机图片
    $img = array_rand($img_array);
}while(!in_array(strtolower(pathinfo($img_array[$img], PATHINFO_EXTENSION)), $extentions));
//↑检查文件后缀名
//302显示图片
header("location:$img_array[$img]"); 
?>


知识共享许可协议
【代码札记】随机图片API的简易PHP实现天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

7 Comments
  1. 很不错哦
    随机图片 API 的话,这里有个解决方案:https://haremu.com/p/349 。 这个的好处是直接返回图片数据,隐藏掉了图片的真实地址,而且可以防盗链

    1. @熊猫小A您好,您说的这个我在GitHub上看到了,也尝试了一下,似乎还是有点八字不合2333不过防盗链倒是挺好。后来查证是我的lnmp自动配置的事。另外您的那个项目我也打算稍微修改一下,但主要没学过PHP,不好大改

    2. @天空Blond我的哪个项目呀?追番吗#(脸红)

    3. @熊猫小A就是您评论提到的那个呀@(哈哈)

    4. @天空Blond哈哈我还以为你说的是我的项目呢哈哈 尴尬

    5. @熊猫小A哈哈哈,话说要不要加一下友链呢

    6. @天空Blond吼啊~
      已经加上了,可能要等CDN刷新一下缓存才能看到