1. 程式人生 > >使用Python在Markdown插入圖片並自動獲取連結

使用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)

01.PNG

首次安裝Python時,在安裝選項時將上圖圖所示選項勾選上,這樣安裝完畢後會自動為我們新增環境變數,在任意目錄都可以使用dos命令執行python指令了:

02.PNG

因為是引入了七牛雲的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上,命令列視窗一閃而過,具體消失的時間依圖片上傳的速度而定。這時候圖片已經成功上傳到七牛雲空間並獲取連結,如下動圖所示:

1.gif

謝謝前人的程式碼和思路。該指令碼同時支援[“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}"

儲存後執行該登錄檔檔案即可