使用PHP与我们的Midjourney API

概览

本指南假设您使用的是演示帐户 (opens in a new tab)。我们将通过生成图像并查看结果快速开始。您还可以选择使用的语言。

最好的部分是您可以复制代码并立即使用它!

🚀

通过API生成Midjourney图像的最简单方法是获得演示帐户 (opens in a new tab)

获取认证令牌

生成认证令牌的步骤动画

  1. 一旦您购买了演示帐户 (opens in a new tab),您将收到一个电子邮件用户名和密码。使用它登录我们的演示服务器:https://cl.imagineapi.dev (opens in a new tab)
  2. 登录后,点击左下角的用户图标ImagineAPI的用户图标截图
  3. 这些是您的用户设置。滚动到底部,找到Token字段并点击圆形箭头按钮以重新生成令牌:
  4. 这将创建一个新的令牌,您可以使用它来授权您的API调用,所以复制该令牌。请将其保存在某个文件中,因为您将很快使用它:
  5. 然后在右上角点击复选框按钮以保存您的帐户更改:为令牌保存帐户详细信息

就这样。现在我们将使用该令牌对我们的API调用进行身份验证。

生成图像

现在您拥有了认证令牌,您可以生成第一张图像。

midjourney-api.php
<?php
$data = [
    'prompt' => 'a pretty lady at the beach --ar 9:21 --chaos 40 --stylize 1000'
];
 
$url = 'https://cl.imagineapi.dev/items/images/';
 
$headers = [
    "Authorization: Bearer u667iLDO2Xfu0-qpv_nu82EeeDtYGlsf", # <<<< TODO 更改这里的API密钥
 
    "Content-Type: application/json"
];
 
 
$options = [
    'http' => [
        'method' => 'POST',
        'header' => join("\r\n", $headers),
        'content' => json_encode($data)
    ]
];
 
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$responseData = json_decode($response, true);
 
echo json_encode($responseData, JSON_UNESCAPED_SLASHES) . "\n";
?>

我们使用(PHP7+是必需的)运行它:

 php --version
PHP 8.2.10 (cli) (built: Aug 31 2023 18:52:55) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.10, Copyright (c), by Zend Technologies
 
 php midjourney-api.php
⚠️

如果 cl.imagineapi.dev 出现超时或者无法工作,请通过微信联系我们 (opens in a new tab),将会有 帮助您解决任何障碍。

输出将如下所示:

{
    "data": {
        "id": "7de767f8-f7ef-425d-b967-3df8670efd39",
        "prompt": "a pretty lady at the beach --ar 9:21 --chaos 40 --stylize 1000",
        "results": null,
        "user_created": "126353b1-2c3e-42af-9597-b141c0e50fae",
        "date_created": "2023-09-18T18:38:05.077Z",
        "status": "pending",
        "progress": null,
        "url": null,
        "error": null,
        "upscaled_urls": null,
        "upscaled": [],
        "ref": null
    }
}

现在您的提示将被发送到Midjourney。

需要注意的几个重要细节:

  • 图像id将保持不变,我们可以使用它获取数据和状态
  • statuspending,这是图像生成首次创建时的默认值
  • 当生成完成时(status将为completed),upscaled_urls将有4个独立的图像URL,url将有一个包含其中的所有四个图像的网格图像

让我们继续下面并获取生成的图像

获取生成的图像

在演示服务器上生成图像最多需要30秒。我们使用了启用了涡轮模式的Midjourney帐户,所以通常非常快。

让我们创建一个新文件,以获取我们在上一步中创建的图像。

get-image.php
<?php
$imageId = '7de767f8-f7ef-425d-b967-3df8670efd39'; // TODO: 更改这个
 
$url = 'https://cl.imagineapi.dev/items/images/' . $imageId;
$headers = [
    'Authorization: Bearer u667iLDO2Xfu0-qpv_nu82EeeDtYGlsf', // TODO: 记得更改这个
];
 
 
$options = [
    'http' => [
        'method' => 'GET',
        'header' => join("\r\n", $headers)
    ]
];
 
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$responseData = json_decode($response, true);
 
echo json_encode($responseData, JSON_UNESCAPED_SLASHES) . "\n";
?>

我们使用(PHP7+是必需的)运行它:

 php --version
PHP 8.2.10 (cli) (built: Aug 31 2023 18:52:55) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.10, Copyright (c), by Zend Technologies
 
 php get-image.php

输出将如下所示:

{
    "data": {
        "id": "7de767f8-f7ef-425d-b967-3df8670efd39",
        "prompt": "a pretty lady at the beach --ar 9:21 --chaos 40 --stylize 1000",
        "results": "fa7546d9-ece9-4168-ba53-e750a2d5dd09",
        "user_created": "126353b1-2c3e-42af-9597-b141c0e50fae",
        "date_created": "2023-09-18T19:51:51.998Z",
        "status": "completed",
        "progress": null,
        "url": "https://cl.imagineapi.dev/assets/fa7546d9-ece9-4168-ba53-e750a2d5dd09/fa7546d9-ece9-4168-ba53-e750a2d5dd09.png",
        "error": null,
        "upscaled_urls": [
            "https://cl.imagineapi.dev/assets/13bcc54e-778a-4726-8a0e-85c7a927d1da/13bcc54e-778a-4726-8a0e-85c7a927d1da.png",
            "https://cl.imagineapi.dev/assets/283ef97a-34db-4d42-b4ec-62526be8c1ed/283ef97a-34db-4d42-b4ec-62526be8c1ed.png",
            "https://cl.imagineapi.dev/assets/04d84761-3552-45f4-ac9e-d223ad68c03d/04d84761-3552-45f4-ac9e-d223ad68c03d.png",
            "https://cl.imagineapi.dev/assets/741c0569-bb9b-4986-b99a-622ee4a308ee/741c0569-bb9b-4986-b99a-622ee4a308ee.png"
        ],
        "upscaled": [
            "04d84761-3552-45f4-ac9e-d223ad68c03d",
            "13bcc54e-778a-4726-8a0e-85c7a927d1da",
            "283ef97a-34db-4d42-b4ec-62526be8c1ed",
            "741c0569-bb9b-4986-b99a-622ee4a308ee"
        ],
        "ref": null
    }
}

