如何在Discord Python中创建kick命令?@client.command失效怎么解决
问题排查&解决方案
现有代码的问题
- 未提前定义
member变量,直接代入startswith判断会直接抛出NameError,代码根本无法正常运行 ban()/kick()都是异步方法,调用时没有加await,执行后不会实际触发对应操作- 逻辑里用了
ban()方法,但命令名是kick,功能不匹配,封禁和踢出是两个完全不同的操作
修复@client.command不生效的方案
discord.py v2.0之后默认关闭了消息内容意图,这是@client.command不生效的最常见原因,按以下步骤修复即可:
- 前往Discord开发者平台的Bot管理页面,找到
Privileged Gateway Intents分区,打开Message Content Intent开关 - 代码中初始化Bot时显式声明启用消息内容意图,正确写法如下:
import discord from discord.ext import commands # 开启必要的意图 intents = discord.Intents.default() intents.message_content = True # 指定命令前缀为- client = commands.Bot(command_prefix='-', intents=intents) # kick命令实现 @client.command() async def kick(ctx, member: discord.Member): # 可选:添加权限校验,仅允许有踢人权限的用户使用 if not ctx.author.guild_permissions.kick_members: await ctx.send("你没有踢出成员的权限") return await member.kick() await ctx.send(f"User {member} has been kicked") # 运行Bot client.run("你的Bot Token")
手动监听消息的实现方案
如果你坚持不用装饰器写法,正确代码如下:
import discord from discord.ext import commands intents = discord.Intents.default() intents.message_content = True client = commands.Bot(command_prefix='-', intents=intents) @client.event async def on_message(message): # 过滤机器人自身消息,避免循环触发 if message.author.bot: return if message.content.startswith('-kick '): args = message.content.split() if len(args) < 2: await message.channel.send("请指定要踢出的成员") return # 权限校验 if not message.author.guild_permissions.kick_members: await message.channel.send("你没有踢出成员的权限") return # 解析成员对象 try: member = await commands.MemberConverter().convert(message, args[1]) except commands.MemberNotFound: await message.channel.send("未找到指定成员") return await member.kick() await message.channel.send(f"User {member} has been kicked") # 如果同时要使用@client.command装饰器,必须添加这行,否则命令会失效 await client.process_commands(message) client.run("你的Bot Token")
内容的提问来源于stack exchange,提问作者H1387XD
相关产品推荐
相关产品推荐

