Discord.py机器人被提及无响应:指定频道@触发随机回复失效
代码失效原因定位
- 第二版代码存在明确API调用错误:Discord.py中
Message实例没有内置send方法,调用msg.send()会直接触发AttributeError,消息根本无法发出。正确的消息发送入口是消息所属的频道对象,即msg.channel.send()。 - 第一版代码存在缓存稳定性问题:调用
bot.get_channel(797224597443051611)获取的频道对象来自机器人本地缓存,如果机器人刚启动时缓存未加载完成、或者跨场景请求时缓存未命中,会返回None,此时调用chat.send()会直接报错;同时没有过滤机器人自身发送的消息,容易触发无限循环回复。 - 两个版本共同的隐性失效诱因:
- 未在代码顶部导入
random模块、未提前定义非空的text随机文本列表,会触发运行时错误 - 没有开启
Message Content Intent,Discord接口返回的消息内容为空,导致bot.user.mentioned_in(msg)永远返回False
- 未在代码顶部导入
可直接运行的正确实现
import random import discord from discord.ext import commands # 提前定义随机回复文本列表,可自行扩充内容 text = [ "我收到啦", "有什么我能帮忙的?", "这个话题挺有意思的" ] # 替换为你需要监听的目标频道ID TARGET_CHANNEL_ID = 797224597443051611 # 配置机器人需要的网关意图 intents = discord.Intents.default() intents.message_content = True bot = commands.Bot(command_prefix="!", intents=intents) @bot.event async def on_message(msg): # 过滤机器人自身发送的消息,避免循环触发 if msg.author.bot: return # 只响应目标频道内的消息 if msg.channel.id != TARGET_CHANNEL_ID: return # 检测消息中是否提及机器人 if bot.user.mentioned_in(msg): reply_content = f"{msg.author.mention} {random.choice(text)}" # 直接用当前消息所在的频道发送回复,不依赖提前缓存的频道对象 await msg.channel.send(reply_content) # 必须调用方法处理命令流程,否则机器人的所有前缀命令会失效 await bot.process_commands(msg) # 启动时替换为自己的机器人令牌即可运行 # bot.run("你的机器人访问令牌")
上线前检查项
- 到Discord开发者后台的机器人设置页,打开Privileged Gateway Intents分类下的Message Content Intent开关,否则接口无法获取消息文本内容,提及检测会完全失效
- 提前确认
text列表内有至少1条有效文本,避免random.choice()从空列表取值报错 - 不要在检测频道、检测提及的分支前提前
return,否则会阻断后续的命令处理流程
内容的提问来源于stack exchange,提问作者garadosix
相关产品推荐
相关产品推荐

