Взаимодействие с Midjourney с использованием Discord API • Часть I

от автора

Введение

В данном практическом руководстве показывается, как создать простую автоматизацию, используя команду 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": "1166847114203123795",             "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": "1166847114203123795",             "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": "1166847114203123795",         "id": "938956540159881230",         "name": "imagine",         "type": 1,         "options": [             {                 "type": 3,                 "name": "prompt",                 "value": "Тут будет ваш запрос (prompt) к Midjourney"             }         ],         "application_command": {             "id": "938956540159881230",             "application_id": "936929561302675456",             "version": "1166847114203123795",             "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.


ссылка на оригинал статьи https://habr.com/ru/articles/767878/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *