xChar
·a year ago

最近比较喜欢写一些杂七杂八的东西,然后再把自己写的东西上传到各个平台真的很有成就感。但是因为我是在本地用markdown写的,在上传的时候就有点麻烦。

比如在b站上传时,在typora复制全文粘贴到b站的编辑器,文章中的图片就不会复制到其中,这就需要手动上传……图片少点还好,但是多的话真的累死人。

硬着头皮上传的多了以后,慢慢发现可以直接复制图片文件后粘贴在相应位置。虽然方便了一点,但还要在文档中找准位置,并在文件夹中找到相应的图片,时间一长眼都花了……能不能再方便一点呢?

601cf383b2b7d0a26cd1645e8eef76094a369a87

哦,大概想到办法了:用python脚本循环检测剪贴板,在上传的markdown文档中复制图片链接后,python就获取到了图片链接,然后再根据链接复制图片文件到剪贴版,并进行粘贴。

这样只要在markdown文档中复制图片链接,就会自动上传图片了。好棒!

a64b5c256b600c33ae988e0c5f4c510fd8f9a13f

好长时间不弄真的忘了好多,花了一天多终于写出来了,大概就是这样(完整源码放在最后)

def main(relPath=False, autoPaste=True, interval=0.2):
    """
    循环检测剪贴板,解析剪贴板内容,根据内容复制图片,可选自动粘贴

    :relPath: 相对路径的根路径。
        一般markdown中图片使用相对路径,此参数填入md文件所在目录的路径;
        如果使用绝对路径,此参数填入False
    :autoPaste: 自动粘贴。填True会在复制md图片链接后自动粘贴图片;填False禁用
    :interval: 循环检测剪贴板间隔时间(秒)
    """
    # 清空剪贴板
    pyperclip.copy('')
    while True:
        time.sleep(interval)  # 延时循环

        # 读取剪贴板
        mdStr = read_clip()

        # 解析markdown图片链接,错误返回false
        imgPath = md_to_path(mdStr, relPath)

        # 打印信息
        print_info(mdStr, imgPath)

        # 如果解析错误则重启循环
        if not imgPath:
            continue

        # 复制图片至剪贴板
        copy_img(imgPath)

        # 如果autoPaste(自动粘贴)为Ture则粘贴
        if autoPaste:
            auto_paste()
            
            
if __name__ == '__main__':

    # md文件所在目录的路径
    relPath = r'X:\your\markdown\dir'

    main(relPath)

马上试试吧!

不过发现了一点问题:从typora复制全文粘贴到b站的编辑器时,不仅图片不会复制到其中,连图片的链接都不会被复制。这可完了,一百多行要白写了吗?

5c0b3ddca144ad340d94ec4395a20cf430ad85f1

本着不能前功尽弃的态度,又摸索了一会。大概发现了复制不到图片链接的原因,因为在typora中图片链接的文本被解析为了图片,所以就复制不到文本(恼,图片和文本都没法复制)。

既然这样的话,那就把图片链接破坏一下,让它不被解析为图片而只是文本。

Pastedimage20230707193646

嘻嘻,快捷键 ctrl+h 替换一下就好啦

Pastedimage20230707194443

很容易就能看到和上边不一样啦,再试了一下果然没有问题了!(还更显眼了真好)

试着上传了一下,啊好棒。鼠标连击三下选中整行,然后 ctrl+c ,那长长的链接就自动变成了图片。sugoi!

mdToPic

本文写到这里,本想就这样结束,但是稍微多想了一点:动图也能上传吗?

比较怀疑,因为在写 copy_img 函数用来复制图片至剪贴板时,借鉴的一篇文章中是将图片转换为位图“BMP”然后写入剪贴板。位图可不是动图啊。

参考:python 复制图片到剪贴板 https://www.cnblogs.com/JYB2021/p/14696503.html

试了试,果然不动了。。。这可不行,不然上边的虹夏可都不会动了!!

又看了用另一种方法的另一篇文章并试了一下,这回可以了,感谢TA!!!

Python3复制PNG透明图片到剪贴板 https://blog.csdn.net/MowChan/article/details/122823017

