接口调用流程图
常见问题:
1、新版和旧版相比有什么变化? 新版提供了100+主题模板,并且联网搜索、ai配图等功能
2、新版的模板全部免费吗? 新版的100+主题模板全部免费使用,不再额外扣量
3、新版和旧版的接口可以混用吗? 新版的接口地址与旧版不同,虽然两者的调用流程相似,但新版接口和旧版接口不能混用
4、如何查看旧版接口文档地址? 联系上方技术支持,获取旧版接口文档,注意:旧版接口已不再维护
#接口调用示例
部分开发语言Demo如下,其他开发语言请参照文档进行开发,欢迎大家到讯飞开放平台社区交流集成经验。
智能PPT生成(新版)Demo Java语言
智能PPT生成(新版)Demo Python语言
#接口与鉴权
#接口域名
zwapi.xfyun.cn
#获取签名
在HTTP请求头 header 中设置参数:
appId
,timestamp
,signature
String appId = "应用ID";
String secret = "应用的秘钥";
long timestamp = System.currentTimeMillis()/1000;
String signature = ApiAuthAlgorithm.getSignature(appId, secret, timestamp);request.setHeader("appId",appId);
request.setHeader("timestamp",str(timestamp));
request.setHeader("signature",signature);
字段名 | 类型 | 描述 | 必须 | 默认值 |
---|---|---|---|---|
appId | String | 应用ID | Y | |
timestamp | String | 时间戳,单位: s,与服务端时间相差五分钟之内 | Y | |
signature | String | 签名 | Y |
#DEMO
ApiAuthAlgorithm.class
鉴权类
public class ApiAuthAlgorithm {private static final char[] MD5_TABLE = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};/*** 获取签名** @param appId 签名的key* @param secret 签名秘钥* @return 返回签名*/public String getSignature(String appId, String secret, long ts) {try {String auth = md5(appId + ts);return hmacSHA1Encrypt(auth, secret);} catch (SignatureException e) {return null;}}/*** sha1加密** @param encryptText 加密文本* @param encryptKey 加密键* @return 加密*/private String hmacSHA1Encrypt(String encryptText, String encryptKey) throws SignatureException {byte[] rawHmac;try {byte[] data = encryptKey.getBytes(StandardCharsets.UTF_8);SecretKeySpec secretKey = new SecretKeySpec(data, "HmacSHA1");Mac mac = Mac.getInstance("HmacSHA1");mac.init(secretKey);byte[] text = encryptText.getBytes(StandardCharsets.UTF_8);rawHmac = mac.doFinal(text);} catch (InvalidKeyException e) {throw new SignatureException("InvalidKeyException:" + e.getMessage());} catch (NoSuchAlgorithmException e) {throw new SignatureException("NoSuchAlgorithmException:" + e.getMessage());}return new String(Base64.encodeBase64(rawHmac));}private String md5(String cipherText) {try {byte[] data = cipherText.getBytes();// 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。MessageDigest mdInst = MessageDigest.getInstance("MD5");// MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要mdInst.update(data);// 摘要更新之后,通过调用digest()执行哈希计算,获得密文byte[] md = mdInst.digest();// 把密文转换成十六进制的字符串形式int j = md.length;char[] str = new char[j * 2];int k = 0;for (byte byte0 : md) { // i = 0str[k++] = MD5_TABLE[byte0 >>> 4 & 0xf]; // 5str[k++] = MD5_TABLE[byte0 & 0xf]; // F}// 返回经过加密后的字符串return new String(str);} catch (Exception e) {return null;}}
}
#错误码
错误码 | 描述 | 处理方式 |
---|---|---|
20002 | 参数错误 | 确认接口入参 |
20005 | 大纲生成失败 | 查看是否存在敏感词汇,尝试重新生成 |
20006 | PPT生成失败 | PPT导出错误,请重新生成或联系技术人员 |
20007 | 鉴权错误 | 检查鉴权信息 |
9999 | 系统异常 | 确认鉴权信息、请求方式、请求参数是否有误,或联系技术人员排查相关日志 |
#接口列表
#1、PPT主题列表查询
1.1 接口地址:
https://zwapi.xfyun.cn/api/ppt/v2/template/list
1.2 请求示例:
{"style": "简约","color": "红色","industry": "教育培训","pageNum": 1,"pageSize": 10
}
1.3 请求查询参数:
POST,application/json
注意:请求体不能为空,至少有一项。
名称 | 类型 | 描述 | 必须 | 默认值 |
---|---|---|---|---|
style | String | 风格类型: "简约","卡通","商务","创意","国风","清新","扁平","插画","节日" | N | |
color | String | 颜色类型: "蓝色","绿色","红色","紫色","黑色","灰色","黄色","粉色","橙色" | N | |
industry | String | 行业类型: "科技互联网","教育培训","政务","学院","电子商务","金融战略","法律","医疗健康","文旅体育","艺术广告","人力资源","游戏娱乐" | N | |
pageNum | Integer | 页数 | N | 1 |
pageSize | Integer | 每页数量 | N | 10 |
1.4 响应参数:
{"flag": true,"code": 0,"desc": "成功","count": null,"data": {"total": 110,"records": [{"templateIndexId": "202407171E27C9D","pageCount": 5,"type": "system_template","color": "蓝色","industry": "教育培训","style": "卡通","detailImage": "{\"titleCoverImageLarge\":\"https://sgw-dx.xf-yun.com/api/v1/sparkdesk/19052329831_W7Ct1g1723193798025-04123504173892696.jpeg?authorization=c2ltcGxlLWp3dCBhaz1zcGFya2Rlc2s4MDAwMDAwMDAwMDE7ZXhwPTMyOTk5OTM3OTk7YWxnbz1obWFjLXNoYTI1NjtzaWc9TDFIc01LbjFuNnNhSlZLZ21MK0VNdXhnSTBkdzBzM0VnbjdpL290dWd2VT0=&x_location=7YfmxI7B7uKO7jlRxIftd6Mbdo==\",\"titleCoverImage\":\"https://sgw-dx.xf-yun.com/api/v1/sparkdesk/19052329831_WAl06h1723193799949-04329013386342242.jpeg?authorization=c2ltcGxlLWp3dCBhaz1zcGFya2Rlc2s4MDAwMDAwMDAwMDE7ZXhwPTMyOTk5OTM4MDA7YWxnbz1obWFjLXNoYTI1NjtzaWc9YTFSbVJGaWpqQ3lYendNVzhHZVdvVXFQWStxNVNzN0ppck9lczZnMU00dz0=&x_location=7YfmxI7B7uKO7jlRxIftd6Mbdo==\",\"catalogueCoverImage\":\"https://sgw-dx.xf-yun.com/api/v1/sparkdesk/19052329831_AA2WnD1723193801664-05558363837592131.jpeg?authorization=c2ltcGxlLWp3dCBhaz1zcGFya2Rlc2s4MDAwMDAwMDAwMDE7ZXhwPTMyOTk5OTM4MDE7YWxnbz1obWFjLXNoYTI1NjtzaWc9Ymw0UVlick9jTjVVU1hkMHU2QXFjSUZTM2JtNmVWUk9FLytkc2NWU0JjUT0=&x_location=7YfmxI7B7uKO7jlRxIftd6Mbdo==\",\"chapterCoverImage\":\"https://sgw-dx.xf-yun.com/api/v1/sparkdesk/19052329831_5Vs2cK1723193803147-042723137781772724.jpeg?authorization=c2ltcGxlLWp3dCBhaz1zcGFya2Rlc2s4MDAwMDAwMDAwMDE7ZXhwPTMyOTk5OTM4MDM7YWxnbz1obWFjLXNoYTI1NjtzaWc9RmxFQTk5RWY3RElSUkEwMWQ2QUFmTi9aTFR6YVNKeU55MVJ5NUc3T05QWT0=&x_location=7YfmxI7B7uKO7jlRxIftd6Mbdo==\",\"contentCoverImage\":\"https://sgw-dx.xf-yun.com/api/v1/sparkdesk/19052329831_FVPl8y1723193804494-07550240915105764.jpeg?authorization=c2ltcGxlLWp3dCBhaz1zcGFya2Rlc2s4MDAwMDAwMDAwMDE7ZXhwPTMyOTk5OTM4MDQ7YWxnbz1obWFjLXNoYTI1NjtzaWc9cTJJeE5sYTdaTk52VlBnRTAvbjQrZDRBeWptUDdERStxc3BvRWorQTZRZz0=&x_location=7YfmxI7B7uKO7jlRxIftd6Mbdo==\",\"endCoverImage\":\"https://sgw-dx.xf-yun.com/api/v1/sparkdesk/19052329831_DV5MCg1723193805753-07957067972264273.jpeg?authorization=c2ltcGxlLWp3dCBhaz1zcGFya2Rlc2s4MDAwMDAwMDAwMDE7ZXhwPTMyOTk5OTM4MDY7YWxnbz1obWFjLXNoYTI1NjtzaWc9RlIraDdTMFJkUVhoc1BkMCs4dldNSWRGNkNZdGlFZ3V6TlZlTkJGK1NLMD0=&x_location=7YfmxI7B7uKO7jlRxIftd6Mbdo==\"}"},...],"pageNum": 1}
}
1.5 响应描述
响应字段 | 类型 | 描述 |
---|---|---|
flag | Boolean | 响应标识 |
code | Integer | 错误码 |
desc | String | 错误详情 |
count | Integer | 不用关注,预留 |
data.total | Long | PPT主题列表总数 |
data.records | array | PPT主题列表集合 |
data.records[]. templateIndexId | String | 供用户检索模板的ID |
data.records[]. pageCount | Integer | 总页数 |
data.records[]. type | String | 类型 |
data.records[]. color | String | 颜色类型 |
data.records[]. industry | String | 行业类型 |
data.records[]. style | String | 风格类型 |
data.records[]. detailImage | String | 详细图 |
data.records[]. payType | String | 模板支付方式,注意:所有模板均已免费使用 |
#2、PPT生成(直接根据用户输入要求,获得最终PPT)
2.1 接口描述:
基于用户提示、文档等相关内容生成PPT,字数不得超过8000字,文件限制10M。
2.2 接口地址:
https://zwapi.xfyun.cn/api/ppt/v2/create
2.3 请求查询参数:
POST,multipart/form-data
名称 | 类型 | 描述 | 必须 | 默认值 |
---|---|---|---|---|
file | MultipartFile | 上传文件 (file、fileUrl、query必填其一) | N | |
query | String | 用户生成PPT要求(最多8000字;file、fileUrl、query必填其一) 注意:query不能为空字符串、仅包含空格的字符串 | N | |
templateId | String | 直接供用户检索模板的ID,从PPT主题列表查询中获取 | N | |
businessId | String | 业务ID(非必传)- 业务方自行决定是否使用 | N | |
author | String | PPT作者名:用户自行选择是否设置作者名 | N | 智文 |
isCardNote | Boolean | 是否生成PPT演讲备注 | N | false |
search | Boolean | 是否联网搜索 | N | false |
language | String | 语种 | N | cn |
fileUrl | String | 文件地址(file、fileUrl、query必填其一) | N | |
fileName | String | 文件名(带文件名后缀;如果传file或者fileUrl,fileName必填) | N | |
isFigure | Boolean | 是否自动配图 | N | false |
aiImage | String | ai配图类型: normal、advanced (isFigure为true的话生效); normal-普通配图,20%正文配图;advanced-高级配图,50%正文配图 | N |
2.4 可选参数列表:
-
language:
- cn:中文(简体)
- en:英语
- ja:日语
- ru:俄语
- ko:韩语
- de:德语
- fr:法语
- pt:葡萄牙语
- es:西班牙语
- it:意大利语
- th:泰语
2.5 请求响应:
{"flag": true,"code": 0,"desc": "成功","count": null,"data": {"sid": "7416b894bdd54ccc95bab7400113989e","coverImgSrc": "https://bjcdn.openstorage.cn/xinghuo-privatedata/zhiwen/2024-11-07/3d19478b-cac2-47c2-a238-ae25b9d4b900/81b87056834d4a1fb923dcf03bea4918.png","title": "合肥天气趋势分析","subTitle": "探索气候变化与城市生活影响","outline": null}
}
2.6 响应描述
响应字段 | 类型 | 描述 |
---|---|---|
flag | Boolean | 响应标识 |
code | Integer | 错误码 |
desc | String | 错误详情 |
count | Integer | 不用关注,预留 |
data.sid | string | 请求唯一id |
data.CoverImgSrc | string | PPT封面图链接 |
data.title | string | PPT主标题 |
data.subTitle | string | PPT副标题 |
data.outline | string | PPT大纲 |
#3、大纲生成
3.1 接口地址:
https://zwapi.xfyun.cn/api/ppt/v2/createOutline
3.2 请求参数查询
POST,multipart/form-data
名称 | 类型 | 描述 | 必须 | 默认值 |
---|---|---|---|---|
query | String | 用户生成PPT要求(最多8000字) 注意:query不能为空字符串、仅包含空格的字符串 | Y | |
businessId | String | 业务ID(非必传)- 业务方自行决定是否使用 | N | |
language | String | 语种 | N | cn |
search | Boolean | 是否联网搜索 | N | false |
3.3 请求响应
{"flag": true,"code": 0,"desc": "成功","count": null,"data": {"sid": "a88306c606c746178c2816b996c45125","outline": {"title": "秋分时节的农业管理策略","subTitle": "提升农作物产量的关键措施","chapters": [{"chapterTitle": "秋分简介","chapterContents": [{"chapterTitle": "定义与时间"},{"chapterTitle": "历史背景"}]},{"chapterTitle": "秋分的天文意义","chapterContents": [{"chapterTitle": "昼夜平分"},{"chapterTitle": "太阳直射点变化"}]}]}}
}
3.4 响应描述
响应字段 | 类型 | 描述 |
---|---|---|
flag | Boolean | 响应标识 |
code | Integer | 错误码 |
desc | String | 错误详情 |
count | Integer | 不用关注,预留 |
data.sid | string | 请求大纲唯一id,后续通过大纲生成ppt可能需要 |
data.outline | object | 大纲数据 |
data.outline.title | string | PPT主标题 |
data.outline.subTitle | string | PPT副标题 |
data.outline.chapters[].chapterTitle | string | 章节、子章节标题名称 |
data.outline.chapters[].chapterContents[] | array | 二级大纲内容 |
3.5 大纲结构体说明(data.outline)
public class Outline {// 主标题private String title;// 副标题private String subTitle;/*** 文档的章节列表。*/private List<Outline.Chapter> chapters;public static class Chapter {// 章节、子章节标题名称String chapterTitle;// 二级大纲chapterContents为空List<Outline.Chapter> chapterContents = null;}
}
#4、自定义大纲生成
4.1 接口描述:
基于用户提示、文档等相关内容生成PPT大纲,字数不得超过8000字,文件限制10M。
上传文件支持pdf(不支持扫描件)、doc、docx、txt、md格式的文件。
4.2 接口地址:
https://zwapi.xfyun.cn/api/ppt/v2/createOutlineByDoc
4.3 请求查询参数:
POST,multipart/form-data
名称 | 类型 | 描述 | 必须 | 默认值 |
---|---|---|---|---|
query | String | 用户生成PPT要求(最多8000字) | N | |
businessId | String | 业务ID(非必传)- 业务方自行决定是否使用 | N | |
language | String | 语种 | N | cn |
search | Boolean | 是否联网搜索 | N | false |
fileName | String | 文件名,带后缀 | Y | |
fileUrl | String | 文件地址 | N | |
file | MultipartFile | 上传文件 | N |
4.4请求响应与说明
见3.3、3.4小节说明
#5、通过大纲生成PPT
5.1 接口地址:
https://zwapi.xfyun.cn/api/ppt/v2/createPptByOutline
5.2 请求示例:
{"outline": {"title": "烧烤制作方法","subTitle": "从食材准备到成品展示","chapters": [{"chapterTitle": "烧烤概述","chapterContents": [{"chapterTitle": "烧烤定义与起源与发展","chapterContents": null}]}]},"language": "cn","isCardNote": true,"aiImage": "advanced","search":true,"isFigure":true,"author":"测试","query":"烧烤"
}
5.3 请求查询参数:
POST,application/json
名称 | 类型 | 描述 | 必须 | 默认值 |
---|---|---|---|---|
query | String | 用户生成PPT要求(最多8000字) 注意:query不能为空字符串、仅包含空格的字符串 | Y | |
outlineSid | String | 已生成大纲后,响应返回的请求大纲唯一id (见 3.4 小节返回字段data.sid) | N | |
outline | JSONObject | 大纲内容(不得超过20个一级大纲--outline.chapters[].chapterTitle,见 3.4 小节返回字段data.outline) | Y | |
templateId | String | 直接供用户检索模板的ID,从PPT主题列表查询中获取;见 1.5 小节返回字段templateIndexId;为空的话,从free模板中随机取一个 | N | |
businessId | String | 业务ID(非必传)- 业务方自行决定是否使用 | N | |
author | String | PPT作者名:用户自行选择是否设置作者名 | N | 讯飞智文 |
isCardNote | Boolean | 是否生成PPT演讲备注 | N | false |
search | Boolean | 是否联网搜索 | N | false |
language | String | 语种(保证传入大纲语种与输入PPT语种一致) | N | cn |
fileUrl | String | 文件地址 | N | |
fileName | String | 文件名(带文件名后缀) ,传fileUrl的话必填 | N | |
isFigure | Boolean | 是否自动配图 | N | false |
aiImage | String | ai配图类型: normal、advanced (isFigure为true的话生效); normal-普通配图,20%正文配图;advanced-高级配图,50%正文配图 | N |
5.4 请求响应与说明
见2.5、2.6小节说明
#6、PPT进度查询
6.1 接口地址:
https://zwapi.xfyun.cn/api/ppt/v2/progress?sid={}
6.2 请求查询参数:
注:该接口设置限流,三秒访问一次
GET
名称 | 类型 | 描述 | 必须 |
---|---|---|---|
sid | String | 请求唯一ID | Y |
{"flag": true,"code": 0,"desc": "成功","count": null,"data": {"pptStatus": "done","aiImageStatus": "done","cardNoteStatus": "done","pptUrl": "https://bjcdn.openstorage.cn/xinghuo-privatedata/zhiwen/2024-11-07/7c8fde0c-2d3e-4a1d-a6bb-b1a5688f10c0/9b1c22980ddf478c9557eedbc51a4d2d.pptx","errMsg": null,"totalPages": 21,"donePages": 21}
}
6.3 响应描述
响应字段 | 类型 | 描述 |
---|---|---|
flag | Boolean | 响应标识 |
code | Integer | 错误码 |
desc | String | 错误详情 |
count | Integer | 不用关注,预留 |
data.pptStatus | String | PPT构建状态:building(构建中),done(已完成),build_failed(生成失败) |
data.aiImageStatus | String | ai配图状态:building(构建中),done(已完成) |
data.cardNoteStatus | String | 演讲备注状态:building(构建中),done(已完成) |
data.pptUrl | String | 生成PPT的地址 |
data.errMsg | String | 生成PPT的失败信息 |
data.totalPages | Integer | 生成PPT的总页数 |
data.donePages | Integer | 生成PPT的完成页数 (ai配图和演讲备注为异步任务,ppt页数完成,不代表配图和演讲备注也完成) |
#扣量说明
- 基于query直接生成ppt:扣除10点量,1个并发,若需要增加备注,则增加5点量
- 基于query生成大纲:扣除2点量1个并发
- 基于sid,获取大纲(可修改)生成ppt:扣除8点量1个并发
- 基于大纲生成ppt:8点量,若需要生成备注:额外扣除5点量
- PPT自动配图:普通4点量,高级8点量
- PPT需要生成演讲备注:5点量
- PPT多语种翻译:仅生成大纲,扣1点量;大纲生成PPT,扣2点量;
- 开启联网搜索:2点量
python demo 完整代码
# -*- coding:utf-8 -*-
import hashlib
import hmac
import base64
import json
import timeimport requests
from requests_toolbelt.multipart.encoder import MultipartEncoderclass AIPPT():def __init__(self,APPId,APISecret,Text,templateId):self.APPid = APPIdself.APISecret = APISecretself.text = Textself.header = {}self.templateId = templateId#获取签名def get_signature(self, ts):try:# 对app_id和时间戳进行MD5加密auth = self.md5(self.APPid + str(ts))# 使用HMAC-SHA1算法对加密后的字符串进行加密return self.hmac_sha1_encrypt(auth,self.APISecret)except Exception as e:print(e)return Nonedef hmac_sha1_encrypt(self, encrypt_text, encrypt_key):# 使用HMAC-SHA1算法对文本进行加密,并将结果转换为Base64编码return base64.b64encode(hmac.new(encrypt_key.encode('utf-8'), encrypt_text.encode('utf-8'), hashlib.sha1).digest()).decode('utf-8')def md5(self, text):# 对文本进行MD5加密,并返回加密后的十六进制字符串return hashlib.md5(text.encode('utf-8')).hexdigest()#创建PPT生成任务def create_task(self):url = 'https://zwapi.xfyun.cn/api/ppt/v2/create'timestamp = int(time.time())signature = self.get_signature(timestamp)# body= self.getbody(self.text)formData = MultipartEncoder(fields={# "file": (path, open(path, 'rb'), 'text/plain'), # 如果需要上传文件,可以将文件路径通过path 传入# "fileUrl":"", #文件地址(file、fileUrl、query必填其一)# "fileName":"", # 文件名(带文件名后缀;如果传file或者fileUrl,fileName必填)"query": self.text,"templateId":"20240718489569D", # 模板的ID,从PPT主题列表查询中获取"author":"XXXX", # PPT作者名:用户自行选择是否设置作者名"isCardNote" :str(True), # 是否生成PPT演讲备注, True or False"search" :str(False), # 是否联网搜索,True or False"isFigure" :str(True), # 是否自动配图, True or False"aiImage" :"normal" # ai配图类型: normal、advanced (isFigure为true的话生效); normal-普通配图,20%正文配图;advanced-高级配图,50%正文配图})print(formData)headers = {"appId": self.APPid,"timestamp": str(timestamp),"signature": signature,"Content-Type": formData.content_type}self.header = headersprint(headers)response = requests.request(method="POST",url=url, data= formData,headers=headers).textprint("生成PPT返回结果:",response)resp = json.loads(response)if(0 == resp['code']):return resp['data']['sid']else:print('创建PPT任务失败')return None#构建请求body体def getbody(self,text):body = {"query":text,"templateId":self.templateId # 模板ID举例,具体使用 /template/list 查询}return body#轮询任务进度,返回完整响应信息def get_process(self,sid):# print("sid:" + sid)if(None != sid):response = requests.request("GET",url=f"https://zwapi.xfyun.cn/api/ppt/v2/progress?sid={sid}",headers=self.header).textprint(response)return responseelse:return None#获取PPT,以下载连接形式返回def get_result(self,task_id):#创建PPT生成任务# task_id = self.create_task()# PPTurl = ''#轮询任务进度while(True):response = self.get_process(task_id)resp = json.loads(response)pptStatus = resp['data']['pptStatus']aiImageStatus = resp['data']['aiImageStatus']cardNoteStatus = resp['data']['cardNoteStatus']if('done' == pptStatus and 'done' == aiImageStatus and 'done' == cardNoteStatus):PPTurl = resp['data']['pptUrl']breakelse:time.sleep(3)return PPTurldef getHeaders(self):timestamp = int(time.time())signature = self.get_signature(timestamp)# body = self.getbody(self.text)headers = {"appId": self.APPid,"timestamp": str(timestamp),"signature": signature,"Content-Type": "application/json; charset=utf-8"}return headersdef getTheme(self):url ="https://zwapi.xfyun.cn/api/ppt/v2/template/list"self.header = self.getHeaders()body = {"payType": "not_free",# "style": "简约", # 支持按照类型查询PPT 模板# "color": "红色", # 支持按照颜色查询PPT 模板# "industry": "教育培训", # 支持按照颜色查询PPT 模板"pageNum": 2 ,"pageSize": 10}response = requests.request("GET", url=url, headers=self.header).textprint(response)return responsedef createOutline(self):# if('' ==fileUrl and '' == filePath):url ="https://zwapi.xfyun.cn/api/ppt/v2/createOutline"body = {"query": self.text,"language": "cn","search": str(False), # 是否联网搜索,True or False}response = requests.post(url=url,json= body,headers=self.getHeaders()).textprint("生成大纲完成:\n",response)return responsedef createOutlineByDoc(self,fileName,fileUrl=None,filePath =None ):# if('' ==fileUrl and '' == filePath):url ="https://zwapi.xfyun.cn/api/ppt/v2/createOutlineByDoc"formData = MultipartEncoder(fields={"file": (filePath, open(filePath, 'rb'), 'text/plain'), # 如果需要上传文件,可以将文件路径通过path 传入"fileUrl":fileUrl, #文件地址(file、fileUrl必填其一)"fileName": fileName, # 文件名(带文件名后缀;如果传file或者fileUrl,fileName必填)"query": self.text,"language": "cn","search": str(False), # 是否联网搜索,True or False})timestamp = int(time.time())signature = self.get_signature(timestamp)headers = {"appId": self.APPid,"timestamp": str(timestamp),"signature": signature,"Content-Type": formData.content_type}self.header = headersresponse = requests.post(url=url,data= formData,headers=headers).textprint("生成大纲完成:\n",response)return responsedef createPptByOutline(self,outline):url = "https://zwapi.xfyun.cn/api/ppt/v2/createPptByOutline"body = {"query": self.text,"outline":outline,"templateId":self.templateId, # 模板的ID,从PPT主题列表查询中获取"author":"XXXX", # PPT作者名:用户自行选择是否设置作者名"isCardNote" :True, # 是否生成PPT演讲备注, True or False"search" :False, # 是否联网搜索,True or False"isFigure" :True, # 是否自动配图, True or False"aiImage" :"normal", # ai配图类型: normal、advanced (isFigure为true的话生效); normal-普通配图,20%正文配图;advanced-高级配图,50%正文配图}print(body)response = requests.post(url,json=body,headers=self.getHeaders()).textprint("创建生成任务成功:\n",response)resp = json.loads(response)if (0 == resp['code']):return resp['data']['sid']else:print('创建PPT任务失败')return Noneif __name__ == '__main__':#控制台获取 APPId = "XXXXXXXX"APISecret = "XXXXXXXXXXXXXXXXXXXXXXXX"# 查询PPT主题列表# demo1 = AIPPT(APPId,APISecret,'','')# templateId = demo1.getTheme() # 获取模板列表# print("支持模板列表:\n",templateId)templateId = "20240718489569D" # 该模板ID,需要通过getTheme() 方法获取模板列表,然后从中挑选#流程一:根据描述或者文档直接生成PPT;(流程一、流程二代码不能同时打开)# # 流程一开始Text="请帮我写一份PPT: 介绍下今年到目前位置的公司经营状况"demo = AIPPT(APPId,APISecret,Text,templateId)taskid = demo.create_task()# # 流程一结束#流程二: 先生成大纲(支持上传文本),再通过大纲生成PPT;(流程一、流程二代码不能同时打开)# # 流程二开始# title = "秋分时节的农业管理策略" #设定大纲主题# filename = "test.pdf" # 需要根据文档上传时,请填写文档路径;要求:字数不得超过8000字,文件限制10M。上传文件支持pdf(不支持扫描件)、doc、docx、txt、md格式的文件。# filePath = "data/test.pdf" # 文件路径,也可以通过fileurl 字段上传对象存储地址,具体见方法:createOutlineByDoc# demo = AIPPT(APPId, APISecret, title, templateId)# res = demo.createOutlineByDoc(fileName=filename,filePath=filePath)# data = json.loads(res)# outline = data["data"]["outline"]# taskid = demo.createPptByOutline(outline)# # 流程二结束result = demo.get_result(taskid)print("生成的PPT请从此地址获取:\n" + result)