【Nodebb系列】Nodebb笔记写入方案
NodeBB写入方案
前言
最近在整理以前记录的碎片笔记,想把它们汇总到NodeBB中,方便管理和浏览。但是笔记内容有点多,并且用发帖的形式写到NodeBB中会丢失时间信息,因此整理了一套NodeBB写入方案,大致流程如下:
- 建立标准笔记格式
- 导出原始笔记,并编写脚本将笔记内容转换为标准格式
- 本地搭建NodeBB,修改时间戳相关字段,使得可以进行时间戳写入
- 在本地NodeBB写入标准笔记内容
- 将本地笔记内容导出,并在云端进行恢复
注:本帖仅适用于纯文本的笔记带时间写入NodeBB
1、标准笔记格式
关键API字段(NodeBB开发文档)
create a new topic/post
:https://try.nodebb.org/api/v3/topics/{tid}
get a topic/get
:https://try.nodebb.org/api/v3/topics/{tid}
reply to a topic/post
:https://try.nodebb.org/api/v3/topics/{tid}
get a post/get
:https://try.nodebb.org/api/v3/posts/{pid}
edit a post/put
:https://try.nodebb.org/api/v3/posts/{pid}
关键字段及生成规则
标题(title):帖子标题,可为空
正文(content):帖子正文内容,笔记的核心部分,不可为空
时间(time):帖子的创建时间,格式为2025-04-08 15:32:00
,拼接已知时间和当前时间,为空时默认当前时间,避免时间戳重复
时间戳(timestamp):帖子创建时间的时间戳,格式为1744097860750
毫秒级时间戳,根据time字段自动生成
标签(tags):帖子标签,格式为标签1,标签2,...
,中间使用英文逗号分隔,可为空
话题(topic):帖子所属话题,自定义生成,可为空
分类(category):话题所属类别,自定义生成,可为空
{
"title": "...",
"content": "...",
"raw_content": "...",
"time": "2021-07-13 04:27:59",
"timestamp": 1626121679512,
"tags": "..., ..., ...",
"topic": "...",
"category": "..."
}
2、笔记导出及格式标准化
在NodeBB中的权利与许可界面,导出个人资料(包含tid和title),帖子(包含帖子正文)
编写脚本将碎片笔记转换为标准格式
在原始笔记内容中,大部分只有正文内容(content)、话题(topic)、时间(time)字段,其他字段都是缺失的,自己一条条添加比较费劲,这里就直接调用本地部署的Deepseek生成一下了,完整的脚本如下。
# !/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@FileName: transmat.py
@Author: zhifeix
@Email: kforum@163.com
@Description: Stream processing and saving with resume capability
@Date: 2025/4/8 16:28
"""
import csv
import json
import requests
import re
from datetime import datetime
import os
# 日志文件,用于记录处理的序号
LOG_FILE = "processing_log.txt"
def parse_timestamp(timestamp_str):
now = datetime.now()
# 如果传入空字符串,直接返回当前时间
if not timestamp_str or not isinstance(timestamp_str, str):
return now.strftime("%Y-%m-%d %H:%M:%S"), int(now.timestamp() * 1000)
# 清理时间字符串
time_str = timestamp_str.replace("T", " ").replace("Z", "").strip()
# 定义支持的格式及其解析方式
formats = [
(r"\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}", "%Y-%m-%d %H:%M:%S"), # 年月日时分秒
(r"\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}", "%Y-%m-%d %H:%M"), # 年月日时分
(r"\d{4}-\d{2}-\d{2}", "%Y-%m-%d"), # 年月日
(r"\d{4}-\d{2}", "%Y-%m"), # 年月
(r"\d{4}", "%Y"), # 年
(r"\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}:\d{2}", "%Y/%m/%d %H:%M:%S"), # 年/月/日 时:分:秒
(r"\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}", "%Y/%m/%d %H:%M"), # 年/月/日 时:分
(r"\d{4}/\d{2}/\d{2}", "%Y/%m/%d"), # 年/月/日
(r"\d{6}", lambda s: datetime.strptime(f"20{
s[:2]}-{
s[2:4]}-{
s[4:]}", "%Y-%m-%d")), # YYMMDD
(r"\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+", "%Y-%m-%d %H:%M:%S.%f"), # ISO 带微秒
]
# 尝试每种格式
for pattern, fmt in formats:
try:
match = re.search(pattern, time_str)
if match:
matched_str = match.group(0)
# 如果是特殊格式(例如 YYMMDD),使用 lambda 函数处理
if callable(fmt):
dt = fmt(matched_str)
else:
dt = datetime.strptime(matched_str, fmt)
# 补全缺失的字段
if "%H" not in fmt:
dt = dt.replace(hour=now.hour, minute=now.minute, second=now.second)
elif "%M" not in fmt:
dt = dt.replace(minute=now.minute, second=now.second)
elif "%S" not in fmt:
dt = dt.replace(second=now.second)
return dt.strftime("%Y-%m-%d %H:%M:%S"), int(dt.timestamp()