在服务器上部署一个自动更新的hexo博客(二)自动部署更新

First Post:

Last Update:

Word Count:
802

Read Time:
3 min

前言

在实际使用中,hexo博客每次更新完文章都得手动更新,挺麻烦的,那么有没有办法能写完文章后自动同步到前端页面呢?有的,而且很简单,利用脚本即可达到需要的效果。

原理

这个功能的原理其实十分简单,但是不同的语言实现起来复杂度不一样,合理使用编程语言才能达到简单易用的目的。
这是一个简单讲述原理的流程图:

graph LR 遍历特定文件目录 --> 记录文件的md5 记录文件的md5 --> 循环遍历判断md5值是否变化 循环遍历判断md5值是否变化 -->|是| 运行更新脚本 循环遍历判断md5值是否变化 -->|否| 循环遍历判断md5值是否变化

从流程图上看,原理很简单,但其实坑挺多的。总结下来有以下几点:

  1. 遍历文件夹取得正确文件路径的方式
  2. 文件MD5的计算
  3. 文件位置变动导致数据无效后清除占用的内存空间

解决这三个问题之后,就可以很轻松的把这个更新程序写出来了。

代码实现

这里使用简单易用的Python来实现这个功能,也可以使用PHP、CPP等其他语言来实现。

PYTHON 共 55 行
展开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# autoUpdate.py
import os # 文件读写
import hashlib # 用来计算md5
import time # 中断和定时

if __name__ == '__main__': # 可以看作是python的主函数
pdir = "/path/to/blog/source/" # 递归搜索的根目录
jsondict = {} # 存储路径和对应md5的字典

month = time.localtime().tm_mon # 记录程序开始运行的月份

# 初始化

for root, dirs, files in os.walk(pdir): # 在目录树中游走输出在目录中的文件名
for f in files:
md5 = hashlib.md5() # 初始化md5处理
paths = os.path.join(root, f) # 构建文件完整路径
if os.path.isfile(paths): # 判断是否是文件
with open(paths, "rb") as fob:
while True:
data = fob.read(4096) # 循环分块读取文件内容,避免文件过大超过内存上限
if not data:
break
md5.update(data) # 循环计算md5并合并
fob.close() # 关闭文件流
jsondict[paths] = md5.hexdigest() # 将md5和对应的路径存入字典

print(jsondict)

# 循环进行文件检测

while True:
for root, dirs, files in os.walk(pdir):
for f in files:
md52 = hashlib.md5()
paths = os.path.join(root, f)
if os.path.isfile(paths):
with open(paths, "rb") as fob:
while True:
data = fob.read(4096)
if not data:
break
md52.update(data)
fob.close()
m = md52.hexdigest()
if paths not in jsondict or jsondict[paths] != m: # 判断以前是否存在过这个文件或文件的md5是否改变
print("fileChanged: " + paths + ",md5 = " + m)
# 这里可以插入文件更新后想要执行的任何代码
jsondict[paths] = m # 更新文件的md5

# 清理过期文件
if not time.localtime().tm_mon == month: # 判断当前时间是否和启动时间不是同个月份
del jsondict # 删掉整个字典
jsondict = {} # 重新创建字典
time.sleep(30) # 每30s检查一次

这里只是一个简单的本博客正在使用的更新脚本,肯定还有不够完美的地方,欢迎来更新。