Files
media-center/ref/tx-doc-large-reader/SKILL.md
T
sutong 750f981c7e feat: init media-center skill
资源中心——从多渠道获取资源链接,转存到夸克网盘并整理归档。
- sources/tencent-doc: 腾讯文档读取
- sources/search: 网盘搜索
- storage/quark: 夸克网盘操作
- ref/: 来源 skill 参考归档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-16 18:28:23 +08:00

172 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: tx-doc-large-reader
description: 读取超大腾讯文档(传统 doc 类型)的完整流程与避坑指南。当 get_content 超时或文档超过 10 万字时,使用 doc.resolve_document_structure 替代方案提取全文。
---
# 超大腾讯文档读取流程
## 问题背景
腾讯文档 MCP 提供 `get_content` 作为通用读取接口,但对于**超大文档**(实践验证:85 万字/2.8 万段落)存在两个问题:
1. **`get_content` 后端 TCP 超时**(5 秒固定超时),返回 `code:101, tcp client transport ReadFrame, i/o timeout`
2. **文档类型不同,读取工具不同**
- smartcanvas 类型 → `smartcanvas.read`(支持分页)
- 传统 tencentdoc 类型 → `doc.resolve_document_structure`(返回全文结构)
## 快速判断
`get_content` 超时时,先确定文档类型:
```bash
# 用 smartcanvas.read 测试文档类型(即使文档是 tencentdoc 也不会报网络错误)
mcporter call tencent-docs smartcanvas.read file_id=<FILE_ID> size=10
# 错误返回示例(说明是 tencentdoc 类型):
# type:business, code:400008, msg:file is tencentdoc, not smartcanvas
# 正确返回示例(说明是 smartcanvas 类型):
# 正常返回 JSON 内容
```
## tencentdoc 类型读取流程
### 第一步:获取文档结构
```bash
mcporter call tencent-docs doc.resolve_document_structure file_id=<FILE_ID>
```
- 返回完整的 JSON 结构,包含 `nodes` 数组
- 每个 node 包含:`text_preview`(文本预览)、`heading_level`(标题层级)、`start_index`/`end_index``type`(段落类型)
- 文档越大返回数据越大(85 万字 → 8MB JSON
### 第二步:提取文本内容
用 Python 从 JSON 中抽取所有 `text_preview`
```bash
python -X utf8 -c "
import json
# 读取上一步保存的 JSON
with open('doc_structure.json', 'r', encoding='utf-8') as f:
data = json.load(f)
nodes = data.get('nodes', [])
texts = []
for n in nodes:
preview = n.get('text_preview', '')
hl = n.get('heading_level', 0)
if preview:
if hl > 0:
texts.append('#' * hl + ' ' + preview)
else:
texts.append(preview)
full_text = '\n'.join(texts)
with open('doc_content.txt', 'w', encoding='utf-8') as f:
f.write(full_text)
print(f'Total paragraphs: {len(texts)}')
print(f'Total characters: {len(full_text)}')
"
```
### 第三步:查看内容
```bash
# 看开头部分
head -200 doc_content.txt
# 或者用 Read 工具
```
## smartcanvas 类型读取流程
smartcanvas 类型支持分页读取,适合超大文档:
```bash
# 首次读取(指定每页条数)
mcporter call tencent-docs smartcanvas.read file_id=<FILE_ID> size=50
# 获取下一页(用上一页返回的 next_token)
mcporter call tencent-docs smartcanvas.read file_id=<FILE_ID> next_token=<NEXT_TOKEN> size=50
```
参数说明:
- `size`:每页返回的 block 数量(建议 20-50
- `next_token`:分页游标,首次调用不传,后续从上次结果获取
- `page_id`:可选,指定页面 ID
## 注意事项
### 1. 编码问题
Windows 环境下 Python 默认编码为 GBK,写入包含 emoji 的文件会报错:
```
UnicodeEncodeError: 'gbk' codec can't encode character
```
**解决**:使用 `python -X utf8` 参数或显式指定 `encoding='utf-8'`
### 2. 工具选择依据
| 文档类型 | 读取工具 | 特点 |
|---------|---------|------|
| tencentdoc | `doc.resolve_document_structure` | 一次性返回全部结构,数据量大 |
| smartcanvas | `smartcanvas.read` | 支持分页,推荐 |
| 任意类型 | `get_content` | 通用接口,大文档可能超时 |
### 3. 文档类型判断方法
- `get_content` 不区分类型,但大文档可能超时
- `smartcanvas.read` 对 tencentdoc 返回明确的业务错误码 `400008`
- `doc.*` 工具对 smartcanvas 也会返回类型错误
### 4. 链接文本处理
`text_preview` 中的链接会显示为以下格式:
```
[普通链接: https://xxx]
[腾讯文档链接: https://docs.qq.com/...]
HYPERLINK "url"
```
无需额外处理,直接保留原样即可。
### 5. 资源消耗
- 85 万字文档 → 8MB JSON 响应 → 提取后约 850KB 纯文本
- 建议提取后及时清理中间 JSON 文件
- `doc.resolve_document_structure` 对超大文档可能耗时较长(实测 3-5 秒),但能正常返回不超时
### 6. 保存到本地
提取的内容建议立即写入文件,避免因 MCP 连接不稳定导致数据丢失。
## 完整示例(tencentdoc
```bash
# 1. 获取文档结构并保存
mcporter call tencent-docs doc.resolve_document_structure file_id=DR2xUcFdrSVhJTkZu > doc_structure.json
# 2. 提取文本
python -X utf8 -c "
import json
with open('doc_structure.json', 'r', encoding='utf-8') as f:
data = json.load(f)
texts = []
for n in data.get('nodes', []):
p = n.get('text_preview', '')
hl = n.get('heading_level', 0)
if p:
texts.append(('#' * hl + ' ' + p) if hl > 0 else p)
with open('doc_content.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(texts))
print(f'Done: {len(texts)} paragraphs')
"
# 3. 清理中间文件(可选)
rm doc_structure.json
```