接口调用流程图
常见问题:
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 = 0
str[k++] = MD5_TABLE[byte0 >>> 4 & 0xf]; // 5
str[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 time
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
class AIPPT():
def __init__(self,APPId,APISecret,Text,templateId):
self.APPid = APPId
self.APISecret = APISecret
self.text = Text
self.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 None
def 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 = headers
print(headers)
response = requests.request(method="POST",url=url, data= formData,headers=headers).text
print("生成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).text
print(response)
return response
else:
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']
break
else:
time.sleep(3)
return PPTurl
def 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 headers
def 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).text
print(response)
return response
def 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()).text
print("生成大纲完成:\n",response)
return response
def 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 = headers
response = requests.post(url=url,data= formData,headers=headers).text
print("生成大纲完成:\n",response)
return response
def 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()).text
print("创建生成任务成功:\n",response)
resp = json.loads(response)
if (0 == resp['code']):
return resp['data']['sid']
else:
print('创建PPT任务失败')
return None
if __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)