我正在尝试使用 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'' 的控制台输出。
我尝试使用以下代码通过附件来完成此操作,但我知道我需要按照 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请求的知识,因为我的知识在某些地方显然存在差距。非常感谢任何帮助!
我已经弄清楚了。
我必须使用“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))