使用Python在Markdown插入圖片並自動獲取連結
前言
以前寫部落格都是使用網站的線上編輯器,這種開著網頁寫東西的感覺,真是。。反正我更喜歡在自己的PC上寫好Markdown,然後直接在網站上匯入。現在基本大一些的技術網站都可以支援從本地匯入Markdown。但是Markdown的插入圖片有點麻煩,有些網站比如簡書的線上Markdown編輯器支援良好,而如CSDN,如果我使用本地圖片位置連結,雖然本地可以插入圖片,但是線上匯入後顯然不能直接獲取我的本地資源,因此貼本地連結無效。所以我們一般採取的做法是:
- 1.找到需要插入的圖片,修改檔名以區分
- 2.上傳圖片到某個圖床,我用的是七牛雲
- 3.複製圖床上的圖片的連結;然後用markdown格式插入圖片
操作不復雜,但是如果次次這麼幹,每次都得網頁登陸七牛雲。然後進空間,再上傳,找到該圖片所在位置。一旦插入的圖片多了,就感覺很煩。
解決
因為Python語言作為指令碼使用非常強大,因此該段原始碼以Python寫成,首先你的本地需要先安裝Python。Python是不向下相容的,而且Python2和Python3有語法、模組等的一些區別。該指令碼藉助了七牛雲官方提供的管理空間檔案的SDK,目前親測同時相容Python2.x和3.x沒有問題。同時對原指令碼進行了完善和升級。因為之前發現如果簡單的將圖片以數字命名並且上傳的話,會出現同名檔案覆蓋的問題。為了能最大程度的區分圖片,並且達到見名知意的效果。將要上傳的圖片和Markdown文件放到同一目錄下,當圖片上傳的時候,獲取Markdown文件名稱與圖片檔名稱拼接得到新的檔名。這樣通過檢視自己的七牛雲空間時,就可以知道每張圖片所應用的場景,並且降低了圖片外鏈覆蓋的問題。
#! /usr/bin/python #-*- coding: utf-8 -*- from qiniu import Auth, put_file, etag, urlsafe_base64_encode import qiniu.config from qiniu import BucketManager import sys,time import os import msvcrt import subprocess from datetime import datetime # you will get md_url in this file result_file = "ss.txt" if os.path.exists(result_file): os.remove(result_file) os.chdir(sys.path[0]) # you need get yours msg here access_key = "" secret_key = "" bucket_name = "" # 填入你的七牛空間名稱 bucket_url = "" # 填入你的域名地址,主要是為了記錄圖片上傳後的地址 md_url_result = "md_url.txt" img_suffix = ["jpg", "jpeg", "png", "bmp", "gif"] def upload_img(bucket_name,file_name,file_path): # generate token token = q.upload_token(bucket_name, file_name, 3600) info = put_file(token, file_name, file_path) # delete local imgFile # os.remove(file_path) return def get_img_url(bucket_url,file_name): # date=datetime.now().strftime('%Y%m%d_%H%M%S') # file_names = file_name+'?'+date img_url = 'http://%s/%s' % (bucket_url,file_name) # generate md_url md_url = "![%s](%s)\n" % (file_name, img_url) return md_url def save_to_txt(bucket_url,file_name): url_before_save = get_img_url(bucket_url,file_name) # save to clipBoard addToClipBoard(url_before_save) # save md_url to txt with open(md_url_result, "a") as f: f.write(url_before_save) return # save to clipboard def addToClipBoard(text): command = 'echo ' + text.strip() + '| clip' os.system(command) # get filename of .md in current index def getMarkName(paths): f_list=os.listdir(paths) for i in f_list: name=os.path.splitext(i)[0] end=os.path.splitext(i)[1] if end=='.md': return name+'_' return 'markdown' if __name__ == '__main__': q = Auth(access_key, secret_key) bucket = BucketManager(q) imgs = sys.argv[1:] for img in imgs: # name for img with local time up_filename = getMarkName(os.getcwd().replace('\\','/')) + os.path.split(img)[1] upload_img(bucket_name,up_filename,img) save_to_txt(bucket_url,up_filename)
首次安裝Python時,在安裝選項時將上圖圖所示選項勾選上,這樣安裝完畢後會自動為我們新增環境變數,在任意目錄都可以使用dos命令執行python指令了:
因為是引入了七牛雲的SDK,第一次使用時要將sdk整合進來,開啟cmd命令列視窗,直接執行以下命令:
>>> pip install qiniu
注意!
這是我在使用該指令碼時發現的問題。之前一直執行正常,上個月再次上傳的時候突然顯示”SSL ERROR”,圖片上傳失敗。反覆除錯檔案路徑,方法呼叫,access-key,secret-key都找不到原因。最後索性將qiniu解除安裝後重新安裝。結果同樣報出以上錯誤,想來是網路問題。於是電腦重啟並且清除了DNS快取後,成功!想來想去,可能是前段時間公司經歷過一次斷電事故,伺服器重新部署過。而我本次上傳檔案的時候系統仍然是從本地的DNS快取中讀取,取到的地址可能是錯誤的。清除快取後讓其向DNS伺服器請求一個DNS查詢,這時候返回的該域名對應的IP應該就是正確的。如果因為網路問題造成指令碼無法正常執行,可以試試我的解決辦法。
在原先的指令碼基礎上做了修改(可見註釋的程式碼,以及新增的)。圖片上傳並複製連結完畢後不在當前位置刪除,而是保留。每次上傳的圖片名以原有檔名加上操作時的時間字串加以區分。圖片上傳到七牛雲後生成的七牛雲端儲存的連結,既存在了剪貼簿裡,可以直接ctrl+v到Markdown文件上,同時在當前目錄下建立一個”md_url.txt”並將每次生成的連結儲存在其中。
使用方法
將要獲取連結的本地圖片拖拽到指令碼檔案.py上,命令列視窗一閃而過,具體消失的時間依圖片上傳的速度而定。這時候圖片已經成功上傳到七牛雲空間並獲取連結,如下動圖所示:
謝謝前人的程式碼和思路。該指令碼同時支援[“jpg”, “jpeg”, “png”, “bmp”, “gif”]格式檔案的上傳。上面的gif連結就是使用該指令碼生成的。這樣可以大大加快我們在諸如CSDN等技術網站上寫部落格的速度,是不是很方便呢?
補充!!
在win7以及升級啟用後的win10系統中,預設情況下有可能我們無法拖放一個檔案給python指令碼讓其去處理這個檔案的,這是因為windows認為python指令碼不是一個合法的可拖放的目的物件(drop target)。網上已經有人給出瞭解決辦法,我們只需在登錄檔中配置一下即可,具體做法如下
新建.reg檔案,檔名隨意,內容為:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Python.File\shellex\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"
儲存後執行該登錄檔檔案即可