首页 > 解决方案 > discord.py:通过 cdn.discordapp URL 获取 Asset 对象

问题描述

Tl; dr 有没有办法从 https://cdn.discordapp URL 获取资产对象,例如“https://cdn.discordapp.com/avatars/235088799074484224/9b29bfc497a70b6cc85bb2087936f8fd.webp?size=1024”?

...我问,因为我已经构建了一个命令,它将在调用它的频道中发送给定成员的 discord.Member.avatar_url 作为消息。该消息的内容只是 cdn URL,如上所述。

我还有一个命令将在引用的消息中处理图像。作为其中的一部分,我想将图像作为字节对象获取 - 这在处理附件时很简单,甚至在使用其他 URL 上的图像时也很简单,但是每当我使用 urllib.request.urlretrieve 时,我都会收到 HTTP 403 禁止错误在不和谐的 cdn URL 上。这是一个示例片段:

url = "https://cdn.discordapp.com/avatars/235088799074484224/9b29bfc497a70b6cc85bb2087936f8fd.webp?size=1024"
filename = url.split("/")[-1]
urllib.request.urlretrieve(url, filename)

这引起了

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: HTTPError: HTTP Error 403: Forbidden

所以我正在寻找另一种从不和谐 cdn url 中检索图像的方法。discord.Asset 似乎是尝试完成此任务的最明智的类,但我看不到如何从不和谐的 cdn url 开始实例化它的对象。有没有办法做到这一点?或者有没有更好的方法来获取 cdn.discordapp 图像(从 url)作为字节?

编辑:我已经意识到您也可以通过检查给定消息的 discord.Embed.thumbnail.proxy_url 来获取代理 URL,但是在尝试从那里下载时我也被禁止 403。

标签: pythondiscord.py

解决方案


我遇到了同样的问题,您可以通过提供 User-Agent 标头来伪造浏览器访问:

    urllib.request.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')]
    urllib.request.install_opener(opener)
    urllib.request.urlretrieve(url, "test.jpg")

推荐阅读