如何使用discord.py实现单个命令无需前缀即可触发?
实现discord.py单命令无前缀触发的方案
前置修改
先把你原来硬编码为空的前缀改回正常使用的默认前缀,比如习惯用!作为普通命令的前缀,同时开启必要的消息内容意图,否则机器人无法读取用户消息内容:
# 开启消息内容意图,需要同时在Discord开发者后台的Bot设置页开启Message Content Intent intents = discord.Intents.default() intents.message_content = True client = commands.Bot(command_prefix = '!', intents=intents)
方案1:通过on_message事件手动触发(最灵活,推荐新手使用)
新增on_message事件监听,匹配到你要无前缀触发的命令关键词时,手动调用对应命令逻辑即可,记得保留process_commands保证其他带前缀的命令正常运行:
@client.event async def on_message(message): # 过滤机器人自己发的消息,避免循环触发 if message.author.bot: return # 匹配你要无前缀触发的命令,比如你要让test命令无需前缀触发 if message.content.strip() == 'test': # 获取命令上下文后手动调用test命令 ctx = await client.get_context(message) await client.get_command('test')(ctx) # 处理其他带前缀的正常命令,必须保留 await client.process_commands(message)
如果要给其他命令加无前缀触发,只要多加if判断对应关键词即可。
方案2:使用动态前缀函数
你也可以给command_prefix传入一个动态生成前缀的函数,对指定的命令允许空前缀,其他命令仅允许正常前缀:
def get_prefix(bot, message): # 把你要无前缀触发的命令名放到这个列表里 no_prefix_commands = ['test'] for cmd in no_prefix_commands: if message.content.strip().startswith(cmd): # 匹配到目标命令时,同时支持空前缀和默认前缀! return ['', '!'] # 其他命令仅支持默认前缀! return '!' # 初始化bot的时候传这个动态前缀函数 intents = discord.Intents.default() intents.message_content = True client = commands.Bot(command_prefix = get_prefix, intents=intents)
注意事项
- 必须在Discord开发者平台的Bot管理页开启
Message Content Intent,否则机器人无法读取普通消息内容,两种方案都不会生效 - 如果你要无前缀触发的命令需要带参数,修改
on_message的匹配规则或者动态前缀的匹配规则适配即可
内容的提问来源于stack exchange,提问作者perple lol
相关产品推荐
相关产品推荐

