Введение

В данном практическом руководстве показывается, как создать простую автоматизацию, используя команду Midjourney /imagine в качестве примера.

Для этой задачи вам понадобится учетная запись Discord с активной подпиской на Midjourney, базовый план за $10 подойдет идеально.

Следуйте этим простым шагам, чтобы получить:

  • Идентификатор сервера Discord, который будет упомянут в этой статье как server_id

  • Идентификатор канала Discord, который будет упомянут в этой статье как channel_id

  • Токен Discord, который будет упомянут в этой статье как discord_token

Мы будем использовать следующие общедоступные Discord API:

  • Application Commands для получения подробностей о команде imagine Midjourney и для размещения взаимодействия с imagine в желаемом канале Discord

  • Get Channel Messages для получения результатов (сообщений) взаимодействия с imagine из канала Discord

Для удобства вы можете использовать коллекцию Postman. Убедитесь, что вы обновили значения в переменных коллекции и сохранили их перед выполнением запросов GET и POST в коллекции:

Авторизация Discord API

Все упомянутые здесь вызовы Discord API требуют заголовка HTTP Authorization с discord_token, пример:

Authorization: discord_token

Получение подробностей о команде imagine Discord

Выполните GET-запрос application-commands https://discord.com/api/v10/channels/channel_id/application-commands/search?type=1&include_applications=true&query=imagine

{
    "applications": [
        {
            "id": "936929561302675456",
            "name": "Midjourney Bot",
            "icon": "f6ce562a6b4979c4b1cbc5b436d3be76",
            "description": "Generate an image based on a text prompt in under 60 seconds using the </imagine:938956540159881230> command!\n\nhttps://docs.midjourney.com/docs/terms-of-service",
            "summary": "",
            "type": null,
            "bot": {
                "id": "936929561302675456",
                "username": "Midjourney Bot",
                "global_name": null,
                "avatar": "f6ce562a6b4979c4b1cbc5b436d3be76",
                "discriminator": "9282",
                "public_flags": 589824,
                "bot": true,
                "avatar_decoration_data": null
            }
        }
    ],
    "application_commands": [
        {
            "id": "938956540159881230",
            "application_id": "936929561302675456",
            "version": "1118961510123847772",
            "default_member_permissions": null,
            "type": 1,
            "nsfw": false,
            "name": "imagine",
            "description": "Create images with Midjourney",
            "dm_permission": true,
            "contexts": [
                0,
                1,
                2
            ],
            "integration_types": [
                0
            ],
            "options": [
                {
                    "type": 3,
                    "name": "prompt",
                    "description": "The prompt to imagine",
                    "required": true
                }
            ]
        }
    ],
    "cursor": {
        "previous": "WzExNTE1NDQ4NzM4MjA4OTMzMDYsIDAsIDkzODk1NjU0MDE1OTg4MTIzMF0=",
        "next": null,
        "repaired": false
    }
}

Нам потребуется объект application_commands[0], который содержит подробности о команде imagine, извлекем его для будущих ссылок:

{
            "id": "938956540159881230",
            "application_id": "936929561302675456",
            "version": "1118961510123847772",
            "default_member_permissions": null,
            "type": 1,
            "nsfw": false,
            "name": "imagine",
            "description": "Create images with Midjourney",
            "dm_permission": true,
            "contexts": [
                0,
                1,
                2
            ],
            "integration_types": [
                0
            ],
            "options": [
                {
                    "type": 3,
                    "name": "prompt",
                    "description": "The prompt to imagine",
                    "required": true
                }
            ]
        }

Составление и выполнение команды imagine в вашем канале Discord

Выполните POST-запрос interactions https://discord.com/api/v10/interactions.

{
    "type": 2,
    "application_id": "936929561302675456",
    "guild_id": "server_id",
    "channel_id": "channel_id",
    "session_id": "$randomInt",
    "data": {
        "version": "1118961510123847772",
        "id": "938956540159881230",
        "name": "imagine",
        "type": 1,
        "options": [
            {
                "type": 3,
                "name": "prompt",
                "value": "Тут будет ваш запрос (prompt) к Midjourney"
            }
        ],
        "application_command": {
            "id": "938956540159881230",
            "application_id": "936929561302675456",
            "version": "1118961510123847772",
            "default_member_permissions": null,
            "type": 1,
            "nsfw": false,
            "name": "imagine",
            "description": "Create images with Midjourney",
            "dm_permission": true,
            "contexts": [
                0,
                1,
                2
            ],
            "integration_types": [
                0
            ],
            "options": [
                {
                    "type": 3,
                    "name": "prompt",
                    "description": "The prompt to imagine",
                    "required": true
                }
            ]
        },
        "attachments": []
    }
}

Поля application_id и application_command должны быть установлены в значения, извлеченные на предыдущем шаге. Поместите ваш запрос (prompt) для Midjourney в поле data.options[0].value. Поле session_id может быть произвольным целым числом. Если вы используете вышеуказанную коллекцию Postman, это значение будет сгенерировано автоматически Postman.

Статус HTTP-ответа должен быть 204 No Content, любой другой статус ответа указывает на проблему с вашим запросом.

Получение результатов команды imagine

Выполните GET-запрос messages https://discord.com/api/v10/channels/channel_id/messages

Ответ (сокращено для краткости):

[
    {
        "id": "<Discord message id>",
        "type": 0,
        "content": "**Тут будет ваш запрос (prompt) к Midjourney --s 750 --v 5.2** - <@Discord user id> (fast)",
        "channel_id": "<Discord channel id>",
        "attachments": [
          {
              "url": "<generated image url>",
              "proxy_url": "<generated proxy image url>",
              "width": 2048,
              "height": 2048,
              "content_type": "<generated image type>",
              "id": "<Discord image id>",
              "filename": "<generated image name>",
              "size": 7204115
          }
        ],
        "components": [
            {
                "type": 1,
                "components": [
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::upsample::1::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "U1"
                    },
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::upsample::2::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "U2"
                    },
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::upsample::3::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "U3"
                    },
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::upsample::4::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "U4"
                    },
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::reroll::0::45e9bf62-5f3d-4bd6-a567-958af28f15d3::SOLO",
                        "style": 2,
                        "emoji": {
                            "name": "????"
                        }
                    }
                ]
            },
            {
                "type": 1,
                "components": [
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::variation::1::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "V1"
                    },
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::variation::2::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "V2"
                    },
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::variation::3::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "V3"
                    },
                    {
                        "type": 2,
                        "custom_id": "MJ::JOB::variation::4::45e9bf62-5f3d-4bd6-a567-958af28f15d3",
                        "style": 2,
                        "label": "V4"
                    }
                ]
            }
        ],
    },
]

Discord API messages возвращает 50 последних сообщений из channel_id, с самым свежим сообщением в начале. В зависимости от настроек Midjourney и нагрузки серверов, создание изображения может занять от примерно 20 секунд (fast mode) до 10 минут (relax mode).

Вы можете выполнить вышеприведенный вызов в цикле с задержкой от 10 до 20 секунд между вызовами, пока массив components не будет пустым. Затем извлеките созданное изображение из поля attachments[0].url.

В следующей публикации мы рассмотрим систему модерации Midjourney и обработку Discord rate limits.

Комментарии (0)