You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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)

代码说明

  1. 统一小写处理:将消息内容转为小写,避免重复判断不同大小写的关键词,大幅简化代码
  2. 逻辑修正:用all(keyword not in content_lower ...)确保所有目标关键词都不在消息中时,才触发场景1的回复
  3. 简化随机逻辑:把回复内容存入列表,用random.choice()直接获取随机值,替代繁琐的if-elif判断
  4. 关键词列表化:问候和目标关键词都做成列表,后续新增或修改关键词只需调整列表,维护更便捷

内容的提问来源于stack exchange,提问作者Bon0309

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:36:28