当前位置: 首页 > news >正文

【Nodebb系列】Nodebb笔记写入方案

NodeBB写入方案

前言

最近在整理以前记录的碎片笔记,想把它们汇总到NodeBB中,方便管理和浏览。但是笔记内容有点多,并且用发帖的形式写到NodeBB中会丢失时间信息,因此整理了一套NodeBB写入方案,大致流程如下:

  1. 建立标准笔记格式
  2. 导出原始笔记,并编写脚本将笔记内容转换为标准格式
  3. 本地搭建NodeBB,修改时间戳相关字段,使得可以进行时间戳写入
  4. 在本地NodeBB写入标准笔记内容
  5. 将本地笔记内容导出,并在云端进行恢复

注:本帖仅适用于纯文本的笔记带时间写入NodeBB

1、标准笔记格式

关键API字段(NodeBB开发文档

create a new topic/posthttps://try.nodebb.org/api/v3/topics/{tid}

get a topic/gethttps://try.nodebb.org/api/v3/topics/{tid}

reply to a topic/posthttps://try.nodebb.org/api/v3/topics/{tid}

get a post/gethttps://try.nodebb.org/api/v3/posts/{pid}

edit a post/puthttps://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()

相关文章:

  • DDPM理论基础解析
  • 使用chainlit出现【无法访问服务器】或【Could not reach the server.】解决方案
  • Redis的主从复制
  • 解码AI大脑:Claude的思维显微镜与语言炼金术
  • 数学知识——矩阵乘法
  • 牛客KY222 打印日期
  • Spring Boot 3.5新特性解析:自动配置再升级,微服务开发更高效
  • 【设计模式】模板模式
  • LeetCode详解之如何一步步优化到最佳解法:26. 删除有序数组中的重复项
  • 解决leetcode第3510题移除最小数对使数组有序II
  • Flutter性能优化终极指南:从JIT到AOT的深度调优
  • 视频孪生赋能交警构建“空地一体“智慧交管体系的创新实践
  • leetcode797图论-对邻接矩阵和邻接表不同形式进行dfs与bfs遍历方法
  • 【C++差分数组 树上倍增】P6869 [COCI2019-2020#5] Putovanje|普及+
  • 电影舆情分析可视化平台管理端实现
  • Redisson的RedLock与联锁(MultiLock)的区别
  • 手持式RFID读写器对比固定式读写器的差异优势
  • Mathwork Platform - Matlab Help Center - Concept and Application
  • 前端面试宝典---数据类型
  • Redis基础指令(Windows)
  • 武汉建设网站/天津网络关键词排名
  • 做网站用什么语言最好/百度广告搜索推广
  • 政府网站集约化建设背景/做推广网络
  • 桂林网站制作培训学校/怎么进行推广
  • 网站首页包括哪些内容/郑州网站策划
  • 哪个网站上可以做初中数学题/优化电脑的软件有哪些