Python开发Discord机器人:欢迎消息缩略图报错及图片显示问题求助
问题解决方案
问题1:修复头像缩略图的AttributeError报错
Member对象本身就包含用户的所有信息,不需要额外通过.user访问。另外注意:discord.py v2.0+版本已经废弃了avatar_url属性,需要改用member.avatar.url获取头像链接;如果用户没设置自定义头像,还可以用member.default_avatar.url调用默认头像做降级处理。
把代码里的这一行:
embed.set_thumbnail(url = member.user.avatar_url)
替换成:
# 优先用用户自定义头像,无自定义头像则用默认头像 avatar_url = member.avatar.url if member.avatar else member.default_avatar.url embed.set_thumbnail(url=avatar_url)
如果你的discord.py是v1.x旧版本,直接去掉.user即可:
embed.set_thumbnail(url=member.avatar_url)
问题2:嵌入消息图片改为矩形显示
Discord嵌入消息的set_image会自动按图片原始比例缩放显示,不会强制裁剪成方形。要实现矩形显示,有两种可行方案:
方案1:直接使用矩形比例的原图
把你的欢迎图调整为矩形比例(比如16:9、4:3等),Discord会自动适配显示,保持图片的矩形形态。
方案2:合成带头像的矩形欢迎图(自定义效果)
如果想把用户头像叠加到矩形欢迎图上,可以用Pillow库处理图片,步骤如下:
- 先安装Pillow:
pip install pillow - 修改代码实现图片合成:
示例代码片段:
from PIL import Image, ImageDraw import io # 加载选中的随机欢迎图 image_path = os.path.join(images_folder, random_image_file) base_img = Image.open(image_path).convert("RGBA") # 下载用户头像并转为PIL格式 avatar_data = await member.avatar.read() if member.avatar else await member.default_avatar.read() avatar_img = Image.open(io.BytesIO(avatar_data)).convert("RGBA") # 调整头像大小并添加圆角(可选效果) avatar_img = avatar_img.resize((100, 100)) mask = Image.new('L', avatar_img.size, 0) draw = ImageDraw.Draw(mask) draw.ellipse((0, 0) + avatar_img.size, fill=255) avatar_img.putalpha(mask) # 把头像粘贴到欢迎图的指定位置(示例为右上角) paste_pos = (base_img.width - 120, 20) base_img.paste(avatar_img, paste_pos, avatar_img) # 将合成后的图片存入内存 buffer = io.BytesIO() base_img.save(buffer, format='PNG') buffer.seek(0) # 发送合成后的图片和嵌入消息 await welcome_channel.send( embed=embed, file=discord.File(buffer, filename='welcome_image.png') )
这种方式可以完全自定义图片布局,实现矩形显示同时叠加用户头像。
内容的提问来源于stack exchange,提问作者user23185791
相关产品推荐
相关产品推荐

