使用discord.py如何获取新加入成员的用户名与头像URL?
问题修复方案
核心错误点
- 事件类型错误:当前监听的
on_member_remove是成员离开服务器的触发事件,你需要实现新成员进群欢迎,应该监听on_member_join事件 - 变量被覆盖:事件函数开头你写了
member = 0,直接把传入的成员对象覆盖为整型数字,后续调用member.avatar_url、member.name都是对数字操作,必然报错 - API属性过时:discord.py v2.x及以上版本,获取用户头像的属性已从
avatar_url改为avatar.url,建议加兜底逻辑处理没有自定义头像的用户 - 缺少意图配置:成员相关事件需要在Discord开发者后台的Bot设置页开启
Server Members Intent,同时代码初始化客户端时声明对应意图,否则事件不会触发
修正后参考代码
import discord from PIL import Image, ImageDraw, ImageFont import requests # 初始化时开启成员意图 intents = discord.Intents.default() intents.members = True # 必须开启,否则成员事件不触发 client = discord.Client(intents=intents) # 成员离开时更新在线人数 @client.event async def on_member_remove(member): total_member = 0 for guild in client.guilds: total_member += guild.member_count await client.change_presence(status=discord.Status.idle, activity = discord.Activity( type = discord.ActivityType.watching, name = f'{total_member} Members' )) # 新成员加入时生成欢迎图 @client.event async def on_member_join(member): # 先更新总人数 total_member = 0 for guild in client.guilds: total_member += guild.member_count await client.change_presence(status=discord.Status.idle, activity = discord.Activity( type = discord.ActivityType.watching, name = f'{total_member} Members' )) # 获取头像,兜底默认头像避免报错 avatar_url = member.avatar.url if member.avatar else member.default_avatar.url picture = Image.open(requests.get(avatar_url, stream=True).raw) text = f"Welcome, {member.name}" # 生成欢迎图逻辑 original_file_path = 'welcome.png' img = Image.open("default.png") draw = ImageDraw.Draw(img) font = ImageFont.truetype("arial.ttf", 72) draw.text((925,800), text, (255, 255, 255), font=font) # 图片合成逻辑,坐标可根据底图尺寸自行调整 back_im = picture.copy() back_im.paste(img, (925, 500)) back_im.save(original_file_path) # 发送到指定频道,替换下方ID为你实际的欢迎频道ID welcome_channel = client.get_channel(1234567890) await welcome_channel.send(content=text, file=discord.File(original_file_path))
额外注意事项
- 确保你提前安装了对应依赖:
discord.py、Pillow、requests - 图片显示错位的话可以自行调整绘制、粘贴的坐标数值适配你的底图尺寸
内容的提问来源于stack exchange,提问作者Ender TnT
相关产品推荐
相关产品推荐

