在Python中使用urllib3请求通过Discord Webhooks发送带嵌入图片的消息
我正在尝试使用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中的输出看起来像这样,这正是我想要的效果。