如各位所见,自从打卡片式文章列表毕业之后,文章主图就成了影响网站美观的一个重要问题。但是因为一种不可抗力 —— 懒 —— 我又不太可能给每一篇文章精确配图,为了满足这个需要,随即图片 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 处获得。
很不错哦
随机图片 API 的话,这里有个解决方案:https://haremu.com/p/349 。 这个的好处是直接返回图片数据,隐藏掉了图片的真实地址,而且可以防盗链
您好,您说的这个我在 GitHub 上看到了,也尝试了一下,似乎还是有点八字不合 2333 不过防盗链倒是挺好。后来查证是我的 lnmp 自动配置的事。另外您的那个项目我也打算稍微修改一下,但主要没学过 PHP,不好大改
我的哪个项目呀?追番吗 #(脸红)
就是您评论提到的那个呀 @(哈哈)
哈哈我还以为你说的是我的项目呢哈哈 尴尬
哈哈哈,话说要不要加一下友链呢
吼啊~已经加上了,可能要等 CDN 刷新一下缓存才能看到