Discord.py同时使用Bot与Client导致欢迎功能失效问题咨询
问题原因
discord.ext.commands.Bot是discord.Client的子类,本身完整兼容Client的所有事件、接口方法,不需要同时实例化两个客户端对象。你之前的代码里把入服欢迎事件绑定在了独立的client实例上,但最后只调用了bot.run()启动Bot实例,绑定在client上的事件逻辑根本不会被执行。
你之前的尝试存在两个明确错误:
- 给Bot实例初始化的时候没有传入配置好的intents参数,就算把事件挂到bot上也收不到成员加入事件
- 把Bot替换成
discord.Client()之后,Client本身不支持命令装饰器,昵称修改的命令功能自然会失效
修正后的完整代码
import discord from discord.ext import commands import os # 配置网关权限 intents = discord.Intents.default() intents.members = True # 仅初始化一个Bot实例,传入命令前缀和intents配置 bot = commands.Bot(command_prefix="!", intents=intents) # 成员加入事件直接绑定到bot实例,写法和Client完全一致 @bot.event async def on_member_join(member): print("member join") channel = bot.get_channel(929370329363644506) await channel.send(f"{member.mention} Welcome to our server! Please check <#556206910794366988> and set your name and rank based on your ingame name and rank") # 昵称修改命令 @bot.command() @commands.has_permissions(change_nickname=True) async def nick(ctx, *, nickname): member = ctx.author await member.edit(nick=nickname) await ctx.send(f"Nickname was changed to {member.mention}.") if __name__ == "__main__": my_secret = os.environ['TOKEN'] bot.run(my_secret)
必要配置检查
- 必须前往Discord开发者后台,进入对应机器人的Bot设置页,找到「Privileged Gateway Intents」分区,打开Server Members Intent开关,否则代码层面配置了intents也无法接收成员加入事件
- 后续开发所有事件、命令、定时任务都统一绑定到这一个
bot实例上即可,不需要再创建额外的Client对象,Bot完全支持所有Client原生的API调用,不需要做特殊改写
内容的提问来源于stack exchange,提问作者KDK
相关产品推荐
相关产品推荐

