使用 Discord Webhook 在 Python 中使用 urllib3 请求发送带有嵌入图像文件的消息

问题描述 投票:0回答:1

我正在尝试使用 Discord Webhooks 使用 Python 将消息发送到我的 Discord 服务器中的频道,该服务器利用嵌入系统来获得标题、描述和图像,而无需发送多条消息。我正在尝试使用 urllib3 库来做到这一点。理想情况下,我希望能够发送嵌入的图像,如here

所示

目前,我可以发送一个嵌入了标题和描述但没有图像的请求。下面的代码是我用来实现这一目标的代码。

json_data = {
    "content": "Hello World",
    "embeds": [
        {
            "title": "Image Name",
            "description": "Image Description",
            "image": {
                "url": "attachment://image.jpg"
            }
        }
    ]
}

request = HTTP.request("POST",
    url=WEBHOOK_URL,
    headers={"Content-Type": "application/json", "Content-Disposition": "form-data"},
    body=json.dumps(json_data),
    timeout=urllib3.Timeout(10))

print(request.data)

这会导致以下消息发送到不和谐服务器并给出 b'' 的控制台输出。

Image of Discord server with a embed message featuring a Title and Description

我尝试使用以下代码通过附件来完成此操作,但我知道我需要按照 Discord 开发人员文档中所述上传文件,但我不知道应该如何实现这一点。

with open("image.jpg", "rb") as f:
   image_file = f.read()
   json_data = {
      "content": "Hello World",
      "embeds": [
         {
            "title": "Image Name",
            "description": "Image Description",
            "image": {
               "url": "attachment://image.jpg"
            }
         }
      ],
      "attachments": [
         {
            "id": 0,
            "description": "Image description",
            "filename": "image.jpg"
         }
      ]
   }

   request = HTTP.request("POST",
      url=WEBHOOK_URL,
      headers={"Content-Type": "multipart/form-data", "Content-Disposition": "form-data"},
      body=json.dumps(json_data),
      timeout=urllib3.Timeout(10))

   print(request.data)

运行上面的代码时,会产生以下输出。

b'{"attachments": ["0"]}'

我知道我可以在嵌入之外上传和发送图像,但我不知道如何在嵌入内发送图像。以下代码可用于发送图像,但不会嵌入图像,而只是将图像附加到消息中。

with open("image.png", "rb") as f:
    file = f.read()
    payload={
        'content': 'Here is a picture',
        'attachment':('image.png',file,'text/png')
    }
    request = HTTP.request("POST",url=WEBHOOK,headers={"Content-Disposition": "form-data"},
        fields=payload,timeout=urllib3.Timeout(10))

我知道我可以简单地使用Python库discord-webhook,但是我正在尝试了解更多关于HTTP请求的知识,因为我的知识在某些地方显然存在差距。非常感谢任何帮助!

python http discord discord.py
1个回答
0
投票

我已经弄清楚了。

我必须使用“payload_json”将标准 json 正文放入有效负载中,并正确上传图像,然后嵌入它。

以下代码对我有用。

with open("image.jpg", "rb") as f:
        file = f.read()
        payload_data = {
            "content":"",
            "attachment": ("image.jpg", file, "text/jpg"),
            "payload_json": (None, json.dumps({
                    "content": "",
                    "embeds": [
                        {
                            "title": "EMBED TITLE",
                            "description": "EMBED DESCRIPTION",
                            "image": {
                                "url": "attachment://image.jpg"
                            }
                        }
                    ]
                }))
        }
        request = HTTP.request("POST",
            url=WEBHOOK_URL,
            headers={"Content-Disposition": "form-data"},
            fields=payload_data,
            timeout=urllib3.Timeout(10))

Discord 中的输出看起来像 this,这正是我正在寻找的。

© www.soinside.com 2019 - 2024. All rights reserved.