有道笔记更新个人博客

Posted by Bill on January 25, 2024

1. 背景

从最开始搭建博客,是购买海外服务器和域名,开始时需要将仓库拉到本地,本地写完后push到远程仓库,但是由于费用和网速的问题(遇到问题时,需要登录海外服务器调试,前期还需要配置Nginx服务器),于是在近两年将仓库放在了Github上做管理,只需要将域名修改为个人域名即可。但是随着时间的碎片化,没有那么多时间去写长篇的博客,并且写完还是需要像提代码的方式更新博客,于是寻求能否借助第三方笔记客户端,将博客在客户端写,然后自动导出数据,并且更新到Github上。我在很久前使用Leanote蚂蚁笔记来记录,也是多年的充值会员,但是由于Leanote已经多年没有人维护了,在同事的强烈推荐之下,购买了有道笔记的会员,希望能在有道上输出点什么,并能做到同步个人博客的功能。

2. 思路

  1. 有道写博客
  2. 定时运行脚本, dump出原始Markdown文件
  3. 转换脚本,将Markdown文本更新为可被jekyll正确识别的格式
  4. 提交代码到GitHub上
  5. Github自动部署博客内容

2.1 youdaonote-pull

其中最难的地方,是将有道笔记Dump出来,而Github已经有优秀的实现可以做到这点了,可参考: youdaonote-pull

2.2 转换脚本

转换脚本利用python和chatgpt的绝妙搭配,让AI为markdown文件增加yaml头部,从而使得有道的Markdown文档能够转变成jekyll识别的格式,如下所示:

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
56
57
58
59
60
61
#!/usr/bin/python
# -*- coding: utf-8 -*-

import argparse
import yaml

# 设置命令行参数
parser = argparse.ArgumentParser(description="Add a YAML header to a file.")
parser.add_argument("file", help="Path to the input file")
parser.add_argument("--title", help="Title for the YAML header", default="Default Title")
parser.add_argument("--summary", help="summary for the YAML header", default="Default Summary")
parser.add_argument("--author", help="Author for the YAML header", default="Bill")
parser.add_argument("--header-img", help="image for the YAML header", default="img/bill/header-posts/2024-01-24-header.png")
parser.add_argument("--date", help="Date for the YAML header", default="2024-01-25")
parser.add_argument("--catalog", help="set catalog for blog", default=True)
parser.add_argument("--stickie", help="set this blog to the top", default=False)
parser.add_argument("--hide", help="hide this blog?", default=False)
parser.add_argument("--life", help="this blog is for life not tech?", default=False)
parser.add_argument("--guitartab", help="this blog is for guitartab?", default=False)
parser.add_argument("--tags", help="Comma-separated tags for the YAML header", default="")
parser.add_argument("--output", help="Path to the output file", default=None)

# 解析命令行参数
args = parser.parse_args()

# 分割tags字符串成列表
tags_list = args.tags.split(',') if args.tags else []

# 定义YAML header
yaml_header = {
    'layout': 'post',
    'title': args.title,
    'summary': args.summary,
    'date': args.date,
    'author': args.author,
    'header-img': args.header_img,
    'catalog': args.catalog,
    'stickie': args.stickie,
    'hide': args.hide,
    'life': args.life,
    'guitartab': args.guitartab,
    'tags': tags_list
}

yaml_header_str = '---\n' + yaml.dump(yaml_header, allow_unicode=True) + '---\n'

# 读取原始文件内容
with open(args.file, 'r') as file:
    original_content = file.read()

# 合并YAML header和原始内容
new_content = yaml_header_str + original_content

# 输出文件路径
output_path = args.output if args.output else args.file

# 将新内容写入文件
with open(output_path, 'w') as file:
    file.write(new_content)

print(f"YAML header added successfully. Output file: {output_path}")

由此可以通过运行python文件,将输出的文本放置在Github博客仓库中。

对应的shell脚本放置在博客仓库中,如下为对应源码,其内容就是运行python脚本同步最新的有道博客,进行转换,然后有变化时,再push到Github中:

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
#!/bin/bash

echo "start pulling markdown files..."
YOUTDAO_PULL_PATH="$HOME/GitHubs/youdaonote-pull"
BLOG_REPOSITORY_PATH="$HOME/GitHubs/ProgrammerBill.github.io"
INPUT_MD_PATH="$BLOG_REPOSITORY_PATH/youdao_posts"
OUTPUT_BLOG_PATH="$BLOG_REPOSITORY_PATH/_posts/blog/"
ADD_YAML_HEADER_PY="$BLOG_REPOSITORY_PATH/addYamlHeader.py"
DATE=`date +%Y-%m-%d`

echo "pulling markdown files..."
cd $YOUTDAO_PULL_PATH
python pull.py

find $INPUT_MD_PATH -type f -name "*.md" | while read file; do
    echo "Processing $file"
    # 在这里处理每个文件
    title_name=$(basename "$file" .md)
    python $ADD_YAML_HEADER_PY $file --title $title_name --output $OUTPUT_BLOG_PATH/$DATE-$title_name.md
done

cd $BLOG_REPOSITORY_PATH
if git diff-index --quiet HEAD --; then
    echo "no change"
else
    echo "change"
    git add .
    git commit -m "add new blog by auto robot"
    git push origin master
fi
echo "finishied"

2.3 定时执行脚本

使用Ubuntu服务器可以在每小时对博客进行更新,具体需要依赖cron实现,如每小时执行一次,可以这样操作:

1
2
3
4
5
6
# 打开作业
crontab -e
# 将脚本设置为每小时0时0分运行
0 * * * * $HOME/convertYoudaoToBlog.sh
# 退出后,检查是否增加了该任务
crontab -l

现在可以好好体验有道笔记写博客的乐趣了!