開始
今天開始嘗試使用
Typora
寫markdown 然后復制到博客園,不過會有一個問題那就是 typroa 插入的圖片都是本地的,md文檔復制到博客園之后,圖片都失效了
通過百度,有工具可以直接把 md 文檔中的圖片上傳到博客園,然后替換文檔中的鏈接,我把工具下載下來之后,發現這東西依賴
.net
,而這個東西好大,所以萌生了自己寫一個工具的想法
注意!!!!!
sm.ms圖床有限制
- 一分鍾10張
- 一小時20張
- 一星期50張
所以,,, 白嫖不了了。。。
其實是可以的 只是需要改造一下...
加一個代理池
但是 還是默默的 換成自己的把
分析博客園上傳圖片接口
博客園有三種編輯器,其中
markdown
編輯器和tinyMCE
編輯器可以上傳圖片
- 首先分析一下接口,在拖入圖片之后會請求一個接口,上傳文件,但是我用python 仿照他請求之后一直返回500錯誤。另一個編輯器使用的接口也是不可用的。
- 最后折騰了三四個小時發現它在服務端設置了禁止跨域.... 我早該想到的 !
- 所以不能使用這種方式了,但是已有的.net 工具是怎么實現的呢?應該是官方發布的吧。不然登錄驗證怎么做
尋找圖床
既然博客園是不能上傳圖片了,那就需要找一個圖床,需求就是特別穩定,據說新浪圖床還炸了。找了之后有三個圖床。
- sm.ms
- 路過圖床
- 中關村的圖片上傳接口
- 找到的其他接口都需要登錄才行,所以不好使
- 簡單分析之后,決定使用sm.ms ,因為這個網址沒有對接口做演示,且官方也放出了api,並且也沒有什么限制
- 上傳文件之后它請求了這個接口
- 並且返回了一個json 數據是圖片的url (這么老實的圖床,感覺白嫖的良心痛,但是也不能一直白嫖吧)
- 寫了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'))
- 那后面就是,正則匹配圖片鏈接,然后,通過上面的自定義函數得到圖片在圖床的url,再替換到md文件中即可
- 最后效果
- 此時文件中的鏈接被替換成了圖床鏈接,這時候文檔復制到哪里都行了,不過為了防止圖床炸掉,還是在本地保存了一份 (將typroa 圖片設置為復制到文檔同目錄就好了)
- 最后貼出全部代碼
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)
- 最后再通過pyingtaller 打包成exe 然后放到系統變量path所指向的目錄下就行了。下次編輯文檔,在md文檔所在處,地址欄輸入cmd 然后執行命令
up_img 文檔名.md
就可以完成圖片上傳替換
額外的
雖然圖片不能上傳到博客園,但是解析接口的時候發現了些比較詭異的事情。
TinyMCE
編輯器所使用的圖片接口,上傳之后沒有返回任何東西,但是圖片卻加載進來了,我死活不相信這么玄學的事情,分析了js代碼之后,確實看到了對接收結果的處理,但是瀏覽器調試工具就是不顯示返回結果。
最后使用fiddler 抓包,終於發現了數據
顯然是加密的,但是如何做到 dev-tool
不顯示,還真的不知道的騷操作
雖然圖床可用,但是終究放心不下,最終准備使用七牛雲,畢竟免費送10G空間流量的不是...