把 TAPD 内容导出为 Word(个人备份小工具)
152
https://github.com/riseopc/tapd2word
把 TAPD 内容导出为 Word(个人备份小工具):
tapd_story2word.py)tapd_wiki2word.py)💡 支持 Windows/macOS/Linux 本地运行,也支持 Docker(更适合 CI/无 Python 环境)。
python src/tapd_story2word.py \
--url "https://www.tapd.cn/{workspace_id}/prong/stories/view/{story_id}" \
--cookie "你的 Cookie" \
--use-playwright \
--output "story_{story_id}.docx"
python src/tapd_story2word.py \
--export-story-list \
--workspace-id <workspace_id> \
--conf-id <conf_id> \
--cookie "你的 Cookie" \
--use-playwright \
--output-dir output \
--dump-html-dir output/dump_html
python src/tapd_wiki2word.py \
--wiki-index-url "https://www.tapd.cn/{workspace_id}/wiki/index" \
--cookie "你的 Cookie" \
--output-dir output_wiki
.docx。data:image/...;base64,... 内联图片;div.content-wrap 等内容区域,可用 --root-selector 精准控制。pip install -r requirements.txt
python -m playwright install
Docker 场景一般不需要手动执行
playwright install(基础镜像已包含浏览器与依赖)。
在 Windows 下双击或命令行运行 run_tapd2word.bat,按提示选择模式并输入参数即可:
output/ 目录。output_wiki/。脚本自动设置 UTF-8 编码,减少中文乱码。
(已集成 Wiki 导出,无需单独脚本。)
python src/tapd_wiki2word.py \
--wiki-index-url "https://www.tapd.cn/{workspace_id}/markdown_wikis/show/#{wiki_id}" \
--cookie "你的 Cookie" \
--output-dir output_wiki
--wiki-index-url:Wiki 索引页 URL,或任意包含侧边栏目录的 Wiki 页面 URL。--cookie:浏览器开发者工具 Network 面板里任意 https://www.tapd.cn/... 请求头的整行 Cookie 值。--output-dir:导出目录(默认 output_wiki/)。--headed:显示 Playwright 浏览器窗口(即 headless=false),便于观察页面交互与定位问题。--slow-mo-ms:Playwright 操作慢放(对应 slow_mo,单位毫秒)。调试时可配合 --headed 使用,例如 --slow-mo-ms 300。使用用例(批量导出 Wiki 的下载结果示例):

