一个功能强大的 Obsidian 插件,让您轻松将 Markdown 文档无缝分享到飞书云文档。支持完整的格式转换、文件上传、子文档嵌入和跨文档图片处理。
- 一键分享 - 支持命令面板、右键菜单、文件管理器多种分享方式
- 双模式支持 - 支持云空间和知识库两种分享目标
- 智能更新 - 自动识别已分享文档,支持增量更新
- 批量处理 - 使用飞书嵌套块API,大幅提升处理性能
- 官方授权 - 标准 OAuth 2.0 流程,支持自动Token刷新
- 权限可控 - 支持多种链接分享权限设置
- 数据隔离 - 直连飞书API,无第三方服务器中转
- 错误恢复 - 完善的异常处理和重试机制
- 完整Markdown - 支持标题、列表、表格、代码块、引用等
- Obsidian语法 - 完美处理双链、标签、嵌入等特有语法
- Callout转换 - 智能转换Obsidian标注块为飞书样式
- 格式保持 - 最大程度保持原文档的视觉效果
- 本地文件上传 - 自动上传图片、文档、表格等附件
- 🖼️ 图片处理增强 - 跨文档图片复制,智能下载重新上传
- 子文档嵌入 - 支持嵌入Markdown文件作为子文档链接
- 批量优化 - 智能批量上传,减少API调用
- Front Matter集成 - 自动添加分享标记、链接和时间戳
- 状态跟踪 - 记录文档分享状态,避免重复处理
- URL管理 - 自动更新和维护飞书文档链接
- 字段保护 - 只更新相关字段,保护原有Front Matter数据
- 打开 Obsidian 设置
- 进入"第三方插件"页面
- 关闭"安全模式"
- 点击"浏览社区插件"
- 搜索"飞书分享"或"Feishu Share"
- 点击安装并启用
- 从 Releases 下载最新版本
- 解压到 Obsidian 插件目录:
{vault}/.obsidian/plugins/obsidian-feishu-direct/ - 重启 Obsidian 并在设置中启用插件
- 访问 飞书开放平台
- 创建"企业自建应用"
- 记录 App ID 和 App Secret
- 在"权限管理"中添加以下权限(最小集):
user_access_token- 用户身份权限contact:user.base:readonly- 获取用户基本信息docx:document- 创建、编辑文档drive:drive- 访问云空间文件wiki:wiki-访可和管理知识库
在应用的"安全设置" → "重定向URL"中添加:
https://md2feishu.xinqi.life/oauth-callback
- 在 Obsidian 插件设置中输入 App ID 和 App Secret
- 点击"🚀 一键授权"按钮
- 在弹出的浏览器中完成飞书登录授权
- 授权成功后即可开始使用
插件提供多种便捷的分享方式:
- 快捷键:
Ctrl+P(Windows) 或Cmd+P(Mac) - 搜索命令:输入"分享当前笔记到飞书"
- 回车执行:直接开始分享流程
- 编辑器内:在编辑器中右键 → 点击"📤 分享到飞书"
- 文件管理器:在文件列表中右键 MD 文件 → "📤 分享到飞书"
智能图片复制 - 插件为您解决飞书图片跨文档限制问题:
- 自动识别:检测需要处理的图片块
- 智能下载:从源文档下载原始图片
- 重新上传:上传到目标文档并更新引用
- 错误隔离:单个图片失败不影响整体更新
支持格式:
- 图片文件:
或![[image.png]] - 附件文件:
![[document.pdf]]或![[spreadsheet.xlsx]] - 多媒体:PNG、JPG、GIF、WebP、PDF、DOCX、XLSX等
处理流程:
- 扫描文档中的本地文件引用
- 生成临时占位符替换引用
- 上传文档内容到飞书
- 逐个上传本地文件
- 将占位符替换为实际文件块
Markdown文件嵌入:![[other-note.md]]
- 作为子文档上传到飞书
- 在原位置插入文档链接
- 支持递归处理子文档中的文件引用
- 防循环引用和深度限制保护
自动标记 - 分享成功后自动添加:
---
feishushare: true # 分享状态标记
feishu_url: https://example.feishu.cn/... # 飞书文档链接
feishu_shared_at: 2025-01-17 10:30 # 分享时间(东8区,YYYY-MM-DD HH:mm)
---
当某些代码块仅用于 Obsidian 本地样式/插件(例如 meta-bind-embed、dataviewjs),可在设置中启用“代码块过滤”:
- 在设置页“代码块过滤”中,每行输入一个语言名(大小写不敏感):
meta-bind-embed
dataviewjs
- 被列出的 fenced code block(``` 或 ~~~)在上传到飞书前会被移除;未列出的代码块将按原样保留。
提示:仅影响 fenced code block,不影响内联代码、Callout 或 HTML。
保护机制:
- 只更新飞书相关字段
- 完整保留原有 Front Matter 数据
- 支持复杂 YAML 结构(数组、对象等)
性能提升 - 使用飞书嵌套块API:
- 处理速度提升75%-99%
- API调用减少90%以上
- 智能回退机制保证兼容性
- 频率控制防止429错误
- 在插件设置中点击 📁 选择文件夹
- 浏览飞书云空间文件结构
- 选择适合的文件夹作为默认保存位置
- 在"目标类型"中选择"知识库"
- 点击 📖 选择知识库 按钮
- 选择目标知识库空间和节点(不选节点则保存到该知识库根目录)
权限说明(最小集):
- 用户身份权限:
user_access_token - 应用身份权限:
wiki:wiki
成功提示 - 分享完成后显示:
- ✅ 成功提示和文档链接
- 📋 一键复制链接功能
- 📎 附件上传状态和结果
- 🗑️ 自动清理临时文件
错误处理 - 出现问题时:
- 明确的错误描述和解决建议
- 自动重试和智能回退
- 详细的日志信息供排查
Obsidian插件 → 直接调用飞书API
- OAuth授权 - 标准OAuth 2.0流程,支持自动重新授权
- 文件上传 - 使用FormData直接上传,支持多种文件格式
- 图片处理服务 - 智能图片下载重新上传,解决跨文档图片复制问题
- 智能占位符 - 预编译正则表达式,支持早期退出优化
- 子文档处理 - 递归处理嵌入的Markdown文件
- Token管理 - 自动刷新访问令牌,智能重试机制
- 错误处理 - 友好的错误提示和多重备用方案
// 文件上传示例
const formData = new FormData();
formData.append('file_name', fileName);
formData.append('parent_type', 'explorer');
formData.append('size', content.length.toString());
formData.append('file', blob, fileName);
const response = await fetch('https://open.feishu.cn/open-apis/drive/v1/files/upload_all', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
},
body: formData
});src/
├── main.ts # 主插件类
├── feishu-api.ts # 飞书API服务(完整功能,包含图片处理服务)
├── markdown-processor.ts # Markdown内容处理器
├── settings.ts # 设置界面
├── manual-auth-modal.ts # 手动授权模态框
├── folder-select-modal.ts # 文件夹选择模态框
├── dom-utils.ts # DOM工具函数
├── debug.ts # 调试工具
├── types.ts # 类型定义
└── constants.ts # 常量配置
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Obsidian │ │ 飞书分享插件 │ │ 飞书API │
│ │ │ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Markdown │◄┼────┼►│ Processor │ │ │ │ Document │ │
│ │ Files │ │ │ │ │ │ │ │ API │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
│ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ ┌─────────────┐ │ │ │ Auth │◄┼────┼►│ OAuth │ │
│ │ Local │◄┼────┼►│ Service │ │ │ │ Service │ │
│ │ Assets │ │ │ │ │ │ │ │ │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
│ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ ┌─────────────┐ │ │ │ Image │◄┼────┼►│ Media │ │
│ │ UI │◄┼────┼►│ Processing │ │ │ │ API │ │
│ │ Components │ │ │ │ │ │ │ │ │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
# 开发构建(带监听和sourcemap)
npm run dev
# 生产构建(压缩和优化)
npm run build
# 版本管理
npm run version- FeishuApiService - 飞书API服务,处理OAuth、文档操作、文件上传
- MarkdownProcessor - Markdown处理器,转换Obsidian语法为飞书格式
- ImageProcessingService - 图片处理服务,处理跨文档图片复制
- 设置管理 - 用户配置界面,支持云空间和知识库配置
- 调试系统 - 多级日志系统,便于问题排查
-
授权失败
- 检查App ID和App Secret是否正确
- 确认飞书应用权限配置
- 验证OAuth回调地址
-
上传失败
- 检查文件大小(飞书有限制)
- 确认访问令牌有效性
- 查看控制台错误信息
-
Token过期
- 插件会自动尝试刷新Token
- 如果刷新失败,需要重新授权
- 打开Obsidian开发者工具(
Ctrl+Shift+I) - 查看Console标签页的日志
- 检查Network标签页的API请求
- TypeScript覆盖率: 100%
- 代码行数: ~7000+ 行
- 核心模块: 9个主要文件
- API集成: 15+ 飞书官方API
- 测试覆盖: 包含调试和API测试功能
- 开发语言: TypeScript 4.7.4
- 构建工具: ESBuild
- UI框架: Obsidian Plugin API
- API集成: 飞书开放平台 API
- 包管理: npm
{
"runtime": {
"obsidian": "latest",
"typescript": "4.7.4"
},
"devDependencies": {
"@types/node": "^16.11.6",
"esbuild": "0.17.3",
"@typescript-eslint/*": "5.29.0"
}
}
🧠 知识库一致性
- 目标为“知识库”时,子文档也自动移动至配置的知识库空间/节点(未配置节点则保存到该知识库根目录)
- 主文档与子文档处理流程对齐,链接可用
🧾 文档属性与时间格式
- Front Matter 命名统一为“文档属性(Front Matter)”
feishu_shared_at时间格式统一为东八区YYYY-MM-DD HH:mm
⛔ 代码块过滤(通用内容排除)
- 设置页新增“代码块过滤”多行输入:每行一个语言名(如
meta-bind-embed、dataviewjs) - 命中的 fenced code(``` 或 ~~~)在上传前移除;适用于主文档与子文档
🎨 Callout 优化
- Callout 标题保持加粗
- Callout 内容中的
==高亮==解析为加粗显示(不再保留“==”符号)
🔐 授权与默认目标
- 未授权时,打开位置选择前进行拦截并提示授权
- 默认分享目标改为“知识库”
🐛 Bug 修复
- 修复代码块过滤参数未传递导致过滤不生效的问题
- 修复子文档中 Callout 占位符未替换的问题
🖼️ 跨文档图片复制
- 新增
ImageProcessingService专业图片处理服务 - 实现从源文档下载→重新上传→更新引用的完整流程
- 使用官方素材下载API (
/drive/v1/medias/{token}/download) - 智能图片块映射和批量处理
- 解决飞书图片token跨文档限制问题
🔧 架构优化
- 渐进式改造,保持100%向后兼容
- 模块化图片处理,独立错误处理
- 性能优化,减少API调用次数
⚡ 批量处理优化
- 使用嵌套块API,处理速度提升75%-99%
- API调用减少90%,智能回退机制
- 频率控制和并发保护
🛡️ 稳定性提升
- 完善的错误处理和重试机制
- Token刷新优化,文档访问权限检查
- 临时文档智能清理
🏷️ Front Matter集成
- 自动添加分享标记和链接
- 支持时间戳和状态跟踪
- 保护原有YAML结构
🔗 链接处理优化
- Obsidian协议链接优化
- 权限设置和分享控制
- UI界面美化和响应式设计
- 🏷️ 自动分享标记 - 新增分享成功后自动在Front Matter中添加标记功能
- 支持自动添加
feishushare: true标记 - 记录分享链接
feishu_url和分享时间feishu_shared_at(东8区时间) - 主文档和子文档都会自动添加分享标记
- 功能默认开启,可在设置中关闭
- 重复分享时自动更新时间戳
- 支持自动添加
- 🔗 链接处理优化 - 优化Obsidian协议链接的显示方式
- 将
[文本](obsidian://...)转换为文本(obsidian://...)格式 - 避免飞书导入时将协议链接转换为纯文本,保留完整URL信息
- 将
- 🎨 UI优化 - 全新的设置界面设计,更加美观易用
- 💝 赞赏功能 - 新增开发者赞赏功能,支持作者继续开发
- 🔧 代码重构 - 优化代码结构,提升性能和可维护性
- 🐛 Bug修复 - 修复了多个已知问题,提升稳定性
- 📱 响应式设计 - 设置界面适配不同屏幕尺寸
- 🎉 文件上传功能 - 支持自动上传本地图片和附件
- 📄 子文档支持 - 支持嵌入Markdown文件作为子文档链接
- 🔍 性能优化 - 智能占位符搜索,支持早期退出
- 🔧 错误处理 - 增强的错误处理和重试机制
- ⚡ 用户体验 - 实时进度提示和状态更新
- 🎉 首个Direct版本发布
- ✅ 直接调用飞书API,无需代理
- ✅ 完整的OAuth授权流程
- ✅ 支持基础文档分享
- ✅ 友好的用户界面
欢迎提交Issue和Pull Request!
如果这个插件对您有帮助,欢迎请作者喝杯咖啡 ☕
微信扫一扫,支持作者
MIT License