把钉钉DingTalk A1音频导出到本地

做了一个小工具:把钉钉DingTalk录制的 AI 听记完整下载到本地。

钉钉DingTalk是一款很好的个人效率工具,硬件端录制的音频由钉钉通过通义千问Qwen3-235B、DeepSeek-V3-671B满血版大模型 AI纪要总结,除了录音,还有转写、AI 纪要、笔记、章节、分析、关键词、待办。但这些内容平时都散在钉钉app里,想备份、整理、二次处理都不太方便。所以做一个本地导出工具,一次性把这些东西都拉下来。

项目基于这个开源仓库改的:

1
https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli

原项目提供了一个叫 dws 的命令行工具,可以通过钉钉授权访问 AI 听记、文档、云盘、日程等能力,在这个项目基础上加了两个脚本:

1
2
scripts/archive-all-minutes.sh
scripts/download-all-minutes-audio.sh

第一个脚本负责完整归档,第二个脚本只下载音频。

一开始只是想把录音下载下来。后来发现听记接口还能拿到更多内容,比如转写原文、AI 纪要、关键词、待办、思维导图状态等,于是就把脚本扩成了完整归档。

DingTalkExport
DingTalkExport

现在运行:

1
scripts/archive-all-minutes.sh

它会把内容下载到项目根目录下的 download/ 文件夹。每条听记一个目录,目录名用钉钉听记的创建时间,比如:

1
download/20260507_65871790/

目录里会有这些文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
audio.mp3
transcription.json
transcription.tsv
summary.json
ai-summary.md
notes.txt
analysis.txt
chapters.tsv
keywords.json
todos.json
info.json
mind-graph-status.json
audio-url.json
list-item.json

其中 audio.mp3 是录音,transcription.tsv 是整理过的转写文本,ai-summary.md 是 AI 纪要,notes.txtanalysis.txt 是从纪要里拆出来的笔记和分析内容。

做这个工具时,有几个小坑。

一个是钉钉返回的音频地址是临时 URL,所以脚本不能只保存 URL,必须立刻下载文件。

另一个是命令行工具在管道里调用时会读标准输入,最开始批量处理时它把后面的 JSON 当成参数读进去了,导致只处理了一条。后来把脚本里的 dwscurl 都显式改成从 /dev/null 读输入,问题就解决了。

还有一个细节是目录命名。最早用标题加 ID 命名,文件夹很长,也不方便排序。后来改成用创建时间,格式是:

1
YYYYMMDD_HHMMSScc

这样文件夹天然按时间排列,也不会暴露太多标题信息。如果同一时间有多条听记,脚本会自动追加 _2_3,避免覆盖。

项目地址在这里:

1
https://github.com/onecaicai/dingtalk-minutes-export

它主要解决一个很具体的问题:把钉钉里录制的 AI 听记,连同音频、转写、笔记、AI 纪要、章节和分析文字,一起下载到本地,方便备份和后续整理。