开启扣子 API 访问
创建扣子工作流
工作流的名称与描述就根据实际情况填写,我这边就随便写一些上去
构建工作流
这边就按自己的需求去构建工作流了,我这边就拿一个现成的图像生成的工作流
试运行与发布
新建的工作流可以先试运行,熟悉一下流程,然后点击 发布(发布很重要,不然api访问不到)
编写前端页面访问扣子API
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coze API 图片下载</title>
<!-- 引入axios CDN -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.container {
display: flex;
flex-direction: column;
gap: 20px;
}
button {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
max-width: 200px;
}
button:hover {
background-color: #45a049;
}
#response, #log {
border: 1px solid #ddd;
padding: 15px;
border-radius: 4px;
background-color: #f8f8f8;
white-space: pre-wrap;
word-wrap: break-word;
}
img {
max-width: 100%;
border: 1px solid #ddd;
margin-top: 20px;
}
label {
font-weight: bold;
}
input, textarea {
width: 100%;
padding: 8px;
margin: 5px 0 15px 0;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 4px;
}
.input-group {
margin-bottom: 15px;
}
</style>
</head>
<body>
<div class="container">
<h1>Coze API 图片生成与下载</h1>
<div class="input-group">
<label for="token">API Token:</label>
<input type="text" id="token" value="自己的API Token">
</div>
<div class="input-group">
<label for="workflow_id">Workflow ID:</label>
<input type="text" id="workflow_id" value="工作流id(可以通过地址栏拿到)">
</div>
<div class="input-group">
<label for="content">内容:</label>
<input type="text" id="content" value="测试">
</div>
<div class="input-group">
<label for="image_prompt">图片提示:</label>
<textarea id="image_prompt">一个鸡在篮球场,投出一个超远的三分球</textarea>
</div>
<div class="input-group">
<label for="title">标题:</label>
<input type="text" id="title" value="测试">
</div>
<button onclick="sendRequest()">发送请求</button>
<div>
<h3>日志:</h3>
<div id="log"></div>
</div>
<div>
<h3>响应数据:</h3>
<div id="response"></div>
</div>
<div id="imageContainer"></div>
</div>
<script>
function log(message) {
const logElement = document.getElementById('log');
logElement.textContent += message + '\n';
}
async function sendRequest() {
const token = document.getElementById('token').value;
const workflow_id = document.getElementById('workflow_id').value;
const content = document.getElementById('content').value;
const image_prompt = document.getElementById('image_prompt').value;
const title = document.getElementById('title').value;
// 清空之前的内容
document.getElementById('log').textContent = '';
document.getElementById('response').textContent = '';
document.getElementById('imageContainer').innerHTML = '';
log('正在发送请求...');
try {
// API URL
const url = 'https://api.coze.cn/v1/workflow/run';
// Headers
const headers = {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
};
// 请求数据
const data = {
"workflow_id": workflow_id,
"parameters": {
"content": content,
"image_prompt": image_prompt,
"title": title
}
};
// 发送请求
const response = await axios.post(url, data, { headers });
// 打印状态码和响应数据
log(`状态码: ${response.status}`);
document.getElementById('response').textContent = JSON.stringify(response.data, null, 2);
// 当状态码为200时,处理图片
if (response.status === 200) {
log('请求成功,正在检查响应数据...');
// 检查响应结构
if (response.data && response.data.data) {
const data = response.data.data;
log('找到data字段');
// 尝试解析data字段(如果它是字符串)
let parsedData = data;
if (typeof data === 'string') {
try {
parsedData = JSON.parse(data);
log('已解析data字符串为对象');
} catch (e) {
log('data不是有效的JSON字符串');
}
}
// 查找图片URL
let imageUrl = null;
if (typeof parsedData === 'object' && parsedData !== null && parsedData.image) {
imageUrl = parsedData.image;
} else if (typeof data === 'object' && data !== null && data.image) {
imageUrl = data.image;
}
// 如果找到图片URL,下载并显示
if (imageUrl) {
log(`找到图片URL: ${imageUrl}`);
// 下载并显示图片
await displayImage(imageUrl);
// 添加下载按钮
addDownloadButton(imageUrl);
} else {
log('在响应中未找到图片URL');
}
} else {
log('响应中没有data字段');
}
}
} catch (error) {
log(`出错了: ${error.message}`);
if (error.response) {
log(`状态码: ${error.response.status}`);
document.getElementById('response').textContent = JSON.stringify(error.response.data, null, 2);
}
}
}
async function displayImage(url) {
const img = document.createElement('img');
img.src = url;
img.alt = '生成的图片';
document.getElementById('imageContainer').appendChild(img);
log('已显示图片');
}
function addDownloadButton(url) {
const filename = `image_${Date.now()}.png`;
const downloadBtn = document.createElement('a');
downloadBtn.href = url;
downloadBtn.download = filename;
downloadBtn.textContent = '下载图片';
downloadBtn.style.display = 'inline-block';
downloadBtn.style.marginTop = '10px';
downloadBtn.style.padding = '10px 20px';
downloadBtn.style.backgroundColor = '#2196F3';
downloadBtn.style.color = 'white';
downloadBtn.style.textDecoration = 'none';
downloadBtn.style.borderRadius = '4px';
downloadBtn.style.cursor = 'pointer';
document.getElementById('imageContainer').appendChild(downloadBtn);
log(`已添加图片下载按钮,文件名: ${filename}`);
}
</script>
</body>
</html>
参考链接:
个人理解:可以将工作流当做一个后端接口,想调用哪个功能就甩个请求过去,它吭哧吭哧跑完直接吐结果给你!