import requests from urllib.parse import urlparse import os import random import time import json class MidjourneyApi(): def __init__(self, prompt, application_id, guild_id, channel_id, version, id, authorization): self.application_id = application_id self.guild_id = guild_id self.channel_id = channel_id self.version = version self.id = id self.authorization = authorization self.prompt = prompt self.message_id = "" self.custom_id = "" self.image_path_str = "" self.send_message() self.get_message() self.choose_images() self.download_image() def send_message(self): url = "https://discord.com/api/v9/interactions" data = { "type": 2, "application_id": self.application_id, "guild_id": self.guild_id, "channel_id": self.channel_id, "session_id": "cannot be empty", "data": { "version": self.version, "id": self.id, "name": "imagine", "type": 1, "options": [ { "type": 3, "name": "prompt", "value": self.prompt } ], "application_command": { "id": self.id, "application_id": self.application_id, "version": self.version, "default_member_permissions": None, "type": 1, "nsfw": False, "name": "imagine", "description": "Create images with Midjourney", "dm_permission": True, "contexts": None, "options": [ { "type": 3, "name": "prompt", "description": "The prompt to imagine", "required": True } ] }, "attachments": [] }, } headers = { 'Authorization': self.authorization, 'Content-Type': 'application/json', } response = requests.post(url, headers=headers, json=data) def get_message(self): headers = { 'Authorization': self.authorization, "Content-Type": "application/json", } for i in range(3): time.sleep(30) try: response = requests.get(f'https://discord.com/api/v9/channels/{self.channel_id}/messages', headers=headers) messages = response.json() most_recent_message_id = messages[0]['id'] self.message_id = most_recent_message_id components = messages[0]['components'][0]['components'] buttons = [comp for comp in components if comp.get('label') in ['U1', 'U2', 'U3', 'U4']] custom_ids = [button['custom_id'] for button in buttons] random_custom_id = random.choice(custom_ids) self.custom_id = random_custom_id break except: ValueError("Timeout") def choose_images(self): url = "https://discord.com/api/v9/interactions" headers = { "Authorization": self.authorization, "Content-Type": "application/json", } data = { "type": 3, "guild_id": self.guild_id, "channel_id": self.channel_id, "message_flags": 0, "message_id": self.message_id, "application_id": self.application_id, "session_id": "cannot be empty", "data": { "component_type": 2, "custom_id": self.custom_id, } } response = requests.post(url, headers=headers, data=json.dumps(data)) def download_image(self): headers = { 'Authorization': self.authorization, "Content-Type": "application/json", } for i in range(3): time.sleep(30) try: response = requests.get(f'https://discord.com/api/v9/channels/{self.channel_id}/messages', headers=headers) messages = response.json() most_recent_message_id = messages[0]['id'] self.message_id = most_recent_message_id image_url = messages[0]['attachments'][0]['url'] image_response = requests.get(image_url) a = urlparse(image_url) image_name = os.path.basename(a.path) self.image_path_str = f"images/{image_name}" with open(f"images/{image_name}", "wb") as file: file.write(image_response.content) break except: raise ValueError("Timeout") def image_path(self): return self.image_path_str