如何解决Discord聊天机器人未回复消息及空消息发送错误
问题分析与解决步骤
核心错误原因
触发Cannot send an empty message是因为机器人尝试发送的响应为空值,结合代码和需求,主要存在以下几个问题:
1. 命令内容截取错误
代码里message.content[2:]会跳过前两个字符,但输入!hi的长度仅为3,[2:]会取第三个字符之后的内容(也就是空字符串),导致聊天机器人接收到空请求,返回空响应。
修复方法:
将截取逻辑改为取!之后的全部内容:
response = chatbot.request(message.content[1:])
2. 环境变量读取语法错误
代码中TOKEN = os.getenv('TOKEN")存在引号语法错误,多余的"会导致无法正确读取Discord机器人令牌,可能引发后续运行异常。
修复方法:
修正为正确的引号格式:
TOKEN = os.getenv('TOKEN')
3. 意图配置文件缺失或错误
如果intents.json中没有配置对应hi的意图规则,GenericAssistant会返回空响应。
修复方法:
确保intents.json文件存在且配置正确,示例配置如下:
{ "intents": [ { "tag": "greeting", "patterns": ["hi", "hello", "hey"], "responses": ["Hello!", "Hi there!", "Hey!"] } ] }
4. 代码变量名笔误(错误日志提示)
错误日志显示代码中调用了await message.channel.send(responses),但你的代码定义的变量是response,如果实际代码中变量名多了s,会因responses未定义导致发送空值。
修复方法:
确保发送的变量名与定义一致:
await message.channel.send(response)
修复后的完整代码
import discord import os from dotenv import load_dotenv from neuralintents import GenericAssistant intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) # 初始化并训练聊天机器人 chatbot = GenericAssistant('intents.json') chatbot.train_model() chatbot.save_model() # 加载环境变量 load_dotenv() TOKEN = os.getenv('TOKEN') @client.event async def on_ready(): print(f'We have logged in as {client.user}') @client.event async def on_message(message): if message.author == client.user: return if message.content.startswith("!"): # 正确截取命令后的用户输入 user_input = message.content[1:] response = chatbot.request(user_input) # 增加空响应判断,避免触发错误 if response: await message.channel.send(response) else: await message.channel.send("抱歉,我没听懂你的意思。") client.run(TOKEN)
额外建议
- 每次修改
intents.json后需重新训练模型;若无需频繁修改,可注释掉chatbot.train_model()和chatbot.save_model(),改用chatbot.load_model()直接加载已保存的模型,提升启动速度。 - 保留空响应判断逻辑,避免再次触发空消息发送错误。
内容的提问来源于stack exchange,提问作者gml13107
相关产品推荐
相关产品推荐

