Discord.py如何检测发送的附件是否为图片?
检测Discord附件是否为图片的可行方法
首先你写的代码存在两个问题:
- 语法错误:
if后不能加=,正确判断格式为if 条件: - Discord.py 的
Attachment对象没有直接的.image属性,该写法本身不成立
以下是几种可靠的检测方法:
方法1:通过文件后缀名判断
提取附件文件名的后缀,匹配常见图片格式:
allowed_extensions = ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp') attachment = ctx.message.attachments[0] if attachment.filename.lower().endswith(allowed_extensions): # 是图片,执行操作 pass
优点:简单高效;缺点:可能被伪造后缀名的文件绕过
方法2:通过MIME类型判断
Discord附件对象自带content_type属性,图片的MIME类型以image/开头:
attachment = ctx.message.attachments[0] if attachment.content_type and attachment.content_type.startswith('image/'): # 是图片,执行操作 pass
优点:比后缀名判断更准确;缺点:极少数情况下MIME类型可能被篡改
方法3:通过图片库验证有效性(最可靠)
下载附件后用PIL库(Pillow)尝试打开,能正常打开的即为有效图片:
from PIL import Image import io attachment = ctx.message.attachments[0] # 下载附件内容到内存 file_data = await attachment.read() try: # 尝试打开并验证图片完整性 with Image.open(io.BytesIO(file_data)) as img: img.verify() # 是有效图片,执行操作 pass except (IOError, SyntaxError): # 不是有效图片 pass
优点:能准确识别真实图片,避免伪造;缺点:需额外安装Pillow库,且下载文件会占用少量资源
内容的提问来源于stack exchange,提问作者sudo001
相关产品推荐
相关产品推荐

