把钉钉DingTalk A1音频导出到本地
做了一个小工具:把钉钉DingTalk录制的 AI 听记完整下载到本地。
钉钉DingTalk是一款很好的个人效率工具,硬件端录制的音频由钉钉通过通义千问Qwen3-235B、DeepSeek-V3-671B满血版大模型 AI纪要总结,除了录音,还有转写、AI 纪要、笔记、章节、分析、关键词、待办。但这些内容平时都散在钉钉app里,想备份、整理、二次处理都不太方便。所以做一个本地导出工具,一次性把这些东西都拉下来。
项目基于这个开源仓库改的:
| |
原项目提供了一个叫 dws 的命令行工具,可以通过钉钉授权访问 AI 听记、文档、云盘、日程等能力,在这个项目基础上加了两个脚本:
| |
第一个脚本负责完整归档,第二个脚本只下载音频。
一开始只是想把录音下载下来。后来发现听记接口还能拿到更多内容,比如转写原文、AI 纪要、关键词、待办、思维导图状态等,于是就把脚本扩成了完整归档。

现在运行:
| |
它会把内容下载到项目根目录下的 download/ 文件夹。每条听记一个目录,目录名用钉钉听记的创建时间,比如:
| |
目录里会有这些文件:
| |
其中 audio.mp3 是录音,transcription.tsv 是整理过的转写文本,ai-summary.md 是 AI 纪要,notes.txt 和 analysis.txt 是从纪要里拆出来的笔记和分析内容。
做这个工具时,有几个小坑。
一个是钉钉返回的音频地址是临时 URL,所以脚本不能只保存 URL,必须立刻下载文件。
另一个是命令行工具在管道里调用时会读标准输入,最开始批量处理时它把后面的 JSON 当成参数读进去了,导致只处理了一条。后来把脚本里的 dws 和 curl 都显式改成从 /dev/null 读输入,问题就解决了。
还有一个细节是目录命名。最早用标题加 ID 命名,文件夹很长,也不方便排序。后来改成用创建时间,格式是:
| |
这样文件夹天然按时间排列,也不会暴露太多标题信息。如果同一时间有多条听记,脚本会自动追加 _2、_3,避免覆盖。
项目地址在这里:
| |
它主要解决一个很具体的问题:把钉钉里录制的 AI 听记,连同音频、转写、笔记、AI 纪要、章节和分析文字,一起下载到本地,方便备份和后续整理。