# 登录

以 sm 图床为例:https://sm.ms/

用接口测试工具发送一个如下请求:

2024-02-19 22:34:45

获取一个 token,保存下来。

多次请求可能会造成不能登录的情况,token 保存后等到失效再换,期间不用重复登录。

# 上传图片

这里我们想写一个程序快速给图片批量上传图床。

import os
import requests
from datetime import datetime
from PIL import Image
def upload_file(folder_path: str):
    # 获取当前时间并格式化为字符串
    time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    # 获取文件夹中的所有一级文件
    files = os.listdir(folder_path)
    # 遍历文件
    for file in files:
        # 构建文件的完整路径
        file_path = os.path.join(folder_path, file)
        
        # 检查文件是否为图片
        try:
            # 尝试打开图片文件
            img = Image.open(file_path)
            img.close()
        except (IOError, OSError):
            # 如果文件不是图片文件,则忽略该文件
            pass
        # 上传请求的 URL
        url = "https://sm.ms/api/v2/upload"
        
        # 请求的参数
        payload = {}
        
        # 要上传的文件
        files = [
            ('smfile', (time + '.png', open(file_path, 'rb'), 'image/png'))
        ]
        
        # 请求头
        headers = {
            'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
            'Authorization': '...'
        }
        # 发起 POST 请求,上传文件
        response = requests.request("POST", url, headers=headers, data=payload, files=files)
        # 处理上传响应
        resp = response.json()
        if resp['success'] == False:
            if resp['code'] == 'image_repeated':
                # 图片重复上传,获取已存在的图片链接并打印
                url = resp['images']
                print(f'![{file}]({url})')
            else:
                # 上传失败,打印响应
                print(resp)
        if resp['success'] == True:
            # 上传成功,获取图片链接并打印
            url = resp['url']
            print(f'![{file}]({url})')
# 调用 upload_file 函数,传入要上传的图片文件夹的路径
upload_file('/home/ros/Documents/数电实验/excalidraw')
  • upload_file 函数:传入要上传的图片文件夹的路径
  • Authorization 字段:填入登录获得的 token

免费版有限制:每分钟 20 次,每小时 100 次。

建议一次放十几张图片,比较合适。