感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请 支持LIncol29! 为了让我能够继续创作更好的内容,你也可以选择订阅博客的 VIP ,包年VIP仅需10元/年,所有VIP内容免费观看
前言
- 使用语雀记录个人笔记
- 整理笔记,使用Typora写一份草稿,将图片转换为本地的相对路径。
- 将写好的完整版笔记所有图片上传至图床,命名为
xxx笔记 - 图床版本
- 将
xxx笔记 - 图床版本
的内容拷贝粘贴到我的个人博客
这种方式,可能一开始还好。毕竟文章数量少,更新维护起来没有那么麻烦。
随着文章数量增多,这个步骤会越来越繁琐。
这时候我就在追求一种方法,可以自动将笔记上传至个人博客
准备工作
在使用这个笔记体系前,我已经准备好。
-
稳定的域名(至少后续不会再次发生变化)例如我的图床域名:
imgae.lincol29.cn
-
使用docker自建图床,我使用的是chevereto。你也可以自行选择其他的。例如:
-
EasyImage GitHub – icret/EasyImages2.0: 简单图床 – 一款功能强大无数据库的图床 2.0版
-
chevereto图床(自用)lincol29
-
一台服务器 注:需经常备份图床,以防图片丢失 可使用备份脚本或者docker容器
搭建笔记体系
- 我还是会使用语雀来写笔记,因为我有多端写笔记的需求。大家可以使用自己喜欢的笔记软件,不用和我一样
- 将写好的笔记复制粘贴到typora中, 注:这里我选择将图片上传到图床,不在保存到本地(这也是为什么我强调需要经常备份的原因)
- 使用大佬写好的脚本进行上传,这里我使用的是Bensz – 苯苯 开发的插件
m2w
使用m2w
参数说明:
domain
: WordPress 站点的域名username
: WordPress 账户application_password
: 应用程序密码(推荐),与password
二选一即可。获取方式见下文开启 REST APIpassword
: 账户密码,与application_password
二选一即可,如果二者共存,优先使用 REST API。path_markdown
: 包含 markdown 文本的文件夹,可以有多个。post_metadata/path_legacy_json
: 不了解怎么设置的默认即可。
创建脚本 myblog.py
,这里有一个示例,需要将 path_m2w
修改为 config
文件夹所在的路径。
path_m2w = '<path02>' # config文件夹的路径
准备工作完成后,直接运行这个命令即可:
python <path01>/myblog.py
python “E:/note-md/自动化上传笔记至wordpress工具/m2w/myblog.py”
m2w的应用程序密码 : 1e8s bj3K 8M80 7AEh XnGk 18UA
使用m2w上传笔记到Wordpress博客
在公司安装pip以及m2w,可能会因为公司代理的原理,导致报错。关闭公司网络,使用自己的热点即可。
https://github.com/huangwb8/m2w/blob/main/README.zh-CN.md
json在线格式工具
https://jsonlint.com/
yaml头
和1.0版本一样,m2w 2支持在markdown文件添加yaml头。如下所示:
---
category: [docker]
tag: [wordpress, docker]
status: publish
---
其中category代表分类(一般是1个,但也可以多个),它在某些情况下参与文章默认链接的构成。tag代表标签(可有多个),status代表文章状态(publish发布/draft草稿/private隐私)。
添加yml头
更改题目
一般建议题目在上传前就确定好。如果你真的需要更改一篇文章的题目,建议遵循以下步骤:
- 去WordPress后台更改为新题目
- 在本地Markdown里将文件名改为新题目.md
- 运行m2w。由于force_upload=False(默认值),所以该文章并不会上传;但是在legacy*.json中却留下了记录
- 新题目.md有更改内容时,会自动更新内容
myblog.py
注意:与m2w 2的旧myblog.py在内容上有很大变动,并不互通。
在m2w 2.5中,一些比较重要的参数定义在myblog.py里。实际上,m2w 2.5只提供基础函数;正式工作时是通过类似myblog.py的脚本来完成的。我认为,这样可以给高级用户充分的自由去定义m2w的使用。
下面是一些比较重要的参数:
- path_m2w:字符型。指定元数据(即config文件夹)的路径,它通常包含1个user.json和系列legacy_*.json。
- force_upload:布尔型。如果WordPress已经存在一个名为a的文章,是否强制上传本地一个名为a的markdown文件。默认force_upload = False,这样则不会为同题目的文章分配多个ID,因为它们往往是同一个文件。
- verbose:布尔型。是否显示工作报告。默认verbose = True。不喜欢关注工作细节的小伙伴可以设置verbose = False。
- last_update_time_change:布尔型。仅适用于REST API模式。是否在更新文章时强制更新文章的发布日期。默认值为False。如果你希望更新文章后会排在最前列(时间倒序),你应该设置为True。
- max_retries:正整型。如果由于网络波动等原因导致上传/更新失败,重新尝试的最大次数。默认值为10。
在将文件上传到wordpress之前,自动将图片上传到图床
无法加载二级目录,有这个需要
# -*- coding: utf-8 -*-
# @Time : 2022/12/03 16:42
# @Author : huangwb8; Suzuran
# @File : myblog.py
# @Function: Update an existing post in WordPress with a local Markdown file
# @Software: VSCode
# @Reference: original
# ===============================Dependency
from m2w import read_json_as_dict, up
import sys
import asyncio
import time
import yaml # Ensure pyyaml is installed
# ===============================Parameters
# Please adjust the parameters according to the actual situation.
# m2w version: 2.5.7+
# The path of the config folder, where contains user.json and legacy*.json
path_m2w = "E:/note-md/自动化上传笔记至wordpress工具/m2w"
# Whether to force uploading a new post.
# `force_upload=False` is suggested for routine maintaining.
# `force_upload=True` is suggested for intensive uploading for a brand-new site.
force_upload = False
# Whether to report running messages.
verbose = True
# Whether to update the last update time of the post. Only work in REST API mode.
last_update_time_change = False
# Retry time when meeting failure
max_retries = 10
# ===============================Program
def process_categories(categories):
if isinstance(categories, list) and len(categories) > 1:
parent = categories[0]
child = categories[1]
return parent, child
return categories[0], None
async def main():
path_user_json = path_m2w + "/config/user.json"
websites = read_json_as_dict(path_user_json)
for i in websites:
# Select a WordPress website
website = websites[i]
# Parameters of the website
domain = website["domain"]
username = website["username"]
path_markdown = website["path_markdown"]
post_metadata = website["post_metadata"]
path_legacy_json = path_m2w + website["path_legacy_json"] + "_" + i + ".json"
# Whether use REST API mode
use_rest_api = (
"application_password" in website
and len(website["application_password"]) > 10
)
if not use_rest_api and "password" not in website:
print("API or password are missing. Please add one of them. Stop m2w!")
sys.exit(0)
elif not use_rest_api and "password" in website:
rest_api = False
application_password = None
password = website["password"]
elif use_rest_api and "password" in website:
print(
"Warning: You have REST API. Password would be ignored. You can remove password in the 'user.json' to make the use of m2w safer!"
)
rest_api = True
application_password = website["application_password"]
password = None
else:
rest_api = True
application_password = website["application_password"]
password = None
# Process categories from YAML
with open(path_markdown[0], 'r', encoding='utf-8') as file:
content = file.read()
yaml_content = content.split('---')[1]
metadata = yaml.safe_load(yaml_content)
categories = metadata.get("categories", [])
parent_category, sub_category = process_categories(categories)
if sub_category:
print(f"Uploading to parent category '{parent_category}' and sub-category '{sub_category}'")
else:
print(f"Uploading to category '{parent_category}'")
# Connect the WordPress website
print("========Website: " + i)
await up(
# The path of files
path_markdown=path_markdown,
path_legacy_json=path_legacy_json,
# Website data
domain=domain,
username=username,
password=password,
application_password=application_password,
post_metadata=post_metadata,
# Parameters
last_update_time_change=last_update_time_change,
force_upload=force_upload,
verbose=verbose,
rest_api=rest_api,
max_retries=max_retries
)
if __name__ == "__main__":
start = time.time()
asyncio.run(main())
end = time.time()
print(f"All done! Total time : {round(end - start, 3)}s")
草稿无法更新,只有发表的可以更新
FAILURE to find the post. Please check your User Configuration and the title in your WordPress.
报错
但是仍然报错,找不到此模块
可以看到python和pip已经安装好,m2w的资源也已经满足。
最后通过where python命令发现有多个python解释器,这个F盘是之前很久下载pycharm自带的环境。因为python不知道使用哪个解释器,就默认使用的F盘这个,导致m2w无法识别到。因为不在同一个环境中。
最后解决完错误,给我来了一个???