PHP建随机图片API

PHP建随机图片API

  • 建了自己的博客后,看到有不少博客都做了一些随机图片API,自己也手痒痒的,而且用别人提供的服务怕因为各种原因突然用不了了,于是乎打算自己也做一个
  • 参考了网上一些文章,同时结合自己实际情况,也加上了一些解释,于是就有了本文,仅进行简单的实现,写的比较啰嗦,大佬自行绕道2333333

准备

1.一台服务器(或者本机)
2.已搭建好php环境(网上有很多教程,这里就不赘述了),我用是nginx+php-fpm

基本原理

随机图片API,主要原理其实很简单,就三步:
1.用一个文本文档存放图片的链接
2.当用户请求API时,php就去读取txt文件,然后生成随机数来随机选取一个图片链接
3.302重定向到目标图片地址

  • 为什么用php呢?其实用什么编程语言都可以实现这个功能,当初看到大部分人的API都是php写的,而且懒得搭python系(Django/flask等)环境,Java更懒得弄了,更新下代码还得重新编译、部署服务
  • 而php搭好环境直接替换文件就可以了,随时可以改代码,甚至还不需要登录服务器,很方便,所以就选它了,再加上之前没接触过php,学学也好~

实现

下面给出最简单的实现方式,详细说明见注释
1.创建文件randImg.txt用于存放图片地址,如

https://tva1.sinaimg.cn/large/0072Vf1pgy1fodqgiodg1j31gs1191im.jpg
https://tva1.sinaimg.cn/large/a15b4afegy1fmviz5449mj21hc0u01kx.jpg
https://tva1.sinaimg.cn/large/0072Vf1pgy1fodqiemqvoj31hc0xcaxb.jpg
https://tva1.sinaimg.cn/large/0072Vf1pgy1fodqn34by0j31hc0xcqg9.jpg

2.创建randImg.php

// 1.读取randImg.txt中的内容,并以换行符分开
$str = explode("\n", file_get_contents('randImg.txt'));
// 2.得到的$str是一个String的数组,然后获取随机数index
$rand_index = rand(0,count($str)-1);
// 根据生成的随机数选取index为$rand_index的图片链接
$url = $str[$rand_index];
// 替换掉转义
$url = str_re($url);
// 3.重定向到目标url,返回302码,然后浏览器就会跳转到图片url的地址
header("Location:".$url);
// 替换掉一些换行、制表符等转义
function str_re($str){
    $str = str_replace(' ', "", $str);
    $str = str_replace("\n", "", $str);
    $str = str_replace("\t", "", $str);
    $str = str_replace("\r", "", $str);
    return $str;
  }

就上面几行,很简单吧?
抛砖引玉,然后就可以根据自己需要进行改动了

其他说明

上面给出的例子是把图片上传到新浪微博后,新浪处理后会返回一串编码,如0072Vf1pgy1fodqgiodg1j31gs1191im
根据这个编码就可以拼凑urlhttps://tva1.sinaimg.cn/large/0072Vf1pgy1fodqgiodg1j31gs1191im.jpg请求到刚上传的图片,而且新浪还很贴心地帮我们转成各种尺寸的格式,很方便,如https://tva1.sinaimg.cn/small/0072Vf1pgy1fodqgiodg1j31gs1191im.jpg获取的是小尺寸的图片
而且新浪有多个服务器,所以我们可以这样

// 列出各新浪转码后的尺寸
$size_arr = array('large', 'mw1024', 'mw690', 'bmiddle', 'small', 'thumb180', 'thumbnail', 'square');
// $_GET['size']可以获取请求中size的参数,若无指定默认large
$size = !empty($_GET['size']) ? $_GET['size'] : 'large' ;
// 随机选取新浪服务器的序号
$server_index = rand(1,4);
// in_array()匹配尺寸array
if(!in_array($size, $size_arr)){
	$size = 'large';
}
//拼接url
$url = 'https://tva'.$server_index.'.sinaimg.cn/'.$size.'/'.$sina_img.'.jpg';

注意,此时的randImg.txt保存的就是下面这些而不是完整的url了

0072Vf1pgy1fodqgiodg1j31gs1191im
a15b4afegy1fmviz5449mj21hc0u01kx
0072Vf1pgy1fodqiemqvoj31hc0xcaxb
0072Vf1pgy1fodqn34by0j31hc0xcqg9

同理,如果用jsdelivr+github作为图床的话,可以先在程序中写好url的公共部分,然后再拼接好后面的图片编号/编码

$url = 'https://cdn.jsdelivr.net/gh/xxx/xxx@master/images'.$str[$rand_index];

最后将两个文件放在同一个文件夹中,浏览器访问randImg.php即可

通常,我们会把它放在<img>中进行使用

<img src="https://yourdomain/xxx/randImg.php" alt="img">

为了避开浏览器缓存导致的同一页面的所有图片都一样,可以给同一页面调用同一接口的url后面各加个随机的参数

<img src="https://yourdomain/xxx/randImg.php?t=abc" alt="img">