如何用Python+Discum与Midjourney的Remix变体弹窗交互?
问题描述
我正在用Discum和Discord中的Midjourney交互,已经能通过Discum操作V1、V2、V3、V4按钮,但无法给Remix提示弹窗(Modal)输入内容。我已通过/prefer remix开启Remix功能,以下是触发变体操作的代码:
url = self.discord + "interactions" nonce = calculateNonce("now") component_type = message.components[1]["components"][image_no - 1] payload = { "type": 3, "application_id": CONFIG.APPLICATION_ID, "guild_id": CONFIG.GUILD_ID, "channel_id": CONFIG.CHANNEL_ID, "data": { "component_type": component_type["type"], "custom_id": component_type["custom_id"] }, "nonce": nonce, "message_flags": 0, "message_id": message.message_id, "session_id": "".join(random.choice(string.ascii_letters + string.digits) for _ in range(32)) } fields = {"payload_json": (None, json.dumps(payload))} randomstr = ''.join(random.sample(string.ascii_letters + string.digits, 16)) body = MultipartEncoder(fields=fields, boundary='----WebKitFormBoundary' + randomstr) headerMods = {"update": {"Content-Type": body.content_type}} return Wrapper.sendRequest(self.s, 'post', url, body, headerModifications=headerMods, log=self.log)
如果Discum目前没有解决方案,能否直接通过Discord API实现该功能?
解决方案
Discum暂无内置处理Modal提交的方法,但可以直接调用Discord交互API完成Remix弹窗的内容输入,步骤如下:
- 捕获Modal交互数据:触发变体按钮后,Discord会返回包含Modal信息的交互响应,需从中提取
interaction_id、interaction_token、弹窗的custom_id以及输入框的component_id。 - 构造Modal提交Payload:按照Discord API要求,构造类型为
5的交互响应Payload,填入自定义的Remix提示词。 - 发送请求提交Modal:将Payload发送到指定的交互回调接口。
示例代码如下:
import json from requests_toolbelt.multipart.encoder import MultipartEncoder import random import string # 从交互响应中获取的参数 interaction_id = "实际获取的交互ID" interaction_token = "实际获取的交互Token" modal_custom_id = "Remix弹窗的custom_id" input_component_id = "弹窗输入框的component_id" new_prompt = "自定义的Remix提示词" # 构造提交Payload payload = { "type": 5, "data": { "custom_id": modal_custom_id, "components": [ { "type": 1, "components": [ { "type": 4, "custom_id": input_component_id, "value": new_prompt } ] } ] } } # 发送请求 url = f"https://discord.com/api/v9/interactions/{interaction_id}/{interaction_token}/callback" fields = {"payload_json": (None, json.dumps(payload))} randomstr = ''.join(random.sample(string.ascii_letters + string.digits, 16)) body = MultipartEncoder(fields=fields, boundary='----WebKitFormBoundary' + randomstr) headers = { "Content-Type": body.content_type, "Authorization": f"Bot {你的Bot令牌}" # 若为用户账号则替换为"Bearer {用户令牌}" } response = self.s.post(url, data=body, headers=headers)
注意事项
- 需监听Discum的WS事件,触发变体按钮后会收到
INTERACTION_CREATE事件,其中包含Modal的完整信息。 - 使用用户账号令牌时,需确保令牌有效且未触发Discord风控机制。
- Midjourney版本更新可能会调整Modal的
custom_id或输入组件ID,需根据实际返回数据调整参数。
内容的提问来源于stack exchange,提问作者Ajay Biswas
相关产品推荐
相关产品推荐

