You need to enable JavaScript to run this app. Discord.py机器人被提及无响应:指定频道@触发随机回复失效
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 01:36:04