前篇文章我们接入了七牛云对象储存图床,该研究一下如何将之前写的随机封面图库接入图床了。这次的代码修改侧重于如何尽量小的修改现有代码。
关于本地图库的问题
现在有两个选择,一是从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');
}
?>
尾声
程序的稳定性还有待后续观察,但是可以预想到随着天数增加,必然有线上和本地图库产生差异那一天。如果这个时间很长,比如平局半年一次,手动矫正即可。如果这个时间不长的话,我只能在程序里加上文件校验了。