Skip to content

Python 示例

完整的 Python 代码示例,实现从上传到获取 3D 结果的完整流程。

安装依赖

bash
pip install requests

完整代码

python
import requests
import hashlib
import time

# 配置
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://openapi.kujiale.com"
APP_UID = "user123"


def get_upload_token():
    """获取上传 Token"""
    url = f"{BASE_URL}/v2/aholo/upload/token"
    params = {"appuid": APP_UID}
    headers = {"Authorization": f"Bearer {API_KEY}"}
    
    resp = requests.post(url, params=params, headers=headers)
    data = resp.json()
    
    if data["c"] != "0":
        raise Exception(f"获取 Token 失败: {data}")
    
    return data["d"]["globalDomain"], data["d"]["ousToken"]


def upload_file(global_domain, ous_token, file_path):
    """上传文件并返回 URL"""
    # 计算 MD5
    with open(file_path, "rb") as f:
        file_data = f.read()
        md5 = hashlib.md5(file_data).hexdigest()
    
    # 上传
    url = f"https://{global_domain}/ous/api/v2/single/upload"
    headers = {"ous-token-v2": ous_token}
    
    with open(file_path, "rb") as f:
        files = {"file": f}
        data = {"md5": md5}
        resp = requests.post(url, headers=headers, files=files, data=data)
    
    result = resp.json()
    if result["c"] != "0":
        raise Exception(f"上传失败: {result}")
    
    # 轮询状态
    status_url = f"https://{global_domain}/ous/api/v2/upload/status"
    for _ in range(50):  # 最多等待 10秒
        resp = requests.get(status_url, headers=headers)
        data = resp.json()["d"]
        
        if data["status"] == 5:  # 成功
            return data["url"]
        elif data["status"] in [6, 8]:  # 失败
            raise Exception(f"上传失败: status={data['status']}")
        
        time.sleep(0.2)
    
    raise Exception("上传超时")


def create_3d_gen_project(image_url, prompt):
    """创建 3D 生成项目"""
    url = f"{BASE_URL}/v2/aholo/project/create-3d-gen"
    params = {"appuid": APP_UID}
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    payload = {
        "projectName": "AI Generated 3D",
        "prompt": prompt,
        "resources": [{
            "name": "input.jpg",
            "type": 0,
            "url": image_url,
            "meta": {"width": 1920, "height": 1080}
        }]
    }
    
    resp = requests.post(url, params=params, headers=headers, json=payload)
    data = resp.json()
    
    if data["c"] != "0":
        raise Exception(f"创建项目失败: {data}")
    
    return data["d"]  # project_id


def get_project_info(project_id):
    """获取项目信息"""
    url = f"{BASE_URL}/v2/aholo/project/info"
    params = {"appuid": APP_UID, "projectId": project_id}
    headers = {"Authorization": f"Bearer {API_KEY}"}
    
    resp = requests.get(url, params=params, headers=headers)
    return resp.json()["d"]


def wait_for_result(project_id, timeout=120):
    """等待项目完成"""
    for _ in range(timeout // 3):
        info = get_project_info(project_id)
        status = info["task"]["status"]
        
        if status == 3:  # 完成
            return info["task"]["result"]
        elif status == 4:  # 失败
            raise Exception("项目处理失败")
        
        time.sleep(3)
    
    raise Exception("等待超时")


def main():
    """完整流程"""
    print("1. 获取上传 Token...")
    global_domain, ous_token = get_upload_token()
    
    print("2. 上传图片...")
    image_url = upload_file(global_domain, ous_token, "input.jpg")
    print(f"   图片 URL: {image_url}")
    
    print("3. 创建 3D 生成项目...")
    project_id = create_3d_gen_project(image_url, "生成客厅空间")
    print(f"   项目 ID: {project_id}")
    
    print("4. 等待处理完成...")
    result = wait_for_result(project_id)
    
    print("5. 结果文件:")
    print(f"   PLY: {result['plyPath']}")
    print(f"   SPZ: {result['spzPath']}")
    print(f"   SOG: {result['sogPath']}")


if __name__ == "__main__":
    main()

运行

bash
python aholo_example.py

输出示例:

1. 获取上传 Token...
2. 上传图片...
   图片 URL: https://cdn.aholo.ai/path/to/file.jpg
3. 创建 3D 生成项目...
   项目 ID: 3FO4K4WF1A22
4. 等待处理完成...
5. 结果文件:
   PLY: https://holo-cos.aholo3d.cn/.../point_cloud.ply
   SPZ: https://holo-cos.aholo3d.cn/.../point_cloud_compressed.spz
   SOG: https://holo-cos.aholo3d.cn/.../point_cloud.sog