利用 github 和 python3 以及 MWeb 打造自己的博文圖床

這兩天一直在糾結圖床的問題,因為用自己的服務器來做圖床這個事情我考慮再三,覺得比較不靠譜-_-|||,因為我的服務器只是一個小小的低配服務器,用來當自己的博客圖床本來這個問題不大,但是我的博文基本都是在 csdn 上,流量還是頗為可觀的。把自己的服務器給搞垮了,那可是吃不消的一件事情。

雖然之前考慮過用 github 來做自己的圖床,但是考慮兩個問題,一個是國內訪問速度較慢,另一個則是 github 作為全球最大的同性交流平臺,我不忍心把它當成一個圖床來使用。

不過這不是最近被微軟收購了麼,微軟這麼財大氣粗的,應該不在乎我把它當成圖床了吧。

說幹就幹,還是先釐清思路。

釐清把 github 當圖床的思路

  1. 在 github 新建一個項目,存放圖片,以及自己的博文。
  2. 本地搞一個 python3 的服務,將圖片用規律存儲到本地。
  3. MWeb 的相關想法。
  4. 將圖片全部存放在本地,和自己的博文存放在一起。
  5. 用 MWeb 寫博文的時候,圖片用其自帶的圖床管理 api 將圖片存放到本機目錄。
  6. 由於 github 的圖片路徑是有規律的,所以計算出來最終路徑,直接保存到博文當中。
  7. 用 git 將文章和圖片全部推到倉庫,然後就啥都可以了。

python 腳本撰寫以及啟動

在上一篇博文《打造一個私人圖床服務器》中,我們已經完成了一個圖床的腳本,這裡只要適當修改就可以了。其實就是刪除一些代碼就可以了。

main_upimg.py 主程序代碼

#!/usr/bin/env python3# -*- coding: UTF-8 -*-from sanic import Sanicfrom sanic.response import json, text, fileimport os, sysimport hashlibapp = Sanic()baseDir = '/Users/fungleo/Documents/Blog/articles/image/'# 成功以及失敗的返回腳本def ok(data): return json({"data": data, "status": 0})def fail(data): return json({"data": data, "status": 1})# 字節碼轉16進制字符串def bytes2hex(bytes): hexstr = u"" for i in range(10): t = u"%x" % bytes[i] if len(t) % 2: hexstr += u"0" hexstr += t return hexstr.lower()# 根據16進制字符串獲取文件後綴def getSuffix(hexStr): SUPPORT_TYPE = { 'ffd8ffe000104a464946':'jpg', '89504e470d0a1a0a0000':'png', '47494638396126026f01':'gif', } for i in SUPPORT_TYPE: if i == hexStr: return SUPPORT_TYPE[i] return 'error type'# 上傳文件接口@app.route('/upimg', methods=['POST'])async def upimg(request): # 判斷參數是否正確 if not request.files and not request.files.get('file'): return fail('error args') image = request.files.get('file').body # 判斷文件是否支持 imageSuffix = getSuffix(bytes2hex(image)) if 'error' in imageSuffix: return fail(imageSuffix) # 組織圖片存儲路徑 m1 = hashlib.md5() m1.update(image) md5Name = m1.hexdigest() saveDir = baseDir + md5Name[0:2] + '/' savePath = saveDir + md5Name[2:] + '.' + imageSuffix resPath = '/' + md5Name[0:2] + '/' + md5Name[2:] + '.' + imageSuffix # 如果文件夾不存在,就創建文件夾 if not os.path.exists(saveDir): os.makedirs(saveDir) # 將文件寫入到硬盤 tempFile = open(savePath, 'wb') tempFile.write(image) tempFile.close() # 給客戶端返回結果 return ok({"path": resPath})if __name__ == "__main__": app.run(host="127.0.0.1", port=7000)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

另外這裡,我們還可以對圖片進行縮放,以及添加水印等操作,今天我就不寫了,大家感興趣,回頭可以查看我的 github 倉庫 https://github.com/fengcms/python-learn-demo/tree/master/img-github ,我寫了之後會更新進去的。

MAC\Linux 設置 python 腳本開機啟動

腳本寫好之後,測試一下,沒有問題,我們就可以將服務啟動起來了。

我們可以使用 python3 main_upimg.py 啟動腳本,但是這回打開一個終端窗口,我希望的是,可以在筆記本開機的時候,就把這個腳本啟動起來,然後我隨時想寫腳本,這個服務就在默默的為我提供服務。

想想都感人。

我們可以使用 nohup command & 這樣的命令,來讓服務默默的跑起來,因此,我們的這個命令就是

nohup python3 main_upimg.py &1

但是,這樣還是需要我們啟動電腦之後執行一下,這個事情對於我這種人來說,是不能接受的。所以,我要把它寫成一個開機啟動的腳本。

創建 run.sh 文件,並輸入以下內容,因為不在當前文件夾下運行,所以要加上腳本的全部路徑,如果你也想和我一樣做的話,請把路徑修改為你的路徑。

linux\mac 下面,可以用 pwd 命令來查看當前文件夾的完整路徑

#!/usr/bin/env bash# -*- coding: UTF-8 -*-nohup python3 /Users/fungleo/Sites/python/github/img-github/main_upimg.py &123

新建好文件之後,我們使用 chmod +x run.sh 將其賦予執行權限,然後把它添加到開機運行。

開機運行設置,請查看 mac設置shell腳本開機自啟動,我這裡就不做贅述了。

殺死服務進程

經過上面的配置,我們的腳本就已經非常安靜的在那裡等著我們隨時調用了,呼之即來,非常爽快。

但是,我們如何招之即去呢?其實非常簡單,我們用 ps 這個顯示當前系統的進程狀態,以及配合 kill 命令,則可以很好的管理我們的進程了。

# 查看當前進程ps | grep main_upimg.py# 通過上面的命令,我們可以看到我們的進程號,然後用下面的命令,結束它。kill -9 進程號1234
利用 github 和 python3 以及 MWeb 打造自己的博文圖床

如上配置,主要是圖片的前綴為 https://raw.githubusercontent.com/fengcms/articles/master/image/ 這個地址。其他的都不是特別重要。

最後就是,寫好了博客之後,用 git 把內容以及圖片全部更新到倉庫中,所有的圖片就全部生效了。之後,愛把博文轉發到哪裡去,就發到哪裡去,應該沒有任何問題。

利用 github 和 python3 以及 MWeb 打造自己的博文圖床


分享到:


相關文章: