最近买了一台轻量服务器,带宽和内存都还可以,闲来无事,想着自建图床玩玩。

服务器使用1panel管理,在1panel应用商店了找到了图床应用Lsky-Pro。于是,决定使用该软件

一. Lsky-Pro

安装没啥好说的了,直接1panel一键安装。然后OpenResty反向代理出去。

上Lsky-pro的管理后台,一顿设置,最终如图所示

二. 使用

虽然图床有了,但每次都打开网页手动上传着实有点不方便。能不能使用快捷键全自动化上传呢?

当然可以。Lsky-Pro提供了一系列api,我们可以使用这些api,配合Dropzone 这个神器,实现自动化上传。

接口调用

  1. 获取token

  2. 调用upload上传方法

获取token很简单,并且只需要获取一次就行。

Dropzone使用

Dropzone 是mac上一个效率应用,快速复制移动文件,打开应用程序以及使用许多不同云服务共享文件。并且最大的优点是可以自定义实现脚本逻辑。

我们这里使用python脚本来实现上传逻辑。

新建action

编写脚本

# Dropzone Action Info
# Name: upload_pic
# Description: Describes what your action will do.
# Handles: Files
# Creator: mahaonan
# URL: https://yoursite.com
# Events: Clicked, Dragged
# KeyModifiers: Command, Option, Control, Shift
# SkipConfig: No
# RunsSandboxed: Yes
# Version: 1.0
# MinDropzoneVersion: 4.0
# PythonPath: /usr/local/bin/python3


import requests
import pasteboard
from PIL import ImageGrab
from PIL import Image
import mimetypes


url = "https://xxxx/api/v1/upload"
auth = "Bearer xxxx"

def upload_image(file_path):
    payload = {}
    # 提取文件名
    file_name = file_path.split('/')[-1]
    # 查找
    mime_type, _ = mimetypes.guess_type(file_path)
    if mime_type is None:
        mime_type = 'application/octet-stream'  # 默认MIME类型

    files = [
        ('file', (file_name, open(file_path, 'rb'), mime_type))
    ]
    headers = {
        'Authorization': auth,
    }

    response = requests.request(
        "POST", url, headers=headers, data=payload, files=files)

    print(response.text)
    try:
        response.raise_for_status()  # Raises an HTTPError for bad responses
        return response.json()
    except requests.exceptions.RequestException as e:
        return {"status": False, "message": str(e), "data": None}


def get_image_url(response):
    print(response)
    if response['status']:
        return response['data']['links']['url']
    else:
        return None


def dragged():
    if len(items) != 1:
        return
    final_url = get_image_url(upload_image(items[0]))
    dz.finish("上传到lsky-pro成功")
    dz.text(final_url)


def get_clipboard_file_path():
    # 创建一个剪切板对象
    pb = pasteboard.Pasteboard()
    print(pb.get_contents)
    # 获取剪切板中的数据
    items = pb.get_file_urls()
    if items:
        return items[0]
    else:
        # 如果剪贴板中没有文件,尝试获取图片
        img = ImageGrab.grabclipboard()
        if isinstance(img, Image.Image):
            # 如果剪贴板中有图片,将图片保存为文件
            file_path = "/tmp/clipboard_image.png"
            img.save(file_path)
            return file_path
    # 如果剪切板中没有文件,返回None
    return None


def clicked():
    try:
        file_path = get_clipboard_file_path()
        if file_path:
            final_url = get_image_url(upload_image(file_path))
            dz.finish("上传到lsky-pro成功")
            dz.text(final_url)
        else:
            dz.finish("剪切板中没有文件")
    except Exception as e:
        dz.error("处理剪切板内容时出现错误: " + str(e))

需要替换url和auth参数。

设置快捷键

这里也需要设置Dropzone的快捷键,我设置为ctrl+q

最终效果

复制图片,截图以后。按快捷键ctrl + q + q,就能直接把图片上传到图床上。如下所示