@@ -5,128 +5,35 @@ description: 思源笔记 API 集成。通过自然语言创建、编辑、搜
# 思源笔记 API 集成 Skill
## 服务配置
## 环境变量配置(必须)
### 阿里云生产环境 (推荐)
本 skill 通过环境变量读取思源笔记连接信息,不同用户/组织配置不同的值。
| 配置项 | 值 |
|--------|-----|
| 服务地址 | `https://siyuan.pipexerp.com` (HTTPS) |
| HTTP访问 | `http://47.93.23.182` (重定向到HTTPS) |
| SSH 别名 | `siyuan` |
| 访问码 | `SiYuan@2026` |
| 版本 | **3.1.11 ** (2026-02-16 升级) |
| 部署位置 | 阿里云 Ubuntu 24.04 (Docker) |
| 容器名称 | `siyuan` |
| 镜像 | `b3log/siyuan:v3.1.11` |
| 数据目录 | `/opt/siyuan/workspace` |
| 反向代理 | Caddy (HTTPS + SSL证书) |
| SSL证书 | Let's Encrypt (自动续期) |
**在 `~/.claude/settings.json` 中配置: **
### Tailscale 内网环境 (备用)
``` json
{
"env" : {
"SIYUAN_URL" : "${SIYUAN_URL}" ,
"SIYUAN_TOKEN" : "your-api-token-here"
}
}
```
| 配置项 | 值 |
|--------|-----|
| 服务地址 | `http://47.93.23.182` (Tailscale) |
| 局域网地址 | `http://192.168.1.50:6806` |
| API Token | `nfnycjb1g8vbexb2` |
| 版本 | 3.1.5 |
| 部署位置 | 飞牛OS (Docker) |
或在项目级 `.claude/settings.json` 中配置(优先级更高)。
**检查配置是否就绪: ** 执行任何思源操作前,先确认环境变量已设置:
``` bash
echo " URL: ${ SIYUAN_URL :- 未配置 } "
echo " TOKEN: ${ SIYUAN_TOKEN : +已配置 } "
```
如果未配置,提示用户在 `~/.claude/settings.json` 的 `env` 中添加 `SIYUAN_URL` 和 `SIYUAN_TOKEN` 。
---
## 服务器管理 (阿里云)
### SSH 连接
``` bash
# 快捷连接
ssh siyuan
# 完整连接命令
ssh -i /Users/donglinlai/Downloads/siyuan.pem root@47.93.23.182
```
### Docker 管理
``` bash
# 查看容器状态
ssh siyuan "docker ps | grep siyuan"
# 查看日志
ssh siyuan "docker logs -f siyuan --tail 100"
# 重启服务
ssh siyuan "docker restart siyuan"
# 停止服务
ssh siyuan "docker stop siyuan"
# 启动服务
ssh siyuan "docker start siyuan"
# 升级到特定版本(推荐)
ssh siyuan "docker stop siyuan && docker rm siyuan"
ssh siyuan "docker pull b3log/siyuan:v3.1.11"
ssh siyuan "docker run -d --name siyuan --restart=always \
-p 127.0.0.1:6806:6806 \
-v /opt/siyuan/workspace:/siyuan/workspace \
-e LANG=en_US.UTF-8 \
b3log/siyuan:v3.1.11 \
--workspace=/siyuan/workspace \
--accessAuthCode=SiYuan@2026"
```
### 数据备份与恢复
``` bash
# 查看数据目录大小
ssh siyuan "du -sh /opt/siyuan/workspace"
# 备份数据到服务器
ssh siyuan "tar -czf /root/siyuan-backup-\$(date +%Y%m%d).tar.gz /opt/siyuan/workspace"
# 下载备份到本地
scp siyuan:/root/siyuan-backup-*.tar.gz ~/Downloads/
# 恢复数据(先停止容器)
ssh siyuan "docker stop siyuan && \
tar -xzf /root/siyuan-backup-YYYYMMDD.tar.gz -C / && \
docker start siyuan"
```
### 访问测试
``` bash
# 测试 HTTPS 访问
curl -I https://siyuan.pipexerp.com
# 测试认证 API
curl -s -X POST https://siyuan.pipexerp.com/api/system/version | jq .
# 浏览器访问
open https://siyuan.pipexerp.com
```
### Caddy 反向代理管理
``` bash
# 查看 Caddy 状态
ssh siyuan "systemctl status caddy"
# 重启 Caddy
ssh siyuan "systemctl restart caddy"
# 查看 Caddy 配置
ssh siyuan "cat /etc/caddy/Caddyfile"
# 查看 SSL 证书
ssh siyuan "journalctl -u caddy | grep certificate"
```
---
## 🔐 保存门禁:敏感信息脱敏
## 🔐 保存<E4BF9D> <E5AD98> <EFBFBD> 禁: 敏感<E6958F> <E6849F> 息脱敏
**保存任何内容到思源笔记前,必须先完成脱敏处理。 **
@@ -201,8 +108,8 @@ api.upsert_doc(notebook_id, "/文档路径", content)
所有 API 请求使用 POST 方法,需携带 Token:
``` bash
curl -X POST https://siyuan.pipexerp.com /api/xxx \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/xxx \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"param": "value"}'
```
@@ -239,8 +146,8 @@ curl -X POST https://siyuan.pipexerp.com/api/xxx \
#### 列出所有笔记本
``` bash
curl -X POST https://siyuan.pipexerp.com /api/notebook/lsNotebooks \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/notebook/lsNotebooks \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{}'
```
@@ -248,8 +155,8 @@ curl -X POST https://siyuan.pipexerp.com/api/notebook/lsNotebooks \
#### 创建笔记本
``` bash
curl -X POST https://siyuan.pipexerp.com /api/notebook/createNotebook \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/notebook/createNotebook \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"name": "笔记本名称"}'
```
@@ -257,8 +164,8 @@ curl -X POST https://siyuan.pipexerp.com/api/notebook/createNotebook \
#### 删除笔记本
``` bash
curl -X POST https://siyuan.pipexerp.com /api/notebook/removeNotebook \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/notebook/removeNotebook \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"notebook": "笔记本ID"}'
```
@@ -276,22 +183,22 @@ curl -X POST https://siyuan.pipexerp.com/api/notebook/removeNotebook \
``` bash
# 1. 先查询是否存在(按路径精确匹配)
DOC_PATH = "/网络管理/家庭Tailscale网络"
EXISTING = $( curl -s -X POST https://siyuan.pipexerp.com /api/query/sql \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
EXISTING = $( curl -s -X POST ${ SIYUAN_URL } /api/query/sql \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d " {\"stmt\": \"SELECT id FROM blocks WHERE type='d' AND hpath=' ${ DOC_PATH } ' LIMIT 1\"} " \
| jq -r '.data[0].id // empty' )
if [ -n " $EXISTING " ] ; then
# 2a. 存在则更新
curl -s -X POST https://siyuan.pipexerp.com /api/block/updateBlock \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -s -X POST ${ SIYUAN_URL } /api/block/updateBlock \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d " {\"id\": \" ${ EXISTING } \", \"dataType\": \"markdown\", \"data\": \"# 更新的内容\"} "
else
# 2b. 不存在则创建
curl -s -X POST https://siyuan.pipexerp.com /api/filetree/createDocWithMd \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -s -X POST ${ SIYUAN_URL } /api/filetree/createDocWithMd \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"notebook": "笔记本ID", "path": "/网络管理/家庭Tailscale网络", "markdown": "# 新内容"}'
fi
@@ -300,8 +207,8 @@ fi
#### 创建文档 (仅新建时使用)
``` bash
curl -X POST https://siyuan.pipexerp.com /api/filetree/createDocWithMd \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/filetree/createDocWithMd \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{
"notebook": "笔记本ID",
@@ -313,8 +220,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/createDocWithMd \
#### 获取文档内容
``` bash
curl -X POST https://siyuan.pipexerp.com /api/filetree/getDoc \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/filetree/getDoc \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"id": "文档ID"}'
```
@@ -322,8 +229,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/getDoc \
#### 删除文档
``` bash
curl -X POST https://siyuan.pipexerp.com /api/filetree/removeDoc \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/filetree/removeDoc \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"notebook": "笔记本ID", "path": "/文档路径"}'
```
@@ -331,8 +238,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/removeDoc \
#### 重命名文档
``` bash
curl -X POST https://siyuan.pipexerp.com /api/filetree/renameDoc \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/filetree/renameDoc \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"notebook": "笔记本ID", "path": "/旧路径", "title": "新标题"}'
```
@@ -344,8 +251,8 @@ curl -X POST https://siyuan.pipexerp.com/api/filetree/renameDoc \
#### 插入块
``` bash
curl -X POST https://siyuan.pipexerp.com /api/block/insertBlock \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/block/insertBlock \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{
"dataType": "markdown",
@@ -357,8 +264,8 @@ curl -X POST https://siyuan.pipexerp.com/api/block/insertBlock \
#### 更新块
``` bash
curl -X POST https://siyuan.pipexerp.com /api/block/updateBlock \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/block/updateBlock \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{
"dataType": "markdown",
@@ -370,8 +277,8 @@ curl -X POST https://siyuan.pipexerp.com/api/block/updateBlock \
#### 删除块
``` bash
curl -X POST https://siyuan.pipexerp.com /api/block/deleteBlock \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/block/deleteBlock \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"id": "块ID"}'
```
@@ -383,8 +290,8 @@ curl -X POST https://siyuan.pipexerp.com/api/block/deleteBlock \
#### 全文搜索
``` bash
curl -X POST https://siyuan.pipexerp.com /api/search/fullTextSearchBlock \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/search/fullTextSearchBlock \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{
"query": "搜索关键词",
@@ -395,8 +302,8 @@ curl -X POST https://siyuan.pipexerp.com/api/search/fullTextSearchBlock \
#### SQL 查询
``` bash
curl -X POST https://siyuan.pipexerp.com /api/query/sql \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/query/sql \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{
"stmt": "SELECT * FROM blocks WHERE content LIKE ' \' '%关键词%' \' ' LIMIT 10"
@@ -410,8 +317,8 @@ curl -X POST https://siyuan.pipexerp.com/api/query/sql \
#### 导出 Markdown
``` bash
curl -X POST https://siyuan.pipexerp.com /api/export/exportMdContent \
-H "Authorization: Token nfnycjb1g8vbexb2 " \
curl -X POST ${ SIYUAN_URL } /api/export/exportMdContent \
-H " Authorization: Token ${ SIYUAN_TOKEN } " \
-H "Content-Type: application/json" \
-d '{"id": "文档ID"}'
```
@@ -421,13 +328,16 @@ curl -X POST https://siyuan.pipexerp.com/api/export/exportMdContent \
## Python 封装
``` python
import os
import requests
from typing import Optional , Dict , Any
class SiYuanAPI :
""" 思源笔记 API 封装 """
def __init__ ( self , base_url : str = " https://siyuan.pipexerp.com " , token : str = " nfnycjb1g8vbexb2 " ) :
def __init__ ( self , base_url : str = None , token : str = None ) :
base_url = base_url or os . environ . get ( " SIYUAN_URL " , " " )
token = token or os . environ . get ( " SIYUAN_TOKEN " , " " )
self . base_url = base_url
self . headers = {
" Authorization " : f " Token { token } " ,