siyuan/API_zh_CN.md

1567 lines
29 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[English](https://github.com/siyuan-note/siyuan/blob/master/API.md)
* [规范](#规范)
* [参数和返回值](#参数和返回值)
* [鉴权](#鉴权)
* [笔记本](#笔记本)
* [列出笔记本](#列出笔记本)
* [打开笔记本](#打开笔记本)
* [关闭笔记本](#关闭笔记本)
* [重命名笔记本](#重命名笔记本)
* [创建笔记本](#创建笔记本)
* [删除笔记本](#删除笔记本)
* [获取笔记本配置](#获取笔记本配置)
* [保存笔记本配置](#保存笔记本配置)
* [文档](#文档)
* [通过 Markdown 创建文档](#通过-markdown-创建文档)
* [重命名文档](#重命名文档)
* [删除文档](#删除文档)
* [移动文档](#移动文档)
* [根据路径获取人类可读路径](#根据路径获取人类可读路径)
* [根据 ID 获取人类可读路径](#根据-ID-获取人类可读路径)
* [根据 ID 获取存储路径](#根据-ID-获取存储路径)
* [根据人类可读路径获取 IDs](#根据人类可读路径获取-IDs)
* [资源文件](#资源文件)
* [上传资源文件](#上传资源文件)
* [](#块)
* [插入块](#插入块)
* [插入前置子块](#插入前置子块)
* [插入后置子块](#插入后置子块)
* [更新块](#更新块)
* [删除块](#删除块)
* [移动块](#移动块)
* [折叠块](#折叠块)
* [展开块](#展开块)
* [获取块 kramdown 源码](#获取块-kramdown-源码)
* [获取子块](#获取子块)
* [转移块引用](#转移块引用)
* [属性](#属性)
* [设置块属性](#设置块属性)
* [获取块属性](#获取块属性)
* [SQL](#SQL)
* [执行 SQL 查询](#执行-SQL-查询)
* [提交事务](#提交事务)
* [模板](#模板)
* [渲染模板](#渲染模板)
* [渲染 Sprig](#渲染-Sprig)
* [文件](#文件)
* [获取文件](#获取文件)
* [写入文件](#写入文件)
* [删除文件](#删除文件)
* [重命名文件](#重命名文件)
* [列出文件](#列出文件)
* [导出](#导出)
* [导出 Markdown 文本](#导出-markdown-文本)
* [导出文件与目录](#导出文件与目录)
* [转换](#转换)
* [Pandoc](#Pandoc)
* [通知](#通知)
* [推送消息](#推送消息)
* [推送报错消息](#推送报错消息)
* [网络](#网络)
* [正向代理](#正向代理)
* [系统](#系统)
* [获取启动进度](#获取启动进度)
* [获取系统版本](#获取系统版本)
* [获取系统当前时间](#获取系统当前时间)
---
## 规范
### 参数和返回值
* 端点:`http://127.0.0.1:6806`
* 均是 POST 方法
* 需要带参的接口,参数为 JSON 字符串,放置到 body 里,标头 Content-Type 为 `application/json`
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {}
}
```
* `code`:非 0 为异常情况
* `msg`:正常情况下是空字符串,异常情况下会返回错误文案
* `data`:可能为 `{}`、`[]` 或者 `NULL`,根据不同接口而不同
### 鉴权
在 <kbd>设置 - 关于</kbd> 里查看 API token请求标头`Authorization: Token xxx`
## 笔记本
### 列出笔记本
* `/api/notebook/lsNotebooks`
* 不带参
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"notebooks": [
{
"id": "20210817205410-2kvfpfn",
"name": "测试笔记本",
"icon": "1f41b",
"sort": 0,
"closed": false
},
{
"id": "20210808180117-czj9bvb",
"name": "思源笔记用户指南",
"icon": "1f4d4",
"sort": 1,
"closed": false
}
]
}
}
```
### 打开笔记本
* `/api/notebook/openNotebook`
* 参数
```json
{
"notebook": "20210831090520-7dvbdv0"
}
```
* `notebook`:笔记本 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 关闭笔记本
* `/api/notebook/closeNotebook`
* 参数
```json
{
"notebook": "20210831090520-7dvbdv0"
}
```
* `notebook`:笔记本 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 重命名笔记本
* `/api/notebook/renameNotebook`
* 参数
```json
{
"notebook": "20210831090520-7dvbdv0",
"name": "笔记本的新名称"
}
```
* `notebook`:笔记本 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 创建笔记本
* `/api/notebook/createNotebook`
* 参数
```json
{
"name": "笔记本的名称"
}
```
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"notebook": {
"id": "20220126215949-r1wvoch",
"name": "笔记本的名称",
"icon": "",
"sort": 0,
"closed": false
}
}
}
```
### 删除笔记本
* `/api/notebook/removeNotebook`
* 参数
```json
{
"notebook": "20210831090520-7dvbdv0"
}
```
* `notebook`:笔记本 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 获取笔记本配置
* `/api/notebook/getNotebookConf`
* 参数
```json
{
"notebook": "20210817205410-2kvfpfn"
}
```
* `notebook`:笔记本 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"box": "20210817205410-2kvfpfn",
"conf": {
"name": "测试笔记本",
"closed": false,
"refCreateSavePath": "",
"createDocNameTemplate": "",
"dailyNoteSavePath": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}",
"dailyNoteTemplatePath": ""
},
"name": "测试笔记本"
}
}
```
### 保存笔记本配置
* `/api/notebook/setNotebookConf`
* 参数
```json
{
"notebook": "20210817205410-2kvfpfn",
"conf": {
"name": "测试笔记本",
"closed": false,
"refCreateSavePath": "",
"createDocNameTemplate": "",
"dailyNoteSavePath": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}",
"dailyNoteTemplatePath": ""
}
}
```
* `notebook`:笔记本 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"name": "测试笔记本",
"closed": false,
"refCreateSavePath": "",
"createDocNameTemplate": "",
"dailyNoteSavePath": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}",
"dailyNoteTemplatePath": ""
}
}
```
## 文档
### 通过 Markdown 创建文档
* `/api/filetree/createDocWithMd`
* 参数
```json
{
"notebook": "20210817205410-2kvfpfn",
"path": "/foo/bar",
"markdown": ""
}
```
* `notebook`:笔记本 ID
* `path`:文档路径,需要以 / 开头,中间使用 / 分隔层级(这里的 path 对应数据库 hpath 字段)
* `markdown`GFM Markdown 内容
* 返回值
```json
{
"code": 0,
"msg": "",
"data": "20210914223645-oj2vnx2"
}
```
* `data`:创建好的文档 ID
* 如果使用同一个 `path` 重复调用该接口,不会覆盖已有文档
### 重命名文档
* `/api/filetree/renameDoc`
* 参数
```json
{
"notebook": "20210831090520-7dvbdv0",
"path": "/20210902210113-0avi12f.sy",
"title": "文档新标题"
}
```
* `notebook`:笔记本 ID
* `path`:文档路径
* `title`:新标题
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
通过 `id` 重命名文档:
* `/api/filetree/renameDocByID`
* 参数
```json
{
"id": "20210902210113-0avi12f",
"title": "文档新标题"
}
```
* `id`:文档 ID
* `title`:新标题
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 删除文档
* `/api/filetree/removeDoc`
* 参数
```json
{
"notebook": "20210831090520-7dvbdv0",
"path": "/20210902210113-0avi12f.sy"
}
```
* `notebook`:笔记本 ID
* `path`:文档路径
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
通过 `id` 删除文档:
* `/api/filetree/removeDocByID`
* 参数
```json
{
"id": "20210902210113-0avi12f"
}
```
* `id`:文档 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 移动文档
* `/api/filetree/moveDocs`
* 参数
```json
{
"fromPaths": ["/20210917220056-yxtyl7i.sy"],
"toNotebook": "20210817205410-2kvfpfn",
"toPath": "/"
}
```
* `fromPaths`:源路径
* `toNotebook`:目标笔记本 ID
* `toPath`:目标路径
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
通过 `id` 移动文档:
* `/api/filetree/moveDocsByID`
* 参数
```json
{
"fromIDs": ["20210917220056-yxtyl7i"],
"toID": "20210817205410-2kvfpfn"
}
```
* `fromIDs`:源文档 ID
* `toID`:目标父文档 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 根据路径获取人类可读路径
* `/api/filetree/getHPathByPath`
* 参数
```json
{
"notebook": "20210831090520-7dvbdv0",
"path": "/20210917220500-sz588nq/20210917220056-yxtyl7i.sy"
}
```
* `notebook`:笔记本 ID
* `path`:路径
* 返回值
```json
{
"code": 0,
"msg": "",
"data": "/foo/bar"
}
```
### 根据 ID 获取人类可读路径
* `/api/filetree/getHPathByID`
* 参数
```json
{
"id": "20210917220056-yxtyl7i"
}
```
* `id`:块 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": "/foo/bar"
}
```
### 根据 ID 获取存储路径
* `/api/filetree/getPathByID`
* 参数
```json
{
"id": "20210917220056-yxtyl7i"
}
```
* `id`:块 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": "/20210828150719-r8edxl2/20210917220056-yxtyl7i.sy"
}
```
### 根据人类可读路径获取 IDs
* `/api/filetree/getIDsByHPath`
* 参数
```json
{
"path": "/foo/bar",
"notebook": "20210808180117-czj9bvb"
}
```
* `path`:人类可读路径
* `notebook`:笔记本 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
"20200813004931-q4cu8na"
]
}
```
## 资源文件
### 上传资源文件
* `/api/asset/upload`
* 参数为 HTTP Multipart 表单
* `assetsDirPath`:资源文件存放的文件夹路径,以 data 文件夹作为根路径,比如:
* `"/assets/"`:工作空间/data/assets/ 文件夹
* `"/assets/sub/"`:工作空间/data/assets/sub/ 文件夹
常规情况下建议用第一种,统一存放到工作空间资源文件夹下,放在子目录有一些副作用,请参考用户指南资源文件章节。
* `file[]`:上传的文件列表
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"errFiles": [""],
"succMap": {
"foo.png": "assets/foo-20210719092549-9j5y79r.png"
}
}
}
```
* `errFiles`:处理时遇到错误的文件名
* `succMap`处理成功的文件key 为上传时的文件名value 为 assets/foo-id.png用于将已有 Markdown 内容中的资源文件链接地址替换为上传后的地址
## 块
### 插入块
* `/api/block/insertBlock`
* 参数
```json
{
"dataType": "markdown",
"data": "foo**bar**{: style=\"color: var(--b3-font-color8);\"}baz",
"nextID": "",
"previousID": "20211229114650-vrek5x6",
"parentID": ""
}
```
* `dataType`:待插入数据类型,值可选择 `markdown` 或者 `dom`
* `data`:待插入的数据
* `nextID`:后一个块的 ID用于锚定插入位置
* `previousID`:前一个块的 ID用于锚定插入位置
* `parentID`:父块 ID用于锚定插入位置
`nextID`、`previousID`、`parentID` 三个参数必须至少存在一个有值,优先级为 `nextID` > `previousID` > `parentID`
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "insert",
"data": "<div data-node-id=\"20211230115020-g02dfx0\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong style=\"color: var(--b3-font-color8);\">bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20211230115020-g02dfx0",
"parentID": "",
"previousID": "20211229114650-vrek5x6",
"retData": null
}
],
"undoOperations": null
}
]
}
```
* `action.data`:新插入块生成的 DOM
* `action.id`:新插入块的 ID
### 插入前置子块
* `/api/block/prependBlock`
* 参数
```json
{
"data": "foo**bar**{: style=\"color: var(--b3-font-color8);\"}baz",
"dataType": "markdown",
"parentID": "20220107173950-7f9m1nb"
}
```
* `dataType`:待插入数据类型,值可选择 `markdown` 或者 `dom`
* `data`:待插入的数据
* `parentID`:父块的 ID用于锚定插入位置
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "insert",
"data": "<div data-node-id=\"20220108003710-hm0x9sc\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong style=\"color: var(--b3-font-color8);\">bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20220108003710-hm0x9sc",
"parentID": "20220107173950-7f9m1nb",
"previousID": "",
"retData": null
}
],
"undoOperations": null
}
]
}
```
* `action.data`:新插入块生成的 DOM
* `action.id`:新插入块的 ID
### 插入后置子块
* `/api/block/appendBlock`
* 参数
```json
{
"data": "foo**bar**{: style=\"color: var(--b3-font-color8);\"}baz",
"dataType": "markdown",
"parentID": "20220107173950-7f9m1nb"
}
```
* `dataType`:待插入数据类型,值可选择 `markdown` 或者 `dom`
* `data`:待插入的数据
* `parentID`:父块的 ID用于锚定插入位置
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "insert",
"data": "<div data-node-id=\"20220108003642-y2wmpcv\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong style=\"color: var(--b3-font-color8);\">bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20220108003642-y2wmpcv",
"parentID": "20220107173950-7f9m1nb",
"previousID": "20220108003615-7rk41t1",
"retData": null
}
],
"undoOperations": null
}
]
}
```
* `action.data`:新插入块生成的 DOM
* `action.id`:新插入块的 ID
### 更新块
* `/api/block/updateBlock`
* 参数
```json
{
"dataType": "markdown",
"data": "foobarbaz",
"id": "20211230161520-querkps"
}
```
* `dataType`:待更新数据类型,值可选择 `markdown` 或者 `dom`
* `data`:待更新的数据
* `id`:待更新块的 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "update",
"data": "<div data-node-id=\"20211230161520-querkps\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong>bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20211230161520-querkps",
"parentID": "",
"previousID": "",
"retData": null
}
],
"undoOperations": null
}
]
}
```
* `action.data`:更新块生成的 DOM
### 删除块
* `/api/block/deleteBlock`
* 参数
```json
{
"id": "20211230161520-querkps"
}
```
* `id`:待删除块的 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "delete",
"data": null,
"id": "20211230162439-vtm09qo",
"parentID": "",
"previousID": "",
"retData": null
}
],
"undoOperations": null
}
]
}
```
### 移动块
* `/api/block/moveBlock`
* 参数
```json
{
"id": "20230406180530-3o1rqkc",
"previousID": "20230406152734-if5kyx6",
"parentID": "20230404183855-woe52ko"
}
```
* `id`:待移动块 ID
* `previousID`:前一个块的 ID用于锚定插入位置
* `parentID`:父块的 ID用于锚定插入位置`previousID` 和 `parentID` 不能同时为空,同时存在的话优先使用 `previousID`
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "move",
"data": null,
"id": "20230406180530-3o1rqkc",
"parentID": "20230404183855-woe52ko",
"previousID": "20230406152734-if5kyx6",
"nextID": "",
"retData": null,
"srcIDs": null,
"name": "",
"type": ""
}
],
"undoOperations": null
}
]
}
```
### 折叠块
* `/api/block/foldBlock`
* 参数
```json
{
"id": "20231224160424-2f5680o"
}
```
* `id`:待折叠块的 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 展开块
* `/api/block/unfoldBlock`
* 参数
```json
{
"id": "20231224160424-2f5680o"
}
```
* `id`:待展开块的 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 获取块 kramdown 源码
* `/api/block/getBlockKramdown`
* 参数
```json
{
"id": "20201225220955-l154bn4"
}
```
* `id`:待获取块的 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"id": "20201225220955-l154bn4",
"kramdown": "* {: id=\"20201225220955-2nn1mns\"}新建笔记本,在笔记本下新建文档\n {: id=\"20210131155408-3t627wc\"}\n* {: id=\"20201225220955-uwhqnug\"}在编辑器中输入 <kbd>/</kbd> 触发功能菜单\n {: id=\"20210131155408-btnfw88\"}\n* {: id=\"20201225220955-04ymi2j\"}((20200813131152-0wk5akh \"在内容块中遨游\"))、((20200822191536-rm6hwid \"窗口和页签\"))\n {: id=\"20210131155408-hh1z442\"}"
}
}
```
### 获取子块
* `/api/block/getChildBlocks`
* 参数
```json
{
"id": "20230506212712-vt9ajwj"
}
```
* `id`:父块 ID
* 标题下方块也算作子块
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"id": "20230512083858-mjdwkbn",
"type": "h",
"subType": "h1"
},
{
"id": "20230513213727-thswvfd",
"type": "s"
},
{
"id": "20230513213633-9lsj4ew",
"type": "l",
"subType": "u"
}
]
}
```
### 转移块引用
* `/api/block/transferBlockRef`
* 参数
```json
{
"fromID": "20230612160235-mv6rrh1",
"toID": "20230613093045-uwcomng",
"refIDs": ["20230613092230-cpyimmd"]
}
```
* `fromID`:定义块 ID
* `toID`:目标块 ID
* `refIDs`:指向定义块 ID 的引用所在块 ID可选如果不指定所有指向定义块 ID 的块引用 ID 都会被转移
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
## 属性
### 设置块属性
* `/api/attr/setBlockAttrs`
* 参数
```json
{
"id": "20210912214605-uhi5gco",
"attrs": {
"custom-attr1": "line1\nline2"
}
}
```
* `id`:块 ID
* `attrs`:块属性,自定义属性必须以 `custom-` 作为前缀
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 获取块属性
* `/api/attr/getBlockAttrs`
* 参数
```json
{
"id": "20210912214605-uhi5gco"
}
```
* `id`:块 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"custom-attr1": "line1\nline2",
"id": "20210912214605-uhi5gco",
"title": "PDF 标注双链演示",
"type": "doc",
"updated": "20210916120715"
}
}
```
## SQL
### 执行 SQL 查询
* `/api/query/sql`
* 参数
```json
{
"stmt": "SELECT * FROM blocks WHERE content LIKE'%content%' LIMIT 7"
}
```
* `stmt`SQL 脚本
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{ "列": "值" }
]
}
```
### 提交事务
* `/api/sqlite/flushTransaction`
* 不带参
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
## 模板
### 渲染模板
* `/api/template/render`
* 参数
```json
{
"id": "20220724223548-j6g0o87",
"path": "F:\\SiYuan\\data\\templates\\foo.md"
}
```
* `id`:调用渲染所在的文档 ID
* `path`:模板文件绝对路径
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"content": "<div data-node-id=\"20220729234848-dlgsah7\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\" updated=\"20220729234840\"><div contenteditable=\"true\" spellcheck=\"false\">foo</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"path": "F:\\SiYuan\\data\\templates\\foo.md"
}
}
```
### 渲染 Sprig
* `/api/template/renderSprig`
* 参数
```json
{
"template": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}"
}
```
* `template`:模板内容
* 返回值
```json
{
"code": 0,
"msg": "",
"data": "/daily note/2023/03/2023-03-24"
}
```
## 文件
### 获取文件
* `/api/file/getFile`
* 参数
```json
{
"path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p.sy"
}
```
* `path`:工作空间路径下的文件路径
* 返回值
* 响应状态码 `200`: 文件内容
* 响应状态码 `202`: 异常信息
```json
{
"code": 404,
"msg": "",
"data": null
}
```
* `code`: 非零的异常值
* `-1`: 参数解析错误
* `403`: 无访问权限 (文件不在工作空间下)
* `404`: 未找到 (文件不存在)
* `405`: 方法不被允许 (这是一个目录)
* `500`: 服务器错误 (文件查询失败 / 文件读取失败)
* `msg`: 一段描述错误的文本
### 写入文件
* `/api/file/putFile`
* 参数为 HTTP Multipart 表单
* `path`:工作空间路径下的文件路径
* `isDir`:是否为创建文件夹,为 `true` 时仅创建文件夹,忽略 `file`
* `modTime`最近访问和修改时间Unix time
* `file`:上传的文件
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 删除文件
* `/api/file/removeFile`
* 参数
```json
{
"path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p.sy"
}
```
* `path`:工作空间路径下的文件路径
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 重命名文件
* `/api/file/renameFile`
* 参数
```json
{
"path": "/data/assets/image-20230523085812-k3o9t32.png",
"newPath": "/data/assets/test-20230523085812-k3o9t32.png"
}
```
* `path`:工作空间路径下的文件路径
* `newPath`:新的文件路径
* 返回值
```json
{
"code": 0,
"msg": "",
"data": null
}
```
### 列出文件
* `/api/file/readDir`
* 参数
```json
{
"path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p"
}
```
* `path`:工作空间路径下的文件夹路径
* 返回值
```json
{
"code": 0,
"msg": "",
"data": [
{
"isDir": true,
"isSymlink": false,
"name": "20210808180303-6yi0dv5",
"updated": 1691467624
},
{
"isDir": false,
"isSymlink": false,
"name": "20210808180303-6yi0dv5.sy",
"updated": 1663298365
}
]
}
```
## 导出
### 导出 Markdown 文本
* `/api/export/exportMdContent`
* 参数
```json
{
"id": ""
}
```
* `id`:要导出的文档块 ID
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"hPath": "/0 请从这里开始",
"content": "## 🍫 内容块\n\n在思源中唯一重要的核心概念是..."
}
}
```
* `hPath`:人类可读的路径
* `content`Markdown 内容
### 导出文件与目录
* `/api/export/exportResources`
* 参数
```json
{
"paths": [
"/conf/appearance/boot",
"/conf/appearance/langs",
"/conf/appearance/emojis/conf.json",
"/conf/appearance/icons/index.html"
],
"name": "zip-file-name"
}
```
* `paths`:要导出的文件或文件夹路径列表,相同名称的文件/文件夹会被覆盖
* `name`:(可选)导出的文件名,未设置时默认为 `export-YYYY-MM-DD_hh-mm-ss.zip`
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"path": "temp/export/zip-file-name.zip"
}
}
```
* `path`:创建的 `*.zip` 文件路径
* `zip-file-name.zip` 中的目录结构如下所示:
* `zip-file-name`
* `boot`
* `langs`
* `conf.json`
* `index.html`
## 转换
### Pandoc
* `/api/convert/pandoc`
* 工作目录
* 执行调用 pandoc 命令时工作目录会被设置在 `工作空间/temp/convert/pandoc/${test}` 下
* 可先通过 API [`写入文件`](#写入文件) 将待转换文件写入该目录
* 然后再调用该 API 进行转换,转换后的文件也会被写入该目录
* 最后调用 API [`获取文件`](#获取文件) 获取转换后的文件内容
* 或者调用 API [`通过 Markdown 创建文档`](#通过-markdown-创建文档)
* 或者调用内部 API `importStdMd` 将转换后的文件夹直接导入
* 参数
```json
{
"dir": "test",
"args": [
"--to", "markdown_strict-raw_html",
"foo.epub",
"-o", "foo.md"
]
}
```
* `args`Pandoc 命令行参数
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"path": "/temp/convert/pandoc/test"
}
}
```
* `path`:工作空间下的路径
## 通知
### 推送消息
* `/api/notification/pushMsg`
* 参数
```json
{
"msg": "test",
"timeout": 7000
}
```
* `timeout`:消息持续显示时间,单位为毫秒。可以不传入该字段,默认为 7000 毫秒
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"id": "62jtmqi"
}
}
```
* `id`:消息 ID
### 推送报错消息
* `/api/notification/pushErrMsg`
* 参数
```json
{
"msg": "test",
"timeout": 7000
}
```
* `timeout`:消息持续显示时间,单位为毫秒。可以不传入该字段,默认为 7000 毫秒
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"id": "qc9znut"
}
}
```
* `id`:消息 ID
## 网络
### 正向代理
* `/api/network/forwardProxy`
* 参数
```json
{
"url": "https://b3log.org/siyuan/",
"method": "GET",
"timeout": 7000,
"contentType": "text/html",
"headers": [
{
"Cookie": ""
}
],
"payload": {},
"payloadEncoding": "text",
"responseEncoding": "text"
}
```
* `url`:转发的 URL
* `method`HTTP 方法,默认为 `GET`
* `timeout`:超时时间,单位为毫秒,默认为 `7000` 毫秒
* `contentType`HTTP Content-Type默认为 `application/json`
* `headers`HTTP 请求标头
* `payload`HTTP 请求体,对象或者是字符串
* `payloadEncoding``pyaload` 所使用的编码方案,默认为 `text`,可选值如下所示
* `text`
* `base64` | `base64-std`
* `base64-url`
* `base32` | `base32-std`
* `base32-hex`
* `hex`
* `responseEncoding`:响应数据中 `body` 字段所使用的编码方案,默认为 `text`,可选值如下所示
* `text`
* `base64` | `base64-std`
* `base64-url`
* `base32` | `base32-std`
* `base32-hex`
* `hex`
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"body": "",
"bodyEncoding": "text",
"contentType": "text/html",
"elapsed": 1976,
"headers": {
},
"status": 200,
"url": "https://b3log.org/siyuan"
}
}
```
* `bodyEncoding``body` 所使用的编码方案,与请求中 `responseEncoding` 字段一致,默认为 `text`,可能的值如下所示
* `text`
* `base64` | `base64-std`
* `base64-url`
* `base32` | `base32-std`
* `base32-hex`
* `hex`
## 系统
### 获取启动进度
* `/api/system/bootProgress`
* 不带参
* 返回值
```json
{
"code": 0,
"msg": "",
"data": {
"details": "Finishing boot...",
"progress": 100
}
}
```
### 获取系统版本
* `/api/system/version`
* 不带参
* 返回值
```json
{
"code": 0,
"msg": "",
"data": "1.3.5"
}
```
### 获取系统当前时间
* `/api/system/currentTime`
* 不带参
* 返回值
```json
{
"code": 0,
"msg": "",
"data": 1631850968131
}
```
* `data`: 精度为毫秒