[Python] typora文檔復制到博客圖片失效 SM.MS限制


開始

今天開始嘗試使用 Typora 寫markdown 然后復制到博客園,不過會有一個問題

那就是 typroa 插入的圖片都是本地的,md文檔復制到博客園之后,圖片都失效了

通過百度,有工具可以直接把 md 文檔中的圖片上傳到博客園,然后替換文檔中的鏈接,我把工具下載下來之后,發現這東西依賴.net ,而這個東西好大,所以萌生了自己寫一個工具的想法

注意!!!!!

sm.ms圖床有限制

  • 一分鍾10張
  • 一小時20張
  • 一星期50張

所以,,, 白嫖不了了。。。

其實是可以的 只是需要改造一下...

加一個代理池

但是 還是默默的 換成自己的把

分析博客園上傳圖片接口

博客園有三種編輯器,其中markdown 編輯器和tinyMCE 編輯器可以上傳圖片

  1. 首先分析一下接口,在拖入圖片之后會請求一個接口,上傳文件,但是我用python 仿照他請求之后一直返回500錯誤。另一個編輯器使用的接口也是不可用的。
  2. 最后折騰了三四個小時發現它在服務端設置了禁止跨域.... 我早該想到的 !
  3. 所以不能使用這種方式了,但是已有的.net 工具是怎么實現的呢?應該是官方發布的吧。不然登錄驗證怎么做

尋找圖床

既然博客園是不能上傳圖片了,那就需要找一個圖床,需求就是特別穩定,據說新浪圖床還炸了。找了之后有三個圖床。

  • sm.ms
  • 路過圖床
  • 中關村的圖片上傳接口
  • 找到的其他接口都需要登錄才行,所以不好使
  1. 簡單分析之后,決定使用sm.ms ,因為這個網址沒有對接口做演示,且官方也放出了api,並且也沒有什么限制
  2. 上傳文件之后它請求了這個接口

image-20200228114035021

  1. 並且返回了一個json 數據是圖片的url (這么老實的圖床,感覺白嫖的良心痛,但是也不能一直白嫖吧)
  2. 寫了python 代碼測試了一下接口,確實可用
import requests as rq
import json

# 傳入圖片名 返回圖床url
def uploadImg(imgname):
    url = 'https://sm.ms/api/v2/upload?inajax=1'
    headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 Edg/80.0.361.62',
    }

    files = [('smfile',(imgname,open(imgname, 'rb'),'image/png'))]
    r = rq.post(url,headers=headers,files=files)
    dic = json.loads(r.text)
    print(r.text)
    try:
        if 'data' in dic:
            return dic['data']['url']
        elif 'code' in dic:
            if dic['code'] == 'image_repeated':
                return dic['images']
        else:
            print(r.text)
            exit()
    except Exception as e:
        print(str(e))
        exit()

print(uploadImg('2.png'))

  1. 那后面就是,正則匹配圖片鏈接,然后,通過上面的自定義函數得到圖片在圖床的url,再替換到md文件中即可
  2. 最后效果

image-20200228114705882

  1. 此時文件中的鏈接被替換成了圖床鏈接,這時候文檔復制到哪里都行了,不過為了防止圖床炸掉,還是在本地保存了一份 (將typroa 圖片設置為復制到文檔同目錄就好了)
  2. 最后貼出全部代碼
import requests as rq
from bs4 import BeautifulSoup
import sys
import re
import json

def uploadImg(imgname):
    url = 'https://sm.ms/api/v2/upload?inajax=1'
    headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 Edg/80.0.361.62',
    }

    files = [('smfile',(imgname,open(imgname, 'rb'),'image/png'))]
    r = rq.post(url,headers=headers,files=files)
    dic = json.loads(r.text)
    try:
        if 'data' in dic:
            return dic['data']['url']
        elif 'code' in dic:
            if dic['code'] == 'image_repeated':
                return dic['images']
        else:
            print(r.text)
            exit()
    except Exception as e:
        print(str(e))
        exit()

def getImgStr(str_):
    pattern = re.compile(r'\!\[.*?]\(.*?\)')
    return pattern.findall(str_)

def getImgName(img_str):
    pattern = re.compile(r'\(.*.\)')
    return pattern.findall(img_str)[0][1:-1]

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('請傳遞參數進來'+str(len(sys.argv)))
        exit()
    md_filename = sys.argv[1]
    md_str = ''
    with open(md_filename,'r',encoding='utf-8') as f:
        md_str = str(f.read())

    img_strs = getImgStr(md_str)
    for img_str in img_strs:
        img_name = getImgName(img_str)
        img_url = uploadImg(img_name)
        md_str = md_str.replace(img_name,img_url)
        print(img_url)

    with open('修正_'+md_filename,'w',encoding='utf-8') as f:
        f.write(md_str)

  1. 最后再通過pyingtaller 打包成exe 然后放到系統變量path所指向的目錄下就行了。下次編輯文檔,在md文檔所在處,地址欄輸入cmd 然后執行命令 up_img 文檔名.md 就可以完成圖片上傳替換

額外的

​ 雖然圖片不能上傳到博客園,但是解析接口的時候發現了些比較詭異的事情。

TinyMCE編輯器所使用的圖片接口,上傳之后沒有返回任何東西,但是圖片卻加載進來了,我死活不相信這么玄學的事情,分析了js代碼之后,確實看到了對接收結果的處理,但是瀏覽器調試工具就是不顯示返回結果。

​ 最后使用fiddler 抓包,終於發現了數據

image-20200228115610372

​ 顯然是加密的,但是如何做到 dev-tool不顯示,還真的不知道的騷操作

​ 雖然圖床可用,但是終究放心不下,最終准備使用七牛雲,畢竟免費送10G空間流量的不是...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM