如何使用免费的服务开发一个图床(存稿)

如果这张图挂了,说明该方案已经挂了

原理剖析

基于GitHub Restful APIv3将图片存储到Github Private仓库内,然后使用Netlify/Vercel的Serverless服务将其部署到全球的CDN上面(Cloudflare理论上可行)

代码实践

为了节约时间,我把代码先呈现在下面,如果你只是想要代码,拿走稍加改动即可(用图片了,自己找个OCR吧啊!在排版时有一些小的换行也请自己修改,如果你连这能力都没有,请联系我。有偿服务。)

code

接下来,我们将逐条分析代码。

from tkinter.filedialog import askopenfilename
from time import time_ns
import requests, pyperclip, json, base64

在这里,我们引入了Tkinter(Python3下的tkinter)中,filedialog.askopenfilename这个函数,这个函数可以实现打开文件并获取其文件路径的操作。

同时出于我个人的习惯,使用了time_ns作为图片以及其它文件的命名规则。

这里引入两个三方库 requestspyperclip。安装方法都是pip install xxxx。其中,Requests是Python下对urllib3的封装,提供了更高效的编码格式。

json用于打包数据,base64用于编码数据。

def openfile2base64(file):
    content = file.read()
    c = base64.b64encode(content)
    return str(c, "utf-8")


def path2base64(path):
    filepath = open(path, "rb")
    return openfile2base64(filepath)

这两段代码,主要是将文件以byte字节流形式打开并转化成Base64格式内容,后续我们会用到。

file = askopenfilename()
root = "uploads"
owner = "your username"
repo = "your reponame"
filename = str(time_ns()) + "." + file.split("/")[-1].split(".")[-1]
url = "https://api.github.com/repos/{owner}/{repo}/contents/{root}/{filename}".format(root=root,owner=owner, repo=repo,filename=filename)
token = "ghp_yourtokenplease"
header = {"Authorization": "token " + token}
params = {"message": str(time_ns()) + "update", "content": path2base64(file)}

这一段,我们定义了一些信息并生成了Github API的URL、鉴权Header和Params,这里的content就是你文件的Base64内容,而message就是你上传文件时的备注。

需要说明的是,这里我用了纳秒时间加后缀名的方式来保存文件,这里你可以对filename进行修改。

session = requests.Session()
session.trust_env = False
response = session.put(url, data=json.dumps(params), headers=header, verify=False)

这里使用Session进行put请求,原因是最近Github老是抽风,需要魔法上网才能解决,而Proxies又对我的魔法限制的死死的,无奈之下便BAN掉了request的魔法

domain = "https://img.example.com/"
imgurl = domain + response.json()["content"]["path"]

生成链接,简单的字符串拼合操作。

print(imgurl)
pyperclip.copy(imgurl)

打印链接,将链接内容复制到剪贴板上(读出是pyperclip.paste())