跳转到主要内容

🎯 理解核心概念

MidJourney API 模拟 Discord 按钮交互。与典型的 REST API 不同,它以状态机的方式工作,其中每一步操作都会返回下一步可用的新按钮。

4 个核心 API

API用途使用时机
POST /mj/submit/imagine文生图生成所有工作流的起点
GET /mj/task/\{id\}/fetch查询任务状态并获取按钮每次提交后(轮询直到完成)
POST /mj/submit/action点击按钮(放大、变体、缩放等)当你想对图片进行操作时
POST /mj/submit/modal提交额外输入仅当状态为 MODAL

📊 完整工作流程图

┌─────────────────────────────────────────────────────────────────────────────┐
│                         MIDJOURNEY API WORKFLOW                             │
└─────────────────────────────────────────────────────────────────────────────┘

  ┌──────────────────┐
  │  POST /submit/   │  ← Step 1: Submit prompt, get task_id
  │     imagine      │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_1" }

  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 2: Poll until status = "SUCCESS"
  │      fetch       │
  └────────┬─────────┘
           │ Returns: imageUrl + buttons[] (U1,U2,U3,U4,V1,V2,V3,V4,🔄)

  ┌──────────────────┐
  │  POST /submit/   │  ← Step 3: Click a button using customId
  │     action       │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_2" }

  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 4: Poll the new task
  │      fetch       │
  └────────┬─────────┘

           ├─── status = "SUCCESS" → Done! Get imageUrl

           └─── status = "MODAL" → Need additional input (see Step 5)


           ┌──────────────────┐
           │  POST /submit/   │  ← Step 5: Submit mask/prompt for special operations
           │      modal       │
           └────────┬─────────┘
                    │ Returns: { "result": "task_id_3" }

           ┌──────────────────┐
           │ GET /task/{id}/  │  ← Step 6: Poll until SUCCESS
           │      fetch       │
           └──────────────────┘

🔑 关键概念:按钮与 customId

每个成功的任务都会返回一个 buttons 数组。每个按钮都有一个 customId,你可以用它来触发下一步操作。 来自 /mj/task/\{id\}/fetch 的响应示例:
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/xxx",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::abc123", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::abc123", "label": "U2" },
    { "customId": "MJ::JOB::variation::1::abc123", "label": "V1" },
    { "customId": "MJ::JOB::reroll::0::abc123", "emoji": "🔄" }
  ]
}
⚠️ 重要: customId 不是固定值。它会随着每个任务而变化。请始终从 buttons 数组中获取它。

📋 按阶段划分的按钮参考

IMAGINE 之后(4 宫格图像)

当初始图像生成完成后,会返回以下按钮:
按钮customId 模式操作结果
U1-U4MJ::JOB::upsample::1::xxx放大单张图像高分辨率单张图像
V1-V4MJ::JOB::variation::1::xxx生成变体新的 4 宫格
🔄MJ::JOB::reroll::0::xxx::SOLO重新生成全部新的 4 宫格

UPSCALE 之后(单张图像)

放大后,你将可以使用编辑工具:
标签需要 Modal 吗?
Upscale (Subtle) / Upscale (2x)❌ 否
Upscale (Creative) / Upscale (4x)❌ 否
Vary (Subtle) 🪄❌ 否
Vary (Strong) 🪄❌ 否
Vary (Region) 🖌️✅ 是(mask)
Zoom Out 2x / 1.5x 🔍❌ 否
Custom Zoom 🔍✅ 是(prompt)
⬅️➡️⬆️⬇️ Pan❌ 否
Animate 🎞️❌ 否
🔄 Reroll❌ 否
注意: 按钮标签和 customId 格式可能会因你在 prompt 中指定的 MJ 版本而有所不同(例如 --v 6.1--v 5.2)。请始终以 API 响应中的按钮为准。
⚠️ Inpaint(Vary Region)按钮仅会在 Upscale 之后出现!

⚡ 完整示例:生成并放大

第 1 步:提交 Imagine 请求

curl -X POST 'https://api.cometapi.com/mj/submit/imagine' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "botType": "MID_JOURNEY",
    "prompt": "a cute cat --v 6.1",
    "accountFilter": { "modes": ["FAST"] }
  }'
响应:
{ "code": 1, "result": "1768464763141701" }

第 2 步:轮询任务状态

curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'
响应(完成时):
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/1768464763141701",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::5f20922e-xxx", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::5f20922e-xxx", "label": "U2" },
    ...
  ]
}

第 3 步:点击 U1 进行放大

curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "1768464763141701",
    "customId": "MJ::JOB::upsample::1::5f20922e-xxx"
  }'
响应:
{ "code": 1, "result": "1768464800000000" }

第 4 步:轮询新任务并获取结果

curl -X GET 'https://api.cometapi.com/mj/task/1768464800000000/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'

⚠️ 何时需要 Modal?

当你调用 /mj/submit/action 后,如果任务状态变为 MODAL 而不是 SUCCESS,则必须调用 /mj/submit/modal 来提供额外输入。

已确认需要 Modal 的操作

操作按钮需要提交的内容
InpaintVary (Region)maskBase64(PNG mask)+ prompt
Custom Zoom🔍 Custom Zoomprompt(例如 "your prompt --zoom 2"
示例:Inpaint 流程
# 1. Click Vary (Region) button via Action API
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{"taskId": "xxx", "customId": "MJ::Inpaint::xxx", "enableRemix": true}'

# 2. Poll and see status = "MODAL"
curl -X GET 'https://api.cometapi.com/mj/task/new_task_id/fetch'
# Response: { "status": "MODAL" }

# 3. Submit mask and prompt via Modal API
curl -X POST 'https://api.cometapi.com/mj/submit/modal' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "new_task_id",
    "prompt": "replace with golden crown",
    "maskBase64": "data:image/png;base64,..."
  }'

🚀 速度模式选择

在路径中添加速度前缀:
模式路径前缀示例
Fast/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(默认)/mj/submit/imagine

🔗 其他入口点

这些 API 是独立入口点,不遵循 imagine → action 流程:
API用途
POST /mj/submit/blend将 2-5 张图片混合为一张
POST /mj/submit/describe根据图片生成 prompt
POST /mj/submit/video将图片转换为视频
POST /mj/submit/edits使用蒙版编辑图片

❓ 故障排查提示

基于 API 设计和工作流,以下是你可能会遇到的常见问题:
问题可能原因解决方案
找不到 Vary (Region) 按钮正在查看 4 宫格图片先放大(点击 U1-U4),然后再检查按钮
任务状态卡在 MODAL该操作需要额外输入使用所需数据调用 /mj/submit/modal
customId 不生效使用了过期或硬编码的值始终从 /mj/task/\{id\}/fetch 的响应中获取最新的 customId
buttons 数组为空任务仍在进行中等待 status: "SUCCESS" 后再访问按钮