banner
sakiko🐘

sakiko🐘

可怜的孩子 不再胆怯
twitter
twitter
discord server

關於本地markdown文檔發布到各平台時圖片上傳很麻煩這檔事

最近比較喜歡寫一些雜七雜八的東西,然後再把自己寫的東西上傳到各個平台真的很有成就感。但是因為我是在本地用 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)

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。