الانتقال إلى المحتوى الرئيسي

🎯 فهم الفكرة الأساسية

يقوم MidJourney API بمحاكاة تفاعلات أزرار Discord. وعلى عكس واجهات REST API التقليدية، فإنه يعمل كـ آلة حالات حيث تُرجع كل عملية أزرارًا جديدة للخطوة التالية.

واجهات API الأساسية الأربع

APIالغرضمتى تُستخدم
POST /mj/submit/imagineتوليد الصور من النصنقطة البداية لجميع مسارات العمل
GET /mj/task/\{id\}/fetchالاستعلام عن حالة المهمة والحصول على الأزراربعد كل عملية submit (استعلم بشكل متكرر حتى تكتمل)
POST /mj/submit/actionالنقر على زر (upscale، vary، zoom، إلخ)عندما تريد تنفيذ عملية على صورة
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)

تُعاد هذه الأزرار عند اكتمال إنشاء صورتك الأولية:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxxتكبير صورة واحدةصورة واحدة عالية الدقة
V1-V4MJ::JOB::variation::1::xxxإنشاء تنويعاتشبكة 4 جديدة
🔄MJ::JOB::reroll::0::xxx::SOLOإعادة الإنشاء بالكاملشبكة 4 جديدة

بعد UPSCALE (صورة واحدة)

بعد التكبير، ستحصل على إمكانية الوصول إلى أدوات التحرير:
LabelNeeds 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 حسب إصدار MJ المحدد في الـ prompt الخاص بك (مثلًا، --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 لإجراء Upscale

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 المؤكدة

OperationButtonWhat to Submit
InpaintVary (Region)maskBase64 (قناع PNG) + 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تعديل الصورة باستخدام mask

❓ نصائح استكشاف الأخطاء وإصلاحها

استنادًا إلى تصميم الـ API وسير العمل، إليك المشكلات الشائعة التي قد تواجهها:
المشكلةالسبب المحتملالحل
لا يمكنك العثور على زر Vary (Region)تنظر إلى صورة شبكة 4 صورقم بعمل Upscale أولًا (انقر U1-U4)، ثم تحقّق من الأزرار
حالة المهمة عالقة عند MODALالعملية تتطلب إدخالًا إضافيًااستدعِ /mj/submit/modal مع البيانات المطلوبة
customId لا يعملاستخدام قيمة قديمة أو مكتوبة بشكل ثابتاحصل دائمًا على customId جديد من استجابة /mj/task/\{id\}/fetch
مصفوفة buttons فارغةالمهمة لا تزال قيد التنفيذانتظر حتى status: "SUCCESS" قبل الوصول إلى الأزرار