SiYuan Note — SiYuan 笔记
v1.0.0SiYuan Note (思源笔记) API 客户端 - 完整的笔记本、文档和块管理
运行时依赖
版本
SiYuan 重启可能会使用不同的端口。检查当前端口:
安装命令
点击复制技能文档
思源笔记 一个干净的 API 客户端,用于访问思源笔记,通过本地 HTTP API 提供对笔记的访问。 ClawHub:https://clawhub.ai/weiwei2027/siyuan 安装:clawhub install siyuan 版本:1.0.1 前置条件 思源笔记运行并启用 API(设置 → 关于 → API) 思源笔记设置中的 API 令牌 配置 从思源笔记获取 API 令牌:设置 → 关于 → API → 复制令牌 创建/编辑 ~/.openclaw/workspace/skills/siyuan/config.yaml: siyuan: base_url: "http://127.0.0.1:6806" # 检查思源笔记设置中的实际端口 token: "你的 API 令牌" # 粘贴你的令牌 timeout: 30 retry: 3 注意:思源笔记可能在重启后使用不同的端口(默认 6806,但可能是 34669 等)。请在思源笔记设置中检查当前端口。 Python 客户端 API 初始化客户端 from siyuan_client import SiYuanClient # 使用 config.yaml 设置 client = SiYuanClient() # 或显式配置 client = SiYuanClient( base_url="http://127.0.0.1:6806", token="你的令牌" ) 系统操作 # 获取系统版本 version = client.system_version() print(f"思源笔记 v{version}") # 获取当前时间 timestamp = client.current_time() 笔记本操作 # 列出所有笔记本 notebooks = client.list_notebooks() for nb in notebooks: print(f"{nb['name']}: {nb['id']}") # 创建新笔记本 new_nb = client.create_notebook("我的新项目") # 打开/关闭笔记本(加载/卸载到内存) client.open_notebook("笔记本 ID") client.close_notebook("笔记本 ID") # 重命名笔记本 client.rename_notebook("笔记本 ID", "新名称") # 获取/设置笔记本配置 conf = client.get_notebook_conf("笔记本 ID") client.set_notebook_conf("笔记本 ID", {"dailyNoteSavePath": "/daily"}) # 删除笔记本 client.remove_notebook("笔记本 ID") 文档操作 # 导出文档为 Markdown result = client.export_md_content("文档 ID") print(result['hPath']) # 人类可读路径 print(result['content']) # Markdown 内容 # 创建新文档 new_doc = client.create_doc_with_md( notebook_id="笔记本 ID", path="文件夹/文档名称", # 支持嵌套路径 markdown="# 标题\n\n内容" ) # 重命名文档 client.rename_doc("笔记本 ID", "/旧路径", "新标题") client.rename_doc_by_id("文档 ID", "新标题") # 获取文档路径 hpath = client.get_hpath_by_id("文档 ID") # 人类可读路径 path_info = client.get_path_by_id("文档 ID") # 存储路径 ids = client.get_ids_by_hpath("笔记本 ID", "/人类可读路径") # 移动文档按 ID client.move_docs_by_id( doc_ids=["文档 ID 1", "文档 ID 2"], to_id="目标笔记本或文档 ID" ) # 移动文档按路径 client.move_docs( from_paths=["/路径/文档1.sy", "/路径/文档2.sy"], to_notebook="目标笔记本 ID", to_path="/子文件夹" ) # 删除文档按笔记本和路径 client.remove_doc("笔记本 ID", "/路径/文档.sy") # 删除文档按 ID client.remove_doc_by_id("文档 ID") 块操作 # 在特定位置插入块 blocks = client.insert_block( data_type="markdown", data="## 新节\n\n一些内容", parent_id="文档 ID", # 可选:父块/文档 previous_id="块 ID", # 可选:插入在此块之后 next_id="块 ID" # 可选:插入在此块之前 ) # 在文档开头添加块 blocks = client.prepend_block( data_type="markdown", data="# 标题\n", parent_id="文档 ID" ) # 在文档末尾添加块 blocks = client.append_block( data_type="markdown", data="\n---\n页脚", parent_id="文档 ID" ) # 更新块内容 client.update_block( data_type="markdown", data="更新内容", block_id="块 ID" ) # 删除块 client.delete_block("块 ID") # 移动块 client.move_block( block_id="块 ID", previous_id="目标块 ID", # 可选:插入在此块之后 parent_id="父块 ID" # 可选:设置父块(至少需要一个) ) # 折叠/展开块 client.fold_block("块 ID") client.unfold_block("块 ID") # 转移块引用 client.transfer_block_ref( from_id="源块 ID", to_id="目标块 ID", ref_ids=["引用 1", "引用 2"] # 可选:转移特定引用 ) # 获取块的 Kramdown 格式 kramdown = client.get_block_kramdown("块 ID") # 获取子块 children = client.get_child_blocks("容器块 ID") for child in children: print(f"{child['type']}: {child['content'][:50]}") 块属性 # 设置块的自定义属性 client.set_block_attrs("块 ID", { "自定义键": "值", "自定义优先级": "高", "自定义状态": "完成" }) # 获取块的所有属性 attrs = client.get_block_attrs("块 ID") print(attrs.get("自定义键")) 资产 # 上传资产文件 result = client.upload_asset( file_paths=["/路径/图像.png", "/路径/文档.pdf"], assets_dir_path="/资产/" ) print(result['succMap']) # 成功上传的文件 print(result['errFiles']) # 失败的上传 SQL 操作 # ...