python - 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。
解决方案
我遇到了同样的问题,您可以通过提供 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")
推荐阅读
- powershell - 尝试通过 bat 文件加载 powershell 脚本时出现“错误:系统找不到指定的文件”
- javascript - 记录包含类的数组会打印类的当前版本,而不是记录时的状态
- android - 如何为 Facebook 测试用户设置城市?
- r - 如何制作带有第二个 y 轴的分组条形图(折线图)
- c++ - 为什么要设计自定义内存管理器?
- javascript - 使用 Jinja2 模板单击 CheckBox 时禁用/启用提交按钮
- javascript - 如何在 JS 中定位 CSS(不是注入 HTML)?
- linux - 内核模块:extern 仅在设置了特定参数时
- xslt - 我们可以从中删除 SYSTEM "about:legacy-compat"
- arrays - 从数组中特定列的过滤范围中捕获可见值