前篇文章我们接入了七牛云对象储存图床,该研究一下如何将之前写的随机封面图库接入图床了。这次的代码修改侧重于如何尽量小的修改现有代码。

关于本地图库的问题

现在有两个选择,一是从K站下载图片后再上传七牛云,二是直接通过网络链接下载文件到七牛云。看起来确实第一种方案很麻烦,增加了程序不稳定的可能。但是考虑到K站的特殊性质,在不能保证七牛云可以直接从K站下载图片的条件下,从本地上传会更为稳定。
此外由于要用php来随机返回一张图片地址,每次调用接口的时候如果都要先从七牛云获取图片列表,会增加响应时间,因此本地至少要有一个文件名的记录。
考虑到尽量小地修改现有代码,我们也应当保留本地图片库,并充当文件名索引。

编写代码

那么程序的流程如下:每日0点程序启动后,先从爬虫下载获取到的图片,之后上传七牛云。再从旧的图片库删除一定图片使总数量保持不变,同时将相应的图片从七牛云删除。调用接口的时候先获取本地图片库的文件名,随机选择一个后返回对应的七牛云外链。

爬虫

在原来的下载和删除位置加上七牛云的上传和删除即可,使用七牛云Python SDK。首先将AK和SK接入

from qiniu import Auth, put_file, etag, BucketManager
import qiniu.config
access_key = "access_key"
secret_key = "secret_key"
q = Auth(access_key, secret_key)
bucket = BucketManager(q)
bucket_name = 'bucket_name'

在下载完成后的位置加上如下代码:

key = "cover/"+r.headers['ETag'][1:-1]+".jpg"
token = q.upload_token(bucket_name, key)
localfile = gallerypath+r.headers['ETag'][1:-1]+".jpg"
ret, info = put_file(token, key, localfile)

在删除本地图片位置加上如下代码:

key = "cover/"+i
ret, info = bucket.delete(bucket_name, key)

没什么好解释的,建议去看七牛云的SDK手册。

接口

接口原本是Mashiro提供的破坏炮,但是我不会破坏炮,只能简单修改一下。

<?php 
$img_array = glob("gallery/*.{gif,jpg,png}",GLOB_BRACE);
$img = array_rand($img_array); 
$imgurl=$img_array[$img]; 
if($imgurl) { 
    header("Location: https://image.wildwizard.cn/cover/".explode('/', $imgurl)[1]);
    exit();
} else {
    echo "GG";
    exit('error');
}
?>

尾声

程序的稳定性还有待后续观察,但是可以预想到随着天数增加,必然有线上和本地图库产生差异那一天。如果这个时间很长,比如平局半年一次,手动矫正即可。如果这个时间不长的话,我只能在程序里加上文件校验了。


挂科一时爽,一直挂科一直爽。
🀇🀇🀇🀈🀉🀊🀋🀌🀍🀎🀏🀏🀏 🀋