通过LocalSend-Quicker实现简单的图片上传以及切换增量到剪切板

288 阅读3分钟

1.需求

PC端主要使用Obsidian做笔记的归档,但是偶尔会存在笔记本手写笔记的情况,此时对知识的管理的分离的

需求1

通过定时拍照的方式,快速上传到PC端

需求2

尽可能快速的把上传图片复制到obsidian当中

2.实现

需求1的实现--LocalSend

同一个局域网就能实现文件的转发,手机端可以直接分享到电脑

优点

  • PC端可以在后台自动启动
  • 双端的操作比较简单,手机端直接通过分享功能就能选择图片进行上传

需求2的实现--Quicker

背景

没有简单的方式可以把文件复制到剪切版当中,设计到window底层的API,尝试过ai写python,go,shell,都不能直接满足需求.然后查看Quicker的动作,发现有相关的基础动作

image.png

传入参数: 文件的绝对路径

获得增量文件

简单的python就能实现,文件的记录状态使用json文件进行保存即可

import os
import json

# JSON文件路径,用于存储文件信息和状态
json_file_path = 'file_status.json'
# 文件夹路径,请替换为您自己的文件夹路径
folder_path = r'F:\img\img-back'


def load_data():
    """加载JSON数据"""
    if os.path.exists(json_file_path):
        with open(json_file_path, 'r', encoding='utf-8') as file:
            return json.load(file)
    else:
        return {}


def save_data(data):
    """保存数据到JSON文件"""
    with open(json_file_path, 'w', encoding='utf-8') as file:
        json.dump(data, file, ensure_ascii=False, indent=4)


def scan_folder_and_update_db(folder_path):
    """扫描文件夹并更新数据库"""
    data = load_data()
    for root, dirs, files in os.walk(folder_path):
        for name in files:
            abs_path = os.path.abspath(os.path.join(root, name))
            if abs_path not in data:
                # 新文件,设置初始状态为1(等待输出)
                data[abs_path] = 1
    save_data(data)


def get_files_to_output():
    """获取状态为1的文件列表"""
    data = load_data()
    return [file for file, status in data.items() if status == 1]


def mark_as_output(file_list):
    """将文件标记为已输出(状态2)"""
    data = load_data()
    for file in file_list:
        if file in data and data[file] == 1:  # 确保只标记等待输出的文件
            data[file] = 2
    save_data(data)


# 执行逻辑
if __name__ == '__main__':
    # 首次使用或需要更新文件列表时取消下一行的注释
    scan_folder_and_update_db(folder_path)

    # 获取并打印待输出的文件列表
    files_to_output = get_files_to_output()
    # 按照行分割,打印文件列表
    # output_string = '\n'.join(files_to_output)

    # 现在 output_string 就是一个字符串,其中每个文件路径后都有一个换行符
    # print(output_string)

    for file in files_to_output:
        print(file)
    # 如果需要在输出后标记这些文件,取消下面两行的注释
    mark_as_output(files_to_output)

踩坑1

这时候,兴高采烈的通过quicker的变量进行传值,然后出现识别不了路径的情况 为什么呢

文件放入剪贴板 - Quicker 最开始怀疑字符集问题,对控制台的输出捕获和变量的字符集不同,导致识别失败

结果在不断尝试下,因为控制台输出捕获的字符最后会有一个换行,导致无法正常识别 需要使用API进行处理

$={toReadFileList}.TrimEnd()

踩坑2

这个耗时比较少,中文字符在路径无法正常显示也会导致能够成功复制到剪切板,但是无法复制到Markdown当中,只需要把文件目录就该即可