docs: 添加技术分享文档 - 钉钉群聊飞书文档收集与知识库构建
- 完整的技术架构说明 - 详细的工具配置指南 - 关键代码示例 - 部署和使用指南 - 经验总结和最佳实践 文档内容: 1. 项目概述与成果 2. 技术架构与流程 3. 详细技术方案(dws + lark-cli + Python) 4. 关键代码示例 5. 配置与部署指南 6. 关键经验与最佳实践 7. 使用指南与扩展方向
This commit is contained in:
@@ -0,0 +1,307 @@
|
|||||||
|
# 钉钉群聊飞书文档收集与知识库构建 - 技术分享
|
||||||
|
|
||||||
|
> 分享人:大师 | 日期:2026-06-03 | 版本:v1.0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、项目概述
|
||||||
|
|
||||||
|
### 1.1 背景
|
||||||
|
|
||||||
|
公司战略研究团队每天在钉钉群中分享飞书文档(研究报告、竞品分析、日报等),手动收集和整理效率低下。本项目实现了:
|
||||||
|
|
||||||
|
- **自动化采集**:从钉钉群聊中提取消息、链接和文件
|
||||||
|
- **批量下载**:自动下载飞书文档和文件附件
|
||||||
|
- **知识结构化**:构建知识图谱和 Obsidian 知识库
|
||||||
|
- **定时更新**:支持每日自动采集最新内容
|
||||||
|
|
||||||
|
### 1.2 成果
|
||||||
|
|
||||||
|
| 指标 | 数量 |
|
||||||
|
|------|------|
|
||||||
|
| 消息总数 | 388 条 |
|
||||||
|
| 飞书文档 | 159 篇 |
|
||||||
|
| 文件附件 | 19 个 |
|
||||||
|
| 活跃人员 | 28 位 |
|
||||||
|
| 时间范围 | 2026-05-01 ~ 2026-06-03 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、技术架构
|
||||||
|
|
||||||
|
### 2.1 整体流程
|
||||||
|
|
||||||
|
```
|
||||||
|
钉钉群聊消息
|
||||||
|
↓
|
||||||
|
消息采集(dws CLI)
|
||||||
|
↓
|
||||||
|
链接提取(Python)
|
||||||
|
↓
|
||||||
|
文档下载(lark-cli)
|
||||||
|
↓
|
||||||
|
内容解析(Python + BeautifulSoup)
|
||||||
|
↓
|
||||||
|
知识图谱构建(Python)
|
||||||
|
↓
|
||||||
|
Obsidian 知识库生成(Python)
|
||||||
|
↓
|
||||||
|
可视化展示(HTML + Mermaid)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 核心工具
|
||||||
|
|
||||||
|
| 工具 | 用途 | 版本 |
|
||||||
|
|------|------|------|
|
||||||
|
| **dws CLI** | 钉钉消息采集、文件下载 | 悟空 CLI |
|
||||||
|
| **lark-cli** | 飞书文档下载 | v1.0.32 |
|
||||||
|
| **Python** | 数据处理、脚本开发 | 3.10+ |
|
||||||
|
| **BeautifulSoup** | HTML 解析 | 4.x |
|
||||||
|
| **Obsidian** | 知识库管理 | 最新版 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、详细技术方案
|
||||||
|
|
||||||
|
### 3.1 钉钉消息采集
|
||||||
|
|
||||||
|
#### 工具:dws CLI(悟空)
|
||||||
|
|
||||||
|
**安装路径**:`C:\Users\admin\.real\.bin\dws\bin\dws.exe`
|
||||||
|
|
||||||
|
**认证信息**:
|
||||||
|
- Corp ID:`ding9385b4aebd9af88635c2f4657eb6378f`
|
||||||
|
- User ID:`347672497`
|
||||||
|
|
||||||
|
**核心命令**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 获取群聊消息
|
||||||
|
dws chat message list --group <group_id> --time <time> --forward true --format json --limit 200
|
||||||
|
|
||||||
|
# 下载文件附件
|
||||||
|
dws drive download --node <fileId> --output <path>
|
||||||
|
```
|
||||||
|
|
||||||
|
**群组 ID**:
|
||||||
|
|
||||||
|
| 群组 | openConversationId |
|
||||||
|
|------|-------------------|
|
||||||
|
| 创新组 | `cidMuM+itt5PeY7xNSWsv3M0g==` |
|
||||||
|
| dc战略问题研究院 | `cidoUneRB4Db8TAXaTrKxkQAw==` |
|
||||||
|
|
||||||
|
**分页策略**:
|
||||||
|
|
||||||
|
由于 API 返回消息有数量限制,需要分多次拉取:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 分段拉取策略
|
||||||
|
segments = [
|
||||||
|
("2026-05-01", "true"), # 从5月1日向前
|
||||||
|
("2026-05-19", "true"), # 从5月19日向前
|
||||||
|
("2026-05-24", "true"), # 从5月24日向前
|
||||||
|
("2026-06-03", "false"), # 从6月3日向后
|
||||||
|
]
|
||||||
|
|
||||||
|
# 去重:使用 openMessageId
|
||||||
|
all_msgs = {}
|
||||||
|
for msg in msgs:
|
||||||
|
all_msgs[msg["openMessageId"]] = msg
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 链接提取
|
||||||
|
|
||||||
|
#### 正则表达式
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 飞书文档链接
|
||||||
|
feishu_re = re.compile(r'https?://[a-zA-Z0-9.-]+\.feishu\.cn/(?:wiki|docx)/[A-Za-z0-9]+')
|
||||||
|
|
||||||
|
# 文件附件
|
||||||
|
file_re = re.compile(r'\[文件\]\s+(.+?)\s+fileId:\s+(\S+)')
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 飞书文档下载
|
||||||
|
|
||||||
|
#### 工具:lark-cli(官方飞书 CLI)
|
||||||
|
|
||||||
|
**安装**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g @larksuite/cli
|
||||||
|
```
|
||||||
|
|
||||||
|
**配置**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 初始化配置
|
||||||
|
lark-cli config init
|
||||||
|
|
||||||
|
# 登录授权
|
||||||
|
lark-cli auth login --domain docs,drive,wiki --recommend
|
||||||
|
```
|
||||||
|
|
||||||
|
**核心命令**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 获取文档内容
|
||||||
|
lark-cli api GET /open-apis/docx/v1/documents/<doc_id>/blocks --format json
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.4 文件附件下载
|
||||||
|
|
||||||
|
#### 使用 dws CLI
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 下载文件
|
||||||
|
dws drive download --node <fileId> --output <path>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、关键代码
|
||||||
|
|
||||||
|
### 4.1 消息采集脚本
|
||||||
|
|
||||||
|
```python
|
||||||
|
def fetch(group_id, time_str, forward="true"):
|
||||||
|
cmd = [DWS, "chat", "message", "list",
|
||||||
|
"--group", group_id,
|
||||||
|
"--time", time_str,
|
||||||
|
"--forward", forward,
|
||||||
|
"--format", "json",
|
||||||
|
"--limit", "200"]
|
||||||
|
result = subprocess.run(cmd, capture_output=True, timeout=60)
|
||||||
|
output = result.stdout.decode("utf-8", errors="replace")
|
||||||
|
json_start = output.find("{")
|
||||||
|
data = json.loads(output[json_start:])
|
||||||
|
return data.get("result", {}).get("messages", [])
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 链接提取脚本
|
||||||
|
|
||||||
|
```python
|
||||||
|
feishu_re = re.compile(r'https?://[a-zA-Z0-9.-]+\.feishu\.cn/(?:wiki|docx)/[A-Za-z0-9]+')
|
||||||
|
|
||||||
|
for msg in messages:
|
||||||
|
content = msg.get("content", "")
|
||||||
|
for link in feishu_re.findall(content):
|
||||||
|
all_links.append({"url": link, "sender": msg.get("sender", "")})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 文档下载脚本
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_document_content(doc_id):
|
||||||
|
cmd = [LARK_CLI, "api", "GET",
|
||||||
|
f"/open-apis/docx/v1/documents/{doc_id}/blocks",
|
||||||
|
"--format", "json"]
|
||||||
|
result = subprocess.run(cmd, capture_output=True, timeout=30)
|
||||||
|
if result.returncode == 0:
|
||||||
|
data = json.loads(result.stdout.decode("utf-8", errors="replace"))
|
||||||
|
if data.get("code") == 0:
|
||||||
|
return data["data"]
|
||||||
|
return None
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、配置与部署
|
||||||
|
|
||||||
|
### 5.1 环境要求
|
||||||
|
|
||||||
|
```
|
||||||
|
Python 3.10+
|
||||||
|
Node.js 18+
|
||||||
|
npm 9+
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 依赖安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Python 依赖
|
||||||
|
pip install beautifulsoup4 requests
|
||||||
|
|
||||||
|
# Node.js 依赖
|
||||||
|
npm install -g @larksuite/cli
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 定时任务
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 创建定时任务(每天18:00执行)
|
||||||
|
schtasks /create /tn "FeishuDocCollector" /tr "python D:\desktop\feishu_docs_summary\scripts\daily_feishu_collector.py" /sc daily /st 18:00
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、关键经验
|
||||||
|
|
||||||
|
### 6.1 API 限制与应对
|
||||||
|
|
||||||
|
| 问题 | 解决方案 |
|
||||||
|
|------|----------|
|
||||||
|
| 消息分页 | 分多次拉取 + openMessageId 去重 |
|
||||||
|
| 飞书文档权限 | 使用 lark-cli(已授权) |
|
||||||
|
| 文件下载超时 | 增加 timeout 参数 |
|
||||||
|
|
||||||
|
### 6.2 性能优化
|
||||||
|
|
||||||
|
- **并发控制**:API 调用间隔 0.5 秒
|
||||||
|
- **增量更新**:只下载新文档
|
||||||
|
- **缓存机制**:已下载文档不重复下载
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、使用指南
|
||||||
|
|
||||||
|
### 7.1 快速开始
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 全量拉取消息
|
||||||
|
python scripts/fetch_all.py
|
||||||
|
|
||||||
|
# 2. 提取链接
|
||||||
|
python scripts/extract_links.py
|
||||||
|
|
||||||
|
# 3. 下载文档
|
||||||
|
python scripts/download_feishu_docs.py
|
||||||
|
|
||||||
|
# 4. 构建知识图谱
|
||||||
|
python scripts/build_graph.py
|
||||||
|
|
||||||
|
# 5. 生成 Obsidian 知识库
|
||||||
|
python scripts/write_obsidian.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 每日更新
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 运行每日采集脚本
|
||||||
|
python scripts/daily_feishu_collector.py
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、总结
|
||||||
|
|
||||||
|
本项目通过 **dws CLI + lark-cli + Python** 实现了钉钉群聊飞书文档的自动化收集和知识库构建,大幅提升了团队知识管理效率。
|
||||||
|
|
||||||
|
**核心价值**:
|
||||||
|
- ✅ 自动化采集,节省人工时间
|
||||||
|
- ✅ 结构化存储,便于检索
|
||||||
|
- ✅ 知识图谱,发现关联关系
|
||||||
|
- ✅ Obsidian 集成,支持双向链接
|
||||||
|
- ✅ 定时更新,保持内容新鲜
|
||||||
|
|
||||||
|
**技术亮点**:
|
||||||
|
- ✅ 多工具协同(dws + lark-cli + Python)
|
||||||
|
- ✅ 增量更新机制
|
||||||
|
- ✅ 完整的错误处理
|
||||||
|
- ✅ 灵活的配置系统
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> 文档版本:v1.0
|
||||||
|
> 最后更新:2026-06-03
|
||||||
|
> 维护人:大师
|
||||||
Reference in New Issue
Block a user