最近比較喜歡寫一些雜七雜八的東西,然後再把自己寫的東西上傳到各個平台真的很有成就感。但是因為我是在本地用 markdown 寫的,在上傳的時候就有點麻煩。
比如在 b 站上傳時,在 typora 複製全文粘貼到 b 站的編輯器,文章中的圖片就不會複製到其中,這就需要手動上傳…… 圖片少點還好,但是多的話真的累死人。
硬著頭皮上傳的多了以後,慢慢發現可以直接複製圖片文件後粘貼在相應位置。雖然方便了一點,但還要在文檔中找準位置,並在文件夾中找到相應的圖片,時間一長眼都花了…… 能不能再方便一點呢?
哦,大概想到辦法了:用 python 腳本循環檢測剪貼板,在上傳的 markdown 文檔中複製圖片鏈接後,python 就獲取到了圖片鏈接,然後再根據鏈接複製圖片文件到剪貼版,並進行粘貼。
這樣只要在 markdown 文檔中複製圖片鏈接,就會自動上傳圖片了。好棒!
好長時間不弄真的忘了好多,花了一天多終於寫出來了,大概就是這樣(完整源碼放在最後)
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 站的編輯器時,不僅圖片不會複製到其中,連圖片的鏈接都不會被複製。這可完了,一百多行要白寫了嗎?
本著不能前功盡棄的態度,又摸索了一會。大概發現了複製不到圖片鏈接的原因,因為在 typora 中圖片鏈接的文本被解析為了圖片,所以就複製不到文本(惱,圖片和文本都沒法複製)。
既然這樣的話,那就把圖片鏈接破壞一下,讓它不被解析為圖片而只是文本。
嘻嘻,快捷鍵 ctrl+h 替換一下就好啦
很容易就能看到和上邊不一樣啦,再試了一下果然沒有問題了!(還更顯眼了真好)
試著上傳了一下,啊好棒。鼠標連擊三下選中整行,然後 ctrl+c ,那長長的鏈接就自動變成了圖片。sugoi!
本文寫到這裡,本想就這樣結束,但是稍微多想了一點:動圖也能上傳嗎?
比較懷疑,因為在寫 copy_img 函數用來複製圖片至剪貼板時,借鑒的一篇文章中是將圖片轉換為位圖 “BMP” 然後寫入剪貼板。位圖可不是動圖啊。
參考:python 複製圖片到剪貼板 https://www.cnblogs.com/JYB2021/p/14696503.html
試了試,果然不動了。。。這可不行,不然上邊的虹夏可都不會動了!!
又看了用另一種方法的另一篇文章並試了一下,這回可以了,感謝 TA!!!
Python3 複製 PNG 透明圖片到剪貼板 https://blog.csdn.net/MowChan/article/details/122823017
好了,真好用,現在就去上傳啦!
# 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)