欢迎使用 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"
}
用文本提示转换现有图像:{
"taskType": "mj_img2img",
"prompt": "将这个变成赛博朋克风格",
"fileUrl": "https://example.com/source-image.jpg",
"aspectRatio": "1:1",
"version": "7"
}
从静态图像创建视频:{
"taskType": "mj_video",
"prompt": "添加轻柔的动作和大气效果",
"fileUrl": "https://example.com/source-image.jpg",
"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();
import requests
import time
class MidjourneyAPI:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = 'https://api.midapi.ai/api/v1/mj'
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
def generate_image(self, **options):
response = requests.post(f'{self.base_url}/generate',
headers=self.headers, json=options)
result = response.json()
if not response.ok or result.get('code') != 200:
raise Exception(f"生成失败: {result.get('msg', '未知错误')}")
return result['data']['taskId']
def wait_for_completion(self, task_id, max_wait_time=600):
start_time = time.time()
while time.time() - start_time < max_wait_time:
status = self.get_task_status(task_id)
success_flag = status['successFlag']
if success_flag == 0:
print("任务生成中,继续等待...")
elif success_flag == 1:
print("生成成功完成!")
return status['resultInfoJson']
elif success_flag == 2:
task_error = status.get('errorMessage', '任务生成失败')
print(f"任务生成失败: {task_error}")
if status.get('errorCode'):
print(f"错误代码: {status['errorCode']}")
raise Exception(task_error)
elif success_flag == 3:
generate_error = status.get('errorMessage', '任务创建成功但生成失败')
print(f"生成失败: {generate_error}")
if status.get('errorCode'):
print(f"错误代码: {status['errorCode']}")
raise Exception(generate_error)
else:
print(f"未知状态: {success_flag}")
if status.get('errorMessage'):
print(f"错误信息: {status['errorMessage']}")
time.sleep(30) # 等待30秒
raise Exception('生成超时')
def get_task_status(self, task_id):
response = requests.get(f'{self.base_url}/record-info?taskId={task_id}',
headers={'Authorization': f'Bearer {self.api_key}'})
result = response.json()
if not response.ok or result.get('code') != 200:
raise Exception(f"查询状态失败: {result.get('msg', '未知错误')}")
return result['data']
def upscale_image(self, task_id, index):
data = {
'taskId': task_id,
'index': index
}
response = requests.post(f'{self.base_url}/upscale',
headers=self.headers, json=data)
result = response.json()
if not response.ok or result.get('code') != 200:
raise Exception(f"放大失败: {result.get('msg', '未知错误')}")
return result['data']['taskId']
# 使用示例
def main():
api = MidjourneyAPI('YOUR_API_KEY')
try:
# 文本转图像生成
print('开始图像生成...')
task_id = api.generate_image(
taskType='mj_txt2img',
prompt='一座雄伟的古老城堡,矗立在云雾缭绕的山峰之上,夕阳西下,金光洒在城堡的石墙上',
speed='fast',
aspectRatio='16:9',
version='7',
stylization=500
)
# 等待完成
print(f'任务ID: {task_id}。等待完成...')
result = api.wait_for_completion(task_id)
print('图像生成成功!')
print(f'生成的图像数量: {len(result["resultUrls"])}')
for i, url_info in enumerate(result['resultUrls']):
print(f'图像 {i + 1}: {url_info["resultUrl"]}')
# 放大第一张图像
print('\n开始放大第一张图像...')
upscale_task_id = api.upscale_image(task_id, 1)
upscale_result = api.wait_for_completion(upscale_task_id)
print('图像放大成功!')
print(f'放大后图像: {upscale_result["resultUrls"][0]["resultUrl"]}')
except Exception as error:
print(f'错误: {error}')
if __name__ == '__main__':
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密钥,立即开始创作!