- 重命名 plugins/ → skills/,个人插件迁移到 skills-personal/(gitignore) - 更新 generate-marketplace.py 支持 config 读取和 skills-personal 扫描 - 新增 claude-config.yaml(技能启用/禁用 + MCP 配置) - 新增 init.sh(交互式 MCP 初始化,支持 stdio/SSE 模式) - 新增 CLAUDE.md 项目说明 - 重写 README.md 反映新结构 - 删除过时脚本:PUSH.sh、generate-marketplace.sh、convert-skills.sh Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
105 lines
3.0 KiB
Python
105 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
检查飞书云文档中的图片块状态
|
|
"""
|
|
|
|
import requests
|
|
from datetime import datetime, timedelta
|
|
|
|
ZHIYUN_APP_ID = "cli_a9f29dca82b9dbef"
|
|
ZHIYUN_APP_SECRET = "sDfhjG7QT1S4gfHiMVYSygmPQPN1R2Ho"
|
|
BASE_URL = "https://open.feishu.cn/open-apis"
|
|
|
|
# 最近创建的测试文档
|
|
DOCUMENT_ID = "Z53YdDpezob1NPx63sQcsrt8nzd"
|
|
|
|
|
|
def get_token():
|
|
url = f"{BASE_URL}/auth/v3/tenant_access_token/internal"
|
|
response = requests.post(url, json={
|
|
"app_id": ZHIYUN_APP_ID,
|
|
"app_secret": ZHIYUN_APP_SECRET
|
|
})
|
|
data = response.json()
|
|
if data.get("code") != 0:
|
|
raise Exception(f"获取 token 失败: {data}")
|
|
return data["tenant_access_token"]
|
|
|
|
|
|
def get_document_blocks(document_id: str):
|
|
"""获取文档所有块"""
|
|
token = get_token()
|
|
url = f"{BASE_URL}/docx/v1/documents/{document_id}/blocks"
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
|
|
response = requests.get(url, headers=headers)
|
|
data = response.json()
|
|
|
|
if data.get("code") != 0:
|
|
raise Exception(f"获取块失败: {data}")
|
|
|
|
return data["data"].get("items", [])
|
|
|
|
|
|
def main():
|
|
print(f"\n检查文档: {DOCUMENT_ID}")
|
|
print("=" * 60)
|
|
|
|
blocks = get_document_blocks(DOCUMENT_ID)
|
|
|
|
print(f"\n文档共有 {len(blocks)} 个块:\n")
|
|
|
|
for i, block in enumerate(blocks):
|
|
block_type = block.get("block_type")
|
|
block_id = block.get("block_id")
|
|
|
|
# 块类型映射
|
|
type_names = {
|
|
1: "page",
|
|
2: "text",
|
|
3: "heading1",
|
|
4: "heading2",
|
|
5: "heading3",
|
|
12: "bullet",
|
|
13: "ordered",
|
|
14: "code",
|
|
17: "todo",
|
|
22: "divider",
|
|
27: "image",
|
|
}
|
|
type_name = type_names.get(block_type, f"type_{block_type}")
|
|
|
|
print(f" [{i}] block_type={block_type} ({type_name}), block_id={block_id[:20]}...")
|
|
|
|
# 如果是图片块,显示详细信息
|
|
if block_type == 27:
|
|
image_data = block.get("image", {})
|
|
print(f" image data: {image_data}")
|
|
|
|
# 检查图片是否有效
|
|
file_token = image_data.get("token") or image_data.get("file_token")
|
|
if file_token:
|
|
print(f" file_token: {file_token}")
|
|
# 尝试获取图片信息
|
|
check_image_status(file_token)
|
|
else:
|
|
print(f" [WARN] 图片块没有 token!")
|
|
|
|
|
|
def check_image_status(file_token: str):
|
|
"""检查图片状态"""
|
|
token = get_token()
|
|
|
|
# 尝试获取文件元信息
|
|
url = f"{BASE_URL}/drive/v1/medias/{file_token}"
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
|
|
response = requests.get(url, headers=headers)
|
|
data = response.json()
|
|
|
|
print(f" 图片状态: code={data.get('code')}, msg={data.get('msg')}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|