在Python中使用urllib3请求通过Discord Webhooks发送带嵌入图片的消息

0 投票
1 回答
50 浏览
提问于 2025-04-12 22:18

我正在尝试使用Discord的Webhook功能,通过Python向我的Discord服务器的频道发送消息。我希望这个消息能使用嵌入系统,包含标题、描述和图片,而不是发送多条消息。我打算使用urllib3这个库来实现这个功能。理想情况下,我希望能够发送一张图片,并把它放在嵌入中,像这里看到的那样。

目前,我能够发送一个包含标题和描述的嵌入请求,但没有图片。下面的代码就是我用来实现这一点的。

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)

这段代码会向Discord服务器发送一条消息,并在控制台输出b''。

这是Discord服务器上显示的包含标题和描述的嵌入消息的图片

我尝试使用以下代码来实现这个功能,使用附件发送图片,但我知道我需要按照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请求,因为我明显在某些地方知识不足。任何帮助都非常感谢!

1 个回答

0

我搞明白了。

我需要把标准的json内容放到“payload_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中的输出看起来像这样,这正是我想要的效果。

撰写回答