1. 引言

首页的图片每天都是重样的是在是看得心烦意乱,就希望每次访问网页都能看到不一样的风景,既然是用Typora+PicGo写博客,图片通过JSDlivr全球分发(其实是心疼CDN的钱,毕竟每个月又拍云才给15G),那么我就直接通过一个简单的php实现访问GitHub中的随机图片不就能实现简单的随机图API了嘛?

说干就干,咳咳,我们理一下思路:

  1. 先找到我们需要的随机图<赛博朋克风格随机图32张>
  2. 通过大名鼎鼎的tingpng实现压缩,毕竟图片1080P就够了,还有手机用户呢
  3. 通过PicGo上传到GitHub,输出加速后的图片地址
  4. 部署到服务器中,并通过API调用

2. 实现

图片我们已经准备好了,把这些图片上传到Tinypng,可以看到压缩率为70%,还是比较夸张的,我这里下载的图片都是1920×1080分辨率,如果分辨率不太好的话可以用OpenCV压缩一下,代码如下:

import os
import cv2

file_path = "你的文件目录"
web_path = "上传的CDN目录"

def img_resize(image_path):
    image = cv2.imread(file_path+image_path)
    height, width = image.shape[0], image.shape[1]
    # 设置新的图片分辨率框架
    width_new = 1920
    height_new = 1080
    # 判断图片的长宽比率
    if width / height >= width_new / height_new:
       img = cv2.resize(image, (width_new, int(height * width_new / width)))
    else:
       img = cv2.resize(image, (int(width * height_new / height), height_new))
    if ".jpg" in image_path:
        cv2.imwrite(file_path+image_path, img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
    elif ".png" in image_path:
        cv2.imwrite(file_path+image_path, img, [cv2.IMWRITE_PNG_COMPRESSION, 0])

if __name__ == '__main__':
    filelist = os.listdir(file_path)
    with open('目录/img.txt','w') as f:
        for file in filelist:
            img_resize(file)
            f.write(web_path+file+'\n')

此时,img.txt中就会包含我们上传到GitHub后分发的文件地址了,格式为:https://cdn.jsdelivr.net/gh/用户名/仓库名/文件名.jpg/png,把文件保存好,后续我们需要使用。

image-20210115023855485

已经把文件保存到img.txt文件中了,现在我们可以配置random.php文件了。

<?php
//存有美图链接的文件名img.txt
$filename = "img.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"));
}
?>

好了,接下来我们访问一下试试:

image-20210115024511254

哈哈哈哈,其实没什么问题,我们只要配置一下HTTPS证书就好了,提示的是后端不健康!

3. 总结

至此,已经全部配置完成了,访问我的个人博客reid.run就可以看到首页随机图都换成了赛博朋克风,一个小遗憾是忘记把水印关掉了,后续再上传的话我会注意的!

我的赛博朋克 api:https://api.reid.run/random.php

博客运行效果:https://reid.run

后续会写一个自动化的Python3随机api,这样的配置实在是太繁琐了~

Q.E.D.


print("种一棵树最好的时间是十年前,其次是现在")