download-torna-openapi.sh 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #!/bin/bash
  2. # Torna OpenAPI 文档下载脚本
  3. # 用法: ./download-torna-openapi.sh
  4. TORNA_API_URL="https://dev-torna.pwtk.cc/api"
  5. TOKEN="339f378808a9416ca5365e5b991e0878"
  6. OUTPUT_DIR="./torna-docs"
  7. VERSION="1.0"
  8. mkdir -p "$OUTPUT_DIR"
  9. echo "========================================"
  10. echo "Torna OpenAPI 文档下载工具"
  11. echo "========================================"
  12. echo ""
  13. # 函数:发送 OpenAPI 请求 (使用 Torna SDK 的格式 - JSON Body)
  14. send_request() {
  15. local api_name="$1"
  16. local data="$2"
  17. local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
  18. # URL 编码 data 参数
  19. local encoded_data=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$data'))")
  20. # 构建 JSON 请求体
  21. local json_body=$(cat << EOF
  22. {
  23. "name": "$api_name",
  24. "version": "$VERSION",
  25. "data": "$encoded_data",
  26. "timestamp": "$timestamp",
  27. "access_token": "$TOKEN"
  28. }
  29. EOF
  30. )
  31. curl -s -X POST "${TORNA_API_URL}" \
  32. -H "Content-Type: application/json" \
  33. -H "Accept-Language: zh-CN" \
  34. -d "$json_body"
  35. }
  36. # 1. 获取模块信息
  37. echo ">>> 1. 获取模块信息 (module.get)..."
  38. MODULE_RESULT=$(send_request "module.get" "{}")
  39. echo "$MODULE_RESULT" | jq .
  40. echo "$MODULE_RESULT" > "$OUTPUT_DIR/module-info.json"
  41. echo ""
  42. # 2. 获取文档列表
  43. echo ">>> 2. 获取文档列表 (doc.list)..."
  44. DOC_LIST_RESULT=$(send_request "doc.list" "{}")
  45. echo "$DOC_LIST_RESULT" | jq .
  46. echo "$DOC_LIST_RESULT" > "$OUTPUT_DIR/doc-list.json"
  47. echo ""
  48. # 检查是否成功
  49. CODE=$(echo "$DOC_LIST_RESULT" | jq -r '.code // "1"')
  50. if [ "$CODE" != "0" ]; then
  51. echo "请求失败,错误信息: $(echo "$DOC_LIST_RESULT" | jq -r '.msg')"
  52. echo ""
  53. echo "可能的原因:"
  54. echo "1. Token 已过期或无效"
  55. echo "2. API URL 不正确"
  56. echo ""
  57. exit 1
  58. fi
  59. # 提取文档 ID 列表
  60. DOC_IDS=$(echo "$DOC_LIST_RESULT" | jq -r '.data.docList[]?.id // empty' 2>/dev/null | head -50)
  61. if [ -n "$DOC_IDS" ]; then
  62. echo ">>> 3. 获取文档详情..."
  63. # 将 ID 列表转换为 JSON 数组
  64. IDS_ARRAY=$(echo "$DOC_IDS" | jq -R -s 'split("\n") | map(select(length > 0) | tonumber)')
  65. # 批量获取文档详情
  66. DETAILS_RESULT=$(send_request "doc.details" "{\"docIds\":$IDS_ARRAY}")
  67. echo "$DETAILS_RESULT" | jq .
  68. echo "$DETAILS_RESULT" > "$OUTPUT_DIR/doc-details.json"
  69. echo ""
  70. # 转换为 OpenAPI 格式
  71. echo ">>> 4. 生成 OpenAPI 规范文件..."
  72. python3 << 'PYTHON_SCRIPT'
  73. import json
  74. import sys
  75. try:
  76. with open("./torna-docs/doc-details.json", "r") as f:
  77. data = json.load(f)
  78. with open("./torna-docs/module-info.json", "r") as f:
  79. module_data = json.load(f)
  80. module_name = module_data.get("data", {}).get("name", "Torna API")
  81. openapi = {
  82. "openapi": "3.0.0",
  83. "info": {
  84. "title": module_name,
  85. "version": "1.0.0",
  86. "description": "从 Torna 导出的 API 文档"
  87. },
  88. "servers": [],
  89. "paths": {},
  90. "components": {
  91. "schemas": {}
  92. }
  93. }
  94. docs = data.get("data", [])
  95. if not docs:
  96. docs = []
  97. for doc in docs:
  98. if doc.get("isFolder") == 1:
  99. continue
  100. url = doc.get("url", "/unknown")
  101. if not url:
  102. continue
  103. method = (doc.get("httpMethod") or "GET").lower()
  104. if url not in openapi["paths"]:
  105. openapi["paths"][url] = {}
  106. operation = {
  107. "summary": doc.get("name", ""),
  108. "description": doc.get("description", ""),
  109. "operationId": f"{method}_{url.replace('/', '_').replace('{', '').replace('}', '')}",
  110. "tags": [],
  111. "parameters": [],
  112. "responses": {
  113. "200": {
  114. "description": "成功响应"
  115. }
  116. }
  117. }
  118. # 添加请求参数
  119. for param in (doc.get("requestParams") or []):
  120. param_obj = {
  121. "name": param.get("name", ""),
  122. "in": "query",
  123. "description": param.get("description", ""),
  124. "required": param.get("required") == 1,
  125. "schema": {
  126. "type": param.get("type", "string")
  127. }
  128. }
  129. operation["parameters"].append(param_obj)
  130. # 添加请求头
  131. for header in (doc.get("headerParams") or []):
  132. header_obj = {
  133. "name": header.get("name", ""),
  134. "in": "header",
  135. "description": header.get("description", ""),
  136. "required": header.get("required") == 1,
  137. "schema": {
  138. "type": "string"
  139. }
  140. }
  141. operation["parameters"].append(header_obj)
  142. openapi["paths"][url][method] = operation
  143. with open("./torna-docs/openapi.json", "w", encoding="utf-8") as f:
  144. json.dump(openapi, f, ensure_ascii=False, indent=2)
  145. print(f"成功生成 OpenAPI 文档,包含 {len(openapi['paths'])} 个接口路径")
  146. except Exception as e:
  147. print(f"转换失败: {e}")
  148. import traceback
  149. traceback.print_exc()
  150. sys.exit(1)
  151. PYTHON_SCRIPT
  152. else
  153. echo "未找到文档 ID,跳过详情获取"
  154. fi
  155. echo ""
  156. echo "========================================"
  157. echo "下载完成!文件保存在: $OUTPUT_DIR/"
  158. echo "========================================"
  159. ls -la "$OUTPUT_DIR/"