如何让Discord Bot识别多关键词并返回不同回复?
问题:Discord Bot无法根据问候+指定关键词触发对应回复
需求场景
- 场景1:用户发送类似
Hi/Hello的问候(未提及Bot名称或全员)→ Bot回复随机确认类内容,比如"Excuse me, are you talking to me?" - 场景2:用户发送包含问候+Bot名称(如
ADAM)或全员(如everyone)的消息→ Bot回复随机友好问候,比如"Oh hi"
原代码问题分析
你的代码核心问题出在第二个if的条件逻辑:
if "Adam" not in message.content or "ADAM" not in message.content or ...:
这里用了or,意味着只要有一个关键词不在消息里,条件就为真。比如发送「Hi ADAM!」时,消息里没有everyone,条件依然成立,代码会走第一个分支,而非预期的else分支。
正确逻辑应该是:所有指定关键词都不在消息里时才走第一个分支,因此需要把or替换为and。同时原代码重复判断大小写,冗余度高,可以统一转小写后再处理。
修正后的代码
import random # 假设bot是已初始化完成的Discord Bot实例 @bot.event async def on_message(message): if message.author == bot.user: return content_lower = message.content.lower() # 定义关键词列表,便于后续维护 greetings = ["hi", "hello"] target_keywords = ["adam", "everyone", "everybody"] # 判断消息是否包含问候关键词 if any(greeting in content_lower for greeting in greetings): # 判断消息是否未提及任何指定目标关键词 if all(keyword not in content_lower for keyword in target_keywords): # 场景1:仅发送问候,无指定对象 random_reply = random.choice([ "Excuse me, are you talking to me?", "Oh are you saying Hello to me?", "Hmmmmmm... are you talking to me? (Hello?)" ]) await message.channel.send(random_reply) else: # 场景2:问候中包含指定对象 random_reply = random.choice([ "Oh hi", "Hello!", "Hi!", "Oh hi!!!" ]) await message.channel.send(random_reply)
代码说明
- 统一小写处理:将消息内容转为小写,避免重复判断不同大小写的关键词,大幅简化代码
- 逻辑修正:用
all(keyword not in content_lower ...)确保所有目标关键词都不在消息中时,才触发场景1的回复 - 简化随机逻辑:把回复内容存入列表,用
random.choice()直接获取随机值,替代繁琐的if-elif判断 - 关键词列表化:问候和目标关键词都做成列表,后续新增或修改关键词只需调整列表,维护更便捷
内容的提问来源于stack exchange,提问作者Bon0309
相关产品推荐
相关产品推荐

