搭建笔记体系—自动上传笔记

感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请 支持LIncol29! 为了让我能够继续创作更好的内容,你也可以选择订阅博客的 VIP ,包年VIP仅需10元/年,所有VIP内容免费观看

前言

  1. 使用语雀记录个人笔记
  2. 整理笔记,使用Typora写一份草稿,将图片转换为本地的相对路径。
  3. 将写好的完整版笔记所有图片上传至图床,命名为xxx笔记 - 图床版本
  4. xxx笔记 - 图床版本的内容拷贝粘贴到我的个人博客

这种方式,可能一开始还好。毕竟文章数量少,更新维护起来没有那么麻烦。

随着文章数量增多,这个步骤会越来越繁琐。

这时候我就在追求一种方法,可以自动将笔记上传至个人博客

准备工作

在使用这个笔记体系前,我已经准备好。

搭建笔记体系

  • 我还是会使用语雀来写笔记,因为我有多端写笔记的需求。大家可以使用自己喜欢的笔记软件,不用和我一样
  • 将写好的笔记复制粘贴到typora中, 注:这里我选择将图片上传到图床,不在保存到本地(这也是为什么我强调需要经常备份的原因)
  • 使用大佬写好的脚本进行上传,这里我使用的是Bensz – 苯苯 开发的插件 m2w

使用m2w

参数说明:

  • domain: WordPress 站点的域名
  • username: WordPress 账户
  • application_password: 应用程序密码(推荐),与 password 二选一即可。获取方式见下文开启 REST API
  • password: 账户密码,与 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头

img

更改题目

一般建议题目在上传前就确定好。如果你真的需要更改一篇文章的题目,建议遵循以下步骤:

  • 去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.

报错

img

但是仍然报错,找不到此模块

img

可以看到python和pip已经安装好,m2w的资源也已经满足。

img

最后通过where python命令发现有多个python解释器,这个F盘是之前很久下载pycharm自带的环境。因为python不知道使用哪个解释器,就默认使用的F盘这个,导致m2w无法识别到。因为不在同一个环境中。

img

最后解决完错误,给我来了一个???

img

创作不易,如果您觉得有帮助,请支持LIncol29!
如有需要,请至网站地图学习本博客的教程
博客订阅:通过RSS或关注公众号[Lincol的编程世界] | 广告招租与合作请留言
本文链接:https://www.lincol29.cn/use-m2w
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议转载请注明文章地址及作者哦~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