这很好,但如果脚本能自动检查图片并在完成时显示给我们就更好了:

自动等待图像

让我们拿这段生成图像的代码,并让它每5秒检查一次图像是否已经生成(即 statuscompletedfailed):

midjourney-api.php
<?php
$data = [
    'prompt' => 'a pretty lady at the beach --ar 9:21 --chaos 40 --stylize 1000'
];
 
$url = 'https://cl.imagineapi.dev/items/images/';
 
$headers = [
    "Authorization: Bearer u667iLDO2Xfu0-qpv_nu82EeeDtYGlsf", # <<<< TODO 更改此处的API密钥
    "Content-Type: application/json"
];
 
 
$options = [
    'http' => [
        'method' => 'POST',
        'header' => join("\r\n", $headers),
        'content' => json_encode($data)
    ]
];
 
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$responseData = json_decode($response, true);
 
 
// 初始响应
echo json_encode($responseData, JSON_UNESCAPED_SLASHES) . "\n";
 
 
// 轮询以完成
while (true) {
    sleep(5); // 等待5秒
 
    $imageId = $responseData['data']['id'];
    $url = 'https://cl.imagineapi.dev/items/images/' . $imageId;
 
    $options = [
        'http' => [
            'method' => 'GET',
            'header' => join("\r\n", $headers),
        ]
    ];
 
    $innerContext = stream_context_create($options);
 
    $response = file_get_contents($url, false, $innerContext);
    $checkData = json_decode($response, true);
 
    if ($checkData['data']['status'] === 'completed' || $checkData['data']['status'] === 'failed') {
        // 当图像完成或失败时停止
        echo json_encode($checkData, JSON_UNESCAPED_SLASHES) . "\n";
        break;
    } else {
        echo "图像尚未完成生成。状态:" . $checkData['data']['status'] . "\n";
    }
    // TODO: 添加检查以确保这不会无限运行
}
?>

以下是输出可能的样子:

{
    "data": {
        "id": "e91f5fb0-687f-4c90-83ee-36be3e6ebc7c",
        "prompt": "a pretty lady at the beach --ar 9:21 --chaos 40 --stylize 1000",
        "results": null,
        "user_created": "126353b1-2c3e-42af-9597-b141c0e50fae",
        "date_created": "2023-09-18T20:00:05.236Z",
        "status": "pending",
        "progress": null,
        "url": null,
        "error": null,
        "upscaled_urls": null,
        "upscaled": [],
        "ref": null
    }
}
图像尚未完成生成。状态:pending
图像尚未完成生成。状态:pending
图像尚未完成生成。状态:pending
图像尚未完成生成。状态:pending
图像尚未完成生成。状态:pending
图像尚未完成生成。状态:pending
图像尚未完成生成。状态:in-progress
图像尚未完成生成。状态:in-progress
图像尚未完成生成。状态:in-progress
图像尚未完成生成。状态:in-progress
图像尚未完成生成。状态:in-progress
{
    "data": {
        "id": "e91f5fb0-687f-4c90-83ee-36be3e6ebc7c",
        "prompt": "a pretty lady at the beach --ar 9:21 --chaos 40 --stylize 1000",
        "results": "20ed45fc-a51e-45bb-816f-07f66e0989b3",
        "user_created": "126353b1-2c3e-42af-9597-b141c0e50fae",
        "date_created": "2023-09-18T20:00:05.236Z",
        "status": "completed",
        "progress": null,
        "url": "https://cl.imagineapi.dev/assets/20ed45fc-a51e-45bb-816f-07f66e0989b3/20ed45fc-a51e-45bb-816f-07f66e0989b3.png",
        "error": null,
        "upscaled_urls": [
            "https://cl.imagineapi.dev/assets/1339d698-abe4-4885-a758-b8d9fe5116a0/1339d698-abe4-4885-a758-b8d9fe5116a0.png",
            "https://cl.imagineapi.dev/assets/16776c5e-cde6-4281-9be7-e302368b003f/16776c5e-cde6-4281-9be7-e302368b003f.png",
            "https://cl.imagineapi.dev/assets/fc25b62d-ad85-4669-a2a7-9e586fcb93b3/fc25b62d-ad85-4669-a2a7-9e586fcb93b3.png",
            "https://cl.imagineapi.dev/assets/006e9cdd-62cf-4c3f-9f94-f81e44b812ef/006e9cdd-62cf-4c3f-9f94-f81e44b812ef.png"
        ],
        "upscaled": [
            "006e9cdd-62cf-4c3f-9f94-f81e44b812ef",
            "1339d698-abe4-4885-a758-b8d9fe5116a0",
            "16776c5e-cde6-4281-9be7-e302368b003f",
            "fc25b62d-ad85-4669-a2a7-9e586fcb93b3"
        ],
        "ref": null
    }
}

这是 upscaled_urls 的样子: 自动放大的Midjourney图像