output_wiki/(你也可以通过 --output-dir 自定义)。001_<标题>_<wiki_id>.docx(或 .doc)。\n - 001:按目录顺序自动编号,方便按导出顺序浏览\n - <标题>:从 Wiki 标题提取并做文件名安全化(去除 \\/:*?\"<>| 等非法字符)\n - <wiki_id>:保底唯一标识,避免同名覆盖.doc:如果走“页面点击下载”模式,脚本会尊重 TAPD 下载建议的扩展名,所以可能保存为 .doc;如需更一致的格式可尝试 --use-post。_debug/ 目录:下载失败或取 token 失败时会把截图/HTML/原始响应等调试信息放在 output_wiki/_debug/ 便于排查(正常成功时可能为空)。适合:在浏览器里把 TAPD 页面「网页,全部」保存到本地,然后离线转换为 Word。
python src/tapd_story2word.py \
--html-file tapd_story.html \
--title "某个需求文档"
--html-file:浏览器保存下来的 HTML 文件路径。--output:导出的 Word 路径;不填时默认使用文档标题作为文件名,即 <标题>.docx,若标题不可用时兜底为 tapd_story_export.docx。--title:Word 顶部标题(不填则使用 HTML <title>)。适合:给定 TAPD 故事详情链接,自动抓取页面、解析正文、下载图片并导出为 Word。
python src/tapd_story2word.py \
--url "https://www.tapd.cn/{workspace_id}/prong/stories/view/{story_id}" \
--cookie "__root_domain_v=...; tapdsession=...; t_i_token=..." \
--use-playwright \
--output "story_{story_id}.docx"
参数说明:
--url:TAPD 故事 / 需求详情页 URL。--cookie:从浏览器开发者工具 Network 面板中,任意一个 https://www.tapd.cn/... 请求头里的整行 Cookie 值。
__root_domain_v=...; tapdsession=...; t_i_token=...。--use-playwright:
--headed:显示 Playwright 浏览器窗口(即 headless=false)。用于调试/排查点击与选择器问题。--slow-mo-ms:Playwright 操作慢放(对应 slow_mo,单位毫秒),调试时建议配合 --headed 使用(如 --slow-mo-ms 300)。--output:输出 Word 文件名,不填时默认 <标题>.docx。从 TAPD 需求列表接口分页获取所有需求并逐个导出为 Word:
python src/tapd_story2word.py \
--export-story-list \
--workspace-id <你的workspace_id> \
--conf-id <你的conf_id> \
--cookie "你的 Cookie" \
--use-playwright \
--output-dir output \
--dump-html-dir output/dump_html
API 无法获取列表时的兜底方案:使用 --list-page-url 指定需求列表页面 URL,脚本会通过 Playwright 打开页面、解析其中的需求链接,再逐个导出:
python src/tapd_story2word.py \
--export-story-list \
--workspace-id <workspace_id> \
--conf-id <conf_id> \
--cookie "你的 Cookie" \
--use-playwright \
--list-page-url "https://www.tapd.cn/<workspace_id>/story/list?conf_id=<conf_id>"
在线模式 + Playwright 下,可以顺便生成当前页面截图:
python src/tapd_story2word.py \
--url "https://www.tapd.cn/{workspace_id}/prong/stories/view/{story_id}" \
--cookie "你的 Cookie" \
--use-playwright \
--output "story_{story_id}.docx" \
--screenshot "story_{story_id}.png"
full_page=True),适合存档或快速预览。默认情况下,脚本会按以下优先级自动选择正文容器:
div.content-wrap(TAPD SPA 主内容区域)div.rich-textdiv.story-contentdiv.story-detaildiv#descriptionbody如果你的 TAPD 页面结构有差异,或者希望进一步收紧只导出某个区域,可以用 --root-selector 手动指定 CSS 选择器(当前实现已经支持该参数,在线 URL 模式同样生效):
python src/tapd_story2word.py \
--url "..." \
--cookie "..." \
--use-playwright \
--root-selector "div.rich-text" \
--output "story.docx"
提示:在浏览器里选中你认为是“需求正文”的最外层元素,查看它的
id/class,例如#story-description、.rich-text等,然后写进--root-selector即可。
当前版本会尽量保留 TAPD 页面中的以下信息:
--title,否则用 HTML <title>。<h1> ~ <h6> → Word 标题(对应 0~5 级)。<p> → 普通段落。<ul>/<ol>/<li> → 项目符号列表。data:image/...;base64,... 内联图片;data-src / data-original;TAPD_Logo 的 URL)。<table> → Word 网格表,保留单元格文本。错误/告警信息(如个别图片下载失败)不会写入 Word,只会在控制台输出 [warn] ... 便于排查,避免污染需求文档内容。
<标题>.docx(标题为空兜底 tapd_story_export.docx)。为避免中文/特殊字符路径差异,建议显式传 --output。--output-dir(默认 output/),文件名固定 story_{id}.docx;可选 --dump-html-dir 保存调试 HTML。--output-dir(默认 output_wiki/),文件名形如 001_<title>_<wiki_id>.(docx/doc);点击下载模式下扩展名可能按 TAPD 建议保存为 .doc。output_wiki/_debug/。导出为空 / 只有登录页
--cookie 是否是“当前已登录账号”的 Cookie;Word 里缺少部分正文 / 含有多余导航文案
--root-selector,把根节点锁定到具体的“需求描述区域”;我们已经在 Docker Hub 上提供了预构建的镜像,你可以直接拉取使用,无需本地配置 Python 环境或安装 Playwright 依赖。
docker pull riseopc/tapd2word:1.0.0
docker run --rm -v /path/to/output:/app/output riseopc/tapd2word:1.0.0 \
story --url "..." --cookie "..." --use-playwright \
--output "/app/output/story.docx"
docker run --rm -v /path/to/output_wiki:/app/output_wiki riseopc/tapd2word:1.0.0 \
wiki --wiki-index-url "https://www.tapd.cn/{workspace_id}/markdown_wikis/show/#{wiki_id}" \
--cookie "你的 Cookie" \
--output-dir "/app/output_wiki"
提示:如果容器内 Chromium 出现超时/崩溃,建议加上
--shm-size=1g。
如果你想自行修改代码或构建镜像,可以参考以下流程:
docker build -t tapd2word:local .
docker compose run 并显式传 story/wiki 子命令:docker compose run --rm tapd2word story --help
docker compose run --rm tapd2word wiki --help
注意:容器内能否访问 TAPD,取决于公司网络 / VPN / 容器网络配置,请按实际环境调整。
--cookie 属于敏感信息:不要写进代码仓库、不要发到群里、不要贴到公开 issue。Content type
Image
Digest
sha256:dc254b472…
Size
925.4 MB
Last updated
6 months ago
docker pull riseopc/tapd2word:1.0.0