Get Project Info
获取项目的完整信息,包括名称、类型、任务状态和结果
Endpoint
GET https://openapi.kujiale.com/v2/aholo/project/info
Authentication
需要签名认证 + appuid 参数。
Request
Query Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
| appuid | Yes | String | 第三方用户ID |
| projectId | Yes | String | 项目ID |
Response
json
{
"c": "0",
"d": {
"projectId": "3FO4K4WBOFQ4",
"name": "乐高-猫头鹰",
"cover": "https://holo-cos.aholo3d.cn/resource/image/.../cover.jpg",
"projectType": 0,
"scene": "model",
"task": {
"taskId": "3FO4K4WBNNYV",
"status": 3,
"result": {
"plyPath": "https://holo-cos.aholo3d.cn/.../point_cloud.ply",
"spzPath": "https://holo-cos.aholo3d.cn/.../point_cloud_compressed.spz",
"sogPath": "https://holo-cos.aholo3d.cn/.../point_cloud.sog"
}
},
"created": 1772638627000,
"lastModified": 1772640130000
},
"m": null,
"f": ""
}
Fields
| Field | Type | Description |
|---|---|---|
| projectId | String | 项目ID |
| name | String | 项目名称 |
| cover | String/null | 封面图 URL |
| projectType | Int | 项目类型。0=重建, 1=生成 |
| scene | String | 场景类型。model=物体, space=室内 |
| task | Object/null | 任务详情 |
| created | Long | 创建时间(毫秒时间戳) |
| lastModified | Long | 最后修改时间(毫秒时间戳) |
Task Object
| Field | Type | Description |
|---|---|---|
| taskId | String | 任务ID |
| status | Int | 任务状态(见状态枚举) |
| result | Object/null | 任务结果(成功时有) |
Result Object
| Field | Type | Description |
|---|---|---|
| plyPath | String | PLY 点云文件 URL |
| spzPath | String | SPZ 压缩文件 URL |
| sogPath | String | SOG 优化格式 URL |
Project Types
| projectType | Description | Created By |
|---|---|---|
| 0 | 3D 重建 | create-3d-recon |
| 1 | 3D 生成 | create-3d-gen |
Task Status Enum
| Status | Meaning | Is Final |
|---|---|---|
| 0 | 排队中 | 否 |
| 1 | 等待执行 | 否 |
| 2 | 执行中 | 否 |
| 3 | 成功 | ✓ 是 |
| 4 | 失败 | ✓ 是 |
| 5 | 取消 | ✓ 是 |
| 6 | 超时 | ✓ 是 |
| 7 | 被拒绝 | ✓ 是 |
| 8 | 预处理中 | 否 |
Code Examples
Python
python
import requests
from datetime import datetime
APPUID = "your_appuid"
BASE_URL = "https://openapi.kujiale.com/v2/aholo"
def get_project_info(project_id):
"""获取项目完整信息"""
response = requests.get(
f"{BASE_URL}/project/info",
params={
"appuid": APPUID,
"projectId": project_id
}
# 注意:实际需添加签名认证
)
if response.json()["c"] != "0":
raise Exception("获取项目信息失败")
return response.json()["d"]
def print_project_info(project):
"""打印项目信息摘要"""
print("\n" + "="*50)
print("📋 项目信息")
print("="*50)
print(f"ID: {project['projectId']}")
print(f"名称: {project['name']}")
# 项目类型
type_text = "重建" if project['projectType'] == 0 else "生成"
print(f"类型: {type_text} (projectType={project['projectType']})")
# 场景
scene_text = "物体" if project['scene'] == "model" else "室内"
print(f"场景: {scene_text}")
# 时间
created = datetime.fromtimestamp(project['created']/1000)
modified = datetime.fromtimestamp(project['lastModified']/1000)
print(f"创建时间: {created}")
print(f"修改时间: {modified}")
# 封面
if project['cover']:
print(f"封面: {project['cover']}")
# 任务状态
task = project.get('task')
if task:
status = task['status']
status_map = {
0: "排队中",
1: "等待执行",
2: "执行中",
3: "成功",
4: "失败",
5: "取消",
6: "超时",
7: "被拒绝",
8: "预处理中"
}
print(f"\n任务状态: {status_map.get(status, f'未知({status})')}")
if status == 3 and task.get('result'):
print("\n📦 3D 资产:")
result = task['result']
print(f" PLY: {result['plyPath']}")
print(f" SPZ: {result['spzPath']}")
print(f" SOG: {result['sogPath']}")
print("="*50)
# 使用示例
project = get_project_info("3FO4K4WBOFQ4")
print_project_info(project)
Python - 获取资产 URL
python
def get_project_assets(project_id):
"""获取项目的 3D 资产 URL"""
project = get_project_info(project_id)
task = project.get('task')
if not task or task['status'] != 3:
return None
return task.get('result')
# 使用示例
assets = get_project_assets("3FO4K4WBOFQ4")
if assets:
print(f"PLY: {assets['plyPath']}")
print(f"SPZ: {assets['spzPath']}")
else:
print("项目未完成或无结果")
JavaScript
javascript
const APPUID = 'your_appuid';
const BASE_URL = 'https://openapi.kujiale.com/v2/aholo';
async function getProjectInfo(projectId) {
const response = await fetch(
`${BASE_URL}/project/info?appuid=${APPUID}&projectId=${projectId}`
);
const data = await response.json();
if (data.c !== '0') {
throw new Error('获取项目信息失败');
}
return data.d;
}
function printProjectInfo(project) {
console.log('\n' + '='.repeat(50));
console.log('📋 项目信息');
console.log('='.repeat(50));
console.log(`ID: ${project.projectId}`);
console.log(`名称: ${project.name}`);
const typeText = project.projectType === 0 ? '重建' : '生成';
console.log(`类型: ${typeText}`);
const sceneText = project.scene === 'model' ? '物体' : '室内';
console.log(`场景: ${sceneText}`);
const created = new Date(project.created);
console.log(`创建时间: ${created.toLocaleString()}`);
if (project.task) {
const status = project.task.status;
const statusMap = {
0: '排队中', 1: '等待执行', 2: '执行中',
3: '成功', 4: '失败', 5: '取消', 6: '超时', 7: '被拒绝', 8: '预处理中'
};
console.log(`\n任务状态: ${statusMap[status]}`);
if (status === 3 && project.task.result) {
console.log('\n📦 3D 资产:');
console.log(` PLY: ${project.task.result.plyPath}`);
console.log(` SPZ: ${project.task.result.spzPath}`);
console.log(` SOG: ${project.task.result.sogPath}`);
}
}
console.log('='.repeat(50));
}
// 使用示例
const project = await getProjectInfo('3FO4K4WBOFQ4');
printProjectInfo(project);
cURL
bash
curl -X GET "https://openapi.kujiale.com/v2/aholo/project/info?appuid=your_appuid&projectId=3FO4K4WBOFQ4"
Notes
- 完整信息: 包含项目元数据和任务结果
- 时间戳:
created和lastModified是毫秒级时间戳 - 与 Task Status 对比:
- Task Status 接口用于轮询等待
- Project Info 用于获取完整项目信息
- 推荐用法: 任务完成后用此接口获取持久化的项目信息
Use Cases
- 检查项目状态: 创建后检查是否完成
- 获取资产 URL: 下载 3D 文件
- 项目管理: 列出、展示项目信息
- 历史查询: 后续访问已创建的项目
Error Codes
| Code | Description |
|---|---|
| -1 | 调用失败 |