欢迎使用 Midjourney API
Midjourney API 让您能够使用 Midjourney 先进AI模型的强大功能生成高质量的AI图像。无论您是在构建应用、自动化工作流程还是创建内容,我们的API都为AI图像生成提供了简单可靠的访问方式。
身份验证
所有 API 请求都需要使用 Bearer 令牌进行身份验证。请从 API 密钥管理页面 获取您的 API 密钥。
请妥善保管您的 API 密钥,切勿公开分享。如果怀疑密钥泄露,请立即重置。
API 基础 URL
身份验证请求头
Authorization: Bearer YOUR_API_KEY
快速开始指南
第一步:生成您的第一个图像
从一个简单的文本转图像生成请求开始:
async function generateImage() {
try {
const response = await fetch('https://api.midapi.ai/api/v1/mj/generate', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
taskType: 'mj_txt2img',
prompt: '一幅日落时分雄伟的雪山风景画,山峰被夕阳映照成金色',
speed: 'relaxed',
aspectRatio: '16:9',
version: '7'
})
});
const data = await response.json();
if (response.ok && data.code === 200) {
console.log('任务已提交:', data);
console.log('任务ID:', data.data.taskId);
return data.data.taskId;
} else {
console.error('请求失败:', data.msg || '未知错误');
return null;
}
} catch (error) {
console.error('错误:', error.message);
return null;
}
}
generateImage();
第二步:检查任务状态
使用返回的任务ID检查生成状态:
curl -X GET "https://api.midapi.ai/api/v1/mj/record-info?taskId=YOUR_TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
响应格式
成功响应:
{
"code": 200,
"msg": "success",
"data": {
"taskId": "mj_task_abcdef123456"
}
}
任务状态响应:
{
"code": 200,
"msg": "success",
"data": {
"taskId": "mj_task_abcdef123456",
"successFlag": 1,
"resultInfoJson": {
"resultUrls": [
{"resultUrl": "https://example.com/image1.jpg"},
{"resultUrl": "https://example.com/image2.jpg"},
{"resultUrl": "https://example.com/image3.jpg"},
{"resultUrl": "https://example.com/image4.jpg"}
]
}
}
}
生成类型
从文本描述生成图像:{
"taskType": "mj_txt2img",
"prompt": "未来主义城市景观,有飞行汽车和霓虹灯光",
"aspectRatio": "16:9",
"version": "7"
}
生成速度
为您的需求选择合适的速度:
Relaxed
免费套餐选项生成速度较慢但对非紧急任务具有成本效益
Turbo
优质速度适用于时间敏感应用的最快生成速度
关键参数
对所需图像的文本描述。为获得最佳结果,请具体和描述性地表达。更好提示词的技巧:
- 包含风格描述符(如”超写实”、“水彩画”、“数字艺术”)
- 指定构图细节(如”特写”、“广角”、“鸟瞰图”)
- 添加光线信息(如”黄金时段”、“戏剧性光线”、“柔和自然光”)
输出图像宽高比。可选择:
1:1 - 方形(社交媒体)
16:9 - 宽屏(壁纸、演示文稿)
9:16 - 肖像(手机壁纸)
4:3 - 标准(传统显示器)
- 以及其他7种比例
Midjourney 模型版本:
7 - 最新模型(推荐)
6.1, 6 - 以前的版本
niji6 - 专注于动漫/插画
艺术风格强度(0-1000):
- 低值(0-100):更逼真
- 高值(500-1000):更艺术化/风格化
完整工作流程示例
以下是一个生成图像并等待完成的完整示例:
class MidjourneyAPI {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = 'https://api.midapi.ai/api/v1/mj';
}
async generateImage(options) {
const response = await fetch(`${this.baseUrl}/generate`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(options)
});
const result = await response.json();
if (!response.ok || result.code !== 200) {
throw new Error(`生成失败: ${result.msg || '未知错误'}`);
}
return result.data.taskId;
}
async waitForCompletion(taskId, maxWaitTime = 600000) { // 最长等待10分钟
const startTime = Date.now();
while (Date.now() - startTime < maxWaitTime) {
const status = await this.getTaskStatus(taskId);
switch (status.successFlag) {
case 0:
console.log('任务生成中,继续等待...');
break;
case 1:
console.log('生成成功完成!');
return status.resultInfoJson;
case 2:
const taskError = status.errorMessage || '任务生成失败';
console.error('任务生成失败:', taskError);
if (status.errorCode) {
console.error('错误代码:', status.errorCode);
}
throw new Error(taskError);
case 3:
const generateError = status.errorMessage || '任务创建成功但生成失败';
console.error('生成失败:', generateError);
if (status.errorCode) {
console.error('错误代码:', status.errorCode);
}
throw new Error(generateError);
default:
console.log(`未知状态: ${status.successFlag}`);
if (status.errorMessage) {
console.error('错误信息:', status.errorMessage);
}
break;
}
// 等待30秒后再次检查
await new Promise(resolve => setTimeout(resolve, 30000));
}
throw new Error('生成超时');
}
async getTaskStatus(taskId) {
const response = await fetch(`${this.baseUrl}/record-info?taskId=${taskId}`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${this.apiKey}`
}
});
const result = await response.json();
if (!response.ok || result.code !== 200) {
throw new Error(`查询状态失败: ${result.msg || '未知错误'}`);
}
return result.data;
}
async upscaleImage(taskId, index) {
const response = await fetch(`${this.baseUrl}/upscale`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
taskId,
index
})
});
const result = await response.json();
if (!response.ok || result.code !== 200) {
throw new Error(`放大失败: ${result.msg || '未知错误'}`);
}
return result.data.taskId;
}
}
// 使用示例
async function main() {
const api = new MidjourneyAPI('YOUR_API_KEY');
try {
// 文本转图像生成
console.log('开始图像生成...');
const taskId = await api.generateImage({
taskType: 'mj_txt2img',
prompt: '一座雄伟的古老城堡,矗立在云雾缭绕的山峰之上,夕阳西下,金光洒在城堡的石墙上',
speed: 'fast',
aspectRatio: '16:9',
version: '7',
stylization: 500
});
// 等待完成
console.log(`任务ID: ${taskId}。等待完成...`);
const result = await api.waitForCompletion(taskId);
console.log('图像生成成功!');
console.log('生成的图像数量:', result.resultUrls.length);
result.resultUrls.forEach((urlInfo, index) => {
console.log(`图像 ${index + 1}: ${urlInfo.resultUrl}`);
});
// 放大第一张图像
console.log('\n开始放大第一张图像...');
const upscaleTaskId = await api.upscaleImage(taskId, 1);
const upscaleResult = await api.waitForCompletion(upscaleTaskId);
console.log('图像放大成功!');
console.log('放大后图像:', upscaleResult.resultUrls[0].resultUrl);
} catch (error) {
console.error('错误:', error.message);
}
}
main();
使用回调的异步处理
对于生产应用,使用回调而不是轮询:
{
"taskType": "mj_txt2img",
"prompt": "一个宁静的禅意花园,樱花盛开",
"callBackUrl": "https://your-app.com/webhook/mj-callback",
"aspectRatio": "16:9"
}
当生成完成时,系统会将结果POST到您的回调URL。
了解更多关于回调
实现和处理 Midjourney API 回调的完整指南
最佳实践
- 在提示词中要具体和描述性
- 包含风格、情绪和构图细节
- 在适当时使用艺术参考
- 测试不同的提示词变化以找到最佳效果
- 使用回调而不是频繁轮询
- 实施适当的错误处理和重试逻辑
- 在可能时缓存结果
- 为您的用例选择适当的生成速度
- 对非紧急任务使用”relaxed”速度
- 定期监控您的积分使用情况
- 在可能的地方实施请求批处理
- 在您的应用中设置使用警报
- 始终检查响应状态码
- 为重试实施指数退避
- 优雅地处理速率限制
- 记录错误以进行调试和监控
状态码
生成任务状态说明
图像存储和保留
生成的图像文件在删除前保留 15天。请在此时间范围内下载并保存您的图像。
- 图像URL在生成后15天内保持可访问
- 规划您的工作流程以在过期前下载或处理图像
- 考虑为生产使用实施自动下载系统
下一步
准备开始生成令人惊叹的AI图像了吗?获取您的API密钥,立即开始创作!