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

discord.py机器人无法读取消息的问题求助

问题分析与修复方案

核心问题总结

你的代码存在多个关键错误,导致机器人无法读取消息:

  • 同时初始化commands.Bot和discord.Client两个实例,两者冲突,最终仅运行了client实例,但该实例未正确配置消息监听逻辑
  • on_message函数缺少事件装饰器,无法触发消息监听
  • 未开启message_content意图,Discord默认禁用该意图,导致机器人无法获取消息内容
  • start命令中错误引用message.author,命令上下文应使用ctx.author
  • TOKEN未正确从配置文件加载,硬编码的无效值无法让机器人正常连接

修复后的完整代码

import datetime
import os
import discord
from timeit import default_timer as timer
from dotenv import load_dotenv
from discord.ext import commands

load_dotenv()

# 配置意图:开启成员管理和消息内容权限
intents = discord.Intents.default()
intents.members = True
intents.message_content = True

# 仅初始化一个Bot实例,整合命令与消息监听功能
bot = commands.Bot(command_prefix="!", intents=intents)

# 从.env文件读取TOKEN(需确保.env文件中存在DISCORD_TOKEN字段)
TOKEN = os.getenv('DISCORD_TOKEN')

@bot.event
async def on_ready():
    print(f'{bot.user} 已连接到Discord!')

@bot.event
async def on_message(message):
    # 跳过机器人自身发送的消息,避免循环触发
    if message.author == bot.user:
        return
    print(f'用户 - {message.author} 发送了 - {message.content}')
    # 必须调用此方法,否则自定义on_message会拦截命令
    await bot.process_commands(message)

@bot.command()
async def start(ctx):
    await ctx.channel.send("你已启动")
    # 使用ctx.author获取命令发起者,用f-string正确拼接角色名
    await ctx.guild.create_role(name=f"{ctx.author}w")

bot.run(TOKEN)

关键修复说明

  • 移除冗余实例:commands.Bot是discord.Client的子类,包含所有客户端功能并支持命令系统,只需保留一个Bot实例即可
  • 开启消息内容意图:需先在Discord开发者门户的机器人设置中开启"Message Content Intent"权限,再在代码中启用该意图
  • 添加事件装饰器:给on_message添加@bot.event装饰器,确保Bot实例能监听消息事件
  • 修复命令变量引用:命令中通过ctx.author获取发起者,用f-string正确拼接角色名称
  • 处理命令拦截:自定义on_message时,必须调用bot.process_commands(message),否则命令会被消息监听逻辑拦截
  • 正确加载TOKEN:通过os.getenv从.env文件读取TOKEN,保证配置安全且符合规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:15:09