为了节省服务器带宽,提高页面加载速度,本站从建立以来图片都是托管在图床上的,经过大大小小的各种瞎折腾,累计大概迁移了两次图床。第一次是因为微博图床开启了防盗链,不得不说微博图床还是很好用,尽管后来可以用反代的等各种方式解决防盗链,但是速度已经大不如前。在那段时间我试遍了各种免费图床(收费的搞不起),发现速度都差强人意。期间试过了路过图床(不稳定,服务器在海外,国内速度一般)、SM.MS(慢)、ImgURL(限制每日上传次数)、公益图床(限制太多),这些免费图床几乎都有限制或者速度太慢的问题,而且用户的数据很难保证安全。

一次偶然的机会发现了有个阿里图床的存在,其实也不算图床貌似就是利用了阿里客服的一个漏洞,阿里随时都可以和谐,不过有大厂 CDN 的加持还是很快的。不知你发现没有,很多大厂网站都有识图功能,通过此功能上传的图片链接是永久有效的,所以就出现了京东、百度之类的图床,用户使用这些图床数据安全是得不到保障的。

本站从微博图床防盗链后一直使用阿里图床至今,期间多次萌生过更换图床的想法,后因为暂时没问题且更换麻烦都搁置了。最近发现阿里图床很不稳定,部分图片加载不出或出现 429 错误,严重拖慢了整站速度,不得已下定决心更换图床。本次图床使用 Jsdelivr + Github + PicGo ,图片数据全部存储在自己的 GitHub 仓库里不用担心数据安全的问题,配合 jsDelivr 全球 CDN 加速直接起飞~

下载旧图片

更换图床首先要先把旧的图片全部下载下来,由于原先全是用的阿里图床外链,所以我直接把数据库中所有表导出为 sql 文件下载到本地,再使用正则提取的方式获取所有图片链接。得到图片链接后还需要解决下载的问题,目前市面上的主流下载器貌似都没有批量下载超过500个文件功能(后来发现 IDM 可以),这里我自己写了一个简单的 Python 脚本,将所有链接保存在 下载列表.txt 文件内然后执行此脚本即可,能够自动去重下载。
源码如下:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import requests

# 声明全局变量
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
}
down_list = []

# 读取下载列表函数
def open_file(txt):
    global down_list
    try:
        file = open(txt, "r", encoding="utf-8")
        temp_lists = file.readlines()  # 取出每行作为数组
        for i in temp_lists:
            down_list.append(i.replace("\n", ""))
        print("共获取到" + str(len(down_list)) + "个下载任务!")
    except Exception as e:
        print(e)

# 下载函数
def download(url, name):
    r = requests.get(url, headers=headers, timeout=10)
    with open(name, "wb") as code:
        code.write(r.content)

# 列表去重函数
def check_list(lists):
    temp = []
    for i in lists:
        if not i in temp:
            temp.append(i)
    return temp

if __name__ == '__main__':
    open_file("下载列表.txt")
    final_list = check_list(down_list)
    for file_url in final_list:
        file_name = file_url.replace("https://ae01.alicdn.com/kf/", "")  # 删除url前缀
        download(file_url, file_name)

压缩旧图片

图片都下载好了后,发现以前的图片大多都没有压缩,所以还需要再压缩下才能上传,这里我直接用的 色彩笔 在线工具批量压缩,压缩后大小整整小了一倍呢。

上传替换旧图片

把图片都上传到自己的 GitHub 仓库,然后发布一个 releases ,之后就可以通过 jsDelivr 引用资源了,使用方法:https://cdn.jsdelivr.net/gh/你的用户名/你的仓库名/文件路径。然后直接用 VSCode 打开导出的 sql 文件,Ctrl + H 批量替换阿里图床域名前缀为自己通过 jsDelivr 引用资源的前缀(当然也可以用 SQL 语句替换),再将 sql 文件重新导入数据库就成功的完成图床更换了,注意 WordPress 主题设置那边的信息可能会重置,需要重新设置下。


Never give up your dreams.