使用Python的ask_smapi_sdk上传音乐技能目录报错求助
问题分析与解决方法
明显错误点
- API版本不匹配:你调用
generate_catalog_upload_url_v1(v1版本)生成上传URL,但完成上传时用的是complete_catalog_upload_v0(v0版本),版本不一致会直接导致服务端无法处理请求。 - CompleteUploadRequest未配置分片信息:v1版本的完成上传请求必须包含上传分片的ETag和分片编号,你当前代码没有给请求传入这些关键参数,服务端无法验证上传内容的完整性。
- PUT请求缺少正确的Content-Type:使用
requests.put上传JSON数据时,未指定Content-Type: application/json,服务端可能无法正确解析你上传的内容。
修正后的代码示例
import json import requests from ask_smapi_sdk import StandardSmapiClient from ask_smapi_model.v1.catalog.create_content_upload_url_request import CreateContentUploadUrlRequest from ask_smapi_model.v1.catalog.complete_upload_request import CompleteUploadRequest, UploadPart # 初始化SMAPI客户端(需确保已配置正确的认证信息) client = StandardSmapiClient(...) # 1. 生成v1版本的分片上传URL upload_request = CreateContentUploadUrlRequest() upload_url_res = client.generate_catalog_upload_url_v1(catalog_id=catalog_id, create_content_upload_url_request=upload_request) # 2. 上传分片,指定正确的Content-Type target_part = upload_url_res.presigned_upload_parts[0] upload_response = requests.put( target_part.url, data=json.dumps(cat), headers={"Content-Type": "application/json"} ) upload_response.raise_for_status() # 提前捕获上传失败的情况 # 3. 构建v1版本的完成上传请求,传入分片验证信息 completed_part = UploadPart( e_tag=upload_response.headers['ETag'], part_number=target_part.part_number ) complete_upload_req = CompleteUploadRequest(parts=[completed_part]) # 4. 调用v1版本的完成上传接口 final_res = client.complete_catalog_upload_v1( catalog_id=catalog_id, complete_upload_request=complete_upload_req, full_response=True )
额外排查建议
- 确认
cat变量是符合Alexa音乐目录规范的合法JSON结构,比如必须包含items数组,每个条目需有id、title、artist等必填字段。 - 检查
catalog_id是否正确,确保该目录已在Alexa开发者控制台创建且状态正常。 - 查看详细错误信息:通过
full_response=True返回的响应体(如final_res.body)可以获取服务端返回的具体错误描述,进一步定位问题。
内容的提问来源于stack exchange,提问作者Neal
相关产品推荐
相关产品推荐