mdToGif

好了,真好用,现在就去上传啦!

36c50165034f78f05a4121303c310a55b2191c51

# coding: utf-8

import time
import re
import os

# pip install pyperclip, 简单调用剪贴板
import pyperclip

# pip install pywin32, win32clipboard是操作剪贴板的模块
import win32clipboard as clp

# pip install pyautogui, 自动化
import pyautogui


def read_clip():
    """
    **读取剪贴板**

    """
    return pyperclip.paste()


def md_to_path(mdStr, relPath=False):
    """
    **解析markdown图片链接**
    1. 正则表达式匹配图片路径,如果未匹配到则返回false
    2. 如果relPath = False(非相对路径)则不补完路径,
        relPath填入目录路径,则据此补全
    3. 判断路径文件是否存在,存在返回路径,否则返回false

    :mdStr: markdown图片链接,如![...](...)
    :relPath: 相对路径根路径。默认为false。
    """

    # 1. 匹配路径
    # searchObj = re.search(r'^.?!\[.*\]\((.*)\)', mdStr)
    searchObj = re.search(r'^.?!.*\((.*)\)', mdStr)  # 开头.?防止复制到上一行的换行符?
    if not searchObj:
        return False
    imgPath = searchObj.group(1)

    # 2. 补完路径
    if relPath:
        # 拼接路径并标准化路径名
        imgPath = os.path.normpath(
            os.path.join(relPath, imgPath))

    # 3. 判断路径
    if os.path.isfile(imgPath):
        return imgPath
    else:
        return False


def copy_img(file):
    """
    **复制图片至剪贴板**
    :file: 图片的路径
    """

    clp.OpenClipboard()
    clp.EmptyClipboard()
    wide_path = os.path.abspath(file).encode('utf-16-le') + b'\0'
    clp.SetClipboardData(clp.RegisterClipboardFormat('FileNameW'), wide_path)
    clp.CloseClipboard()


def auto_paste():
    """
    **自动粘贴**
    """
    time.sleep(0.5)  # 等待0.5秒等待按键抬起防止未知故障
    pyautogui.hotkey('ctrl', 'v')


lastStr = ''


def print_info(mdStr, imgPath):
    """
    **打印捕获信息**
    重复信息或空白不打印
    控制打印字数
    """
    # 转为字符串防止len报错,并去掉换行打印美观
    mdStr = str(mdStr).replace("\n", " ").replace("\r", "")
    imgPath = str(imgPath).replace("\n", " ").replace("\r", "")

    global lastStr
    if mdStr == lastStr:
        return False
    elif mdStr == '':
        return False
    lastStr = mdStr

    if len((mdStr)) > 100:
        print(mdStr[:100]+'...')
    else:
        print(mdStr)

    if len(imgPath) > 100:
        print(imgPath[:100]+'...')
    else:
        print(imgPath)
    print('')

    return True


def main(relPath=False, autoPaste=True, interval=0.2):
    """
    循环检测剪贴板,解析剪贴板内容,根据内容复制图片,可选自动粘贴

    :relPath: 相对路径的根路径。
        一般markdown中图片使用相对路径,此参数填入md文件所在目录的路径;
        如果使用绝对路径,此参数填入False
    :autoPaste: 自动粘贴。填True会在复制md图片链接后自动粘贴图片;填False禁用
    :interval: 循环检测剪贴板间隔时间(秒)
    """
    # 清空剪贴板
    pyperclip.copy('')
    while True:
        time.sleep(interval)  # 延时循环

        # 读取剪贴板
        mdStr = read_clip()

        # 解析markdown图片链接,错误返回false
        imgPath = md_to_path(mdStr, relPath)

        # 打印信息
        print_info(mdStr, imgPath)

        # 如果解析错误则重启循环
        if not imgPath:
            continue

        # 复制图片至剪贴板
        copy_img(imgPath)

        # 如果autoPaste(自动粘贴)为Ture则粘贴
        if autoPaste:
            auto_paste()


if __name__ == '__main__':

    # md文件所在目录的路径
    relPath = r'X:\your\markdown\dir'

    main(relPath)

Loading comments...