discord.py实现欢迎embed发送延时自动删除及代码排错
原代码存在的问题
- 事件名错误:成员加入服务器的对应事件为
on_member_join,不存在on_message_join事件 - 阻塞调用错误:
time.sleep()是同步阻塞方法,会卡住整个机器人的事件循环,异步环境下需使用asyncio.sleep(),且原代码未导入对应依赖 - 消息对象未定义:发送embed后没有接收返回的消息实例,后续调用
message.delete()时找不到对应对象;且delete()是异步方法需要加await,也不需要传入embed参数 - Embed写法错误:直接给Embed构造函数传
footer参数会报错,页脚需要通过set_footer()方法设置;discord.py 2.0+版本中成员头像属性为member.avatar.url,旧版avatar_url已废弃 - 配置占位符未替换:代码中
prefix、channelid需要替换为你实际的机器人命令前缀、欢迎频道ID(ID为整数类型,不要加引号) - 缺少必要配置:需要在Discord开发者后台开启「Server Members Intent」特权开关,否则成员加入事件不会触发,即使代码写了
Intents.all()也无效 - 冗余逻辑:discord.py的发送方法自带
delete_after参数,不需要手动写等待+删除逻辑,直接指定秒数即可自动删除发送的消息
修正后可直接运行的代码
import discord from discord.ext import commands # 替换为你自己的配置 BOT_PREFIX = "!" WELCOME_CHANNEL_ID = 123456789012345678 # 替换为你的欢迎频道真实ID BOT_TOKEN = "你的机器人Token" client = commands.Bot( command_prefix=BOT_PREFIX, intents=discord.Intents.all() ) @client.event async def on_ready(): print(f"机器人已登录,账号为:{client.user}") @client.event async def on_member_join(member): # 获取欢迎频道 channel = client.get_channel(WELCOME_CHANNEL_ID) if not channel: return # 找不到频道直接返回避免报错 member_count = member.guild.member_count # 构造欢迎Embed embed = discord.Embed( title=f"Welcome to {member.guild.name}", description=f"Hello there {member.mention}!", color=discord.Color.blue() # 可自定义embed侧边颜色 ) embed.set_footer(text=f"当前服务器成员数:{member_count}") embed.set_thumbnail(url=member.avatar.url if member.avatar else member.default_avatar.url) # 发送embed,5秒后自动删除 await channel.send(embed=embed, delete_after=5) if __name__ == "__main__": client.run(BOT_TOKEN)
注意事项
- 运行前先通过
pip install discord.py安装最新版本的库,不要使用过旧的1.x版本 - 必须去Discord开发者后台对应机器人的「Bot」设置页,下滑到「Privileged Gateway Intents」板块,打开
Server Members Intent的开关,保存后再启动机器人 - 如果你的机器人加入了超过100个服务器,需要向Discord官方申请对应意图权限,个人小服务器直接打开开关即可正常使用
内容的提问来源于stack exchange,提问作者ColdX
相关产品推荐
相关产品推荐

