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

使用discord.py开发Bot报错:'Client'对象无'process_commands'属性

问题解决:AttributeError: 'Client' object has no attribute 'process_commands'

错误根源

discord.Client是Discord.py的基础客户端类,仅处理核心Discord事件,没有process_commands方法——这个方法属于discord.ext.commands.Bot类,后者是专门用于管理前缀式命令的扩展客户端。你调用了不属于当前客户端的方法,因此触发报错。


两种修复方案

方案一:保留自定义命令解析,移除多余调用

如果你想继续手动处理前缀命令和关键词回复,只需删除引发错误的代码,并补全必要的权限配置:

import os
import discord
from discord import app_commands

token = os.environ['TOKEN']
intents = discord.Intents.default()
intents.message_content = True  # 必须开启,否则无法读取消息内容
bot = discord.Client(intents=intents)
tree = app_commands.CommandTree(bot)
api_token = os.environ['api_token']

@bot.event
async def on_message(message):
  if message.author == bot.user:
    return

  if bot.user.mentioned_in(message):
    prefix = "!!"
    response = f"My prefix is `{prefix}`, you can run !!help to get started."
    await message.channel.send(response)

  if not message.author.bot:
    # 新增判断:避免非!!开头的消息触发索引越界错误
    if message.content.startswith("!!"):
      server_id = str(message.guild.id)
      config = load_config()
      response_data = load_response()

      if server_id in config:
        command = message.content[len("!!"):].split(' ')[0]
        if command in config[server_id]:
          response = config[server_id][command]
          await message.channel.send(response)

    # 关键词回复逻辑
    server_id = str(message.guild.id)
    response_data = load_response()
    for word in message.content.split():
      if server_id in response_data and word in response_data[server_id]:
        await message.channel.send(response_data[server_id][word])
        break

bot.run(token)

修改点说明:

  1. 删除最后一行await bot.process_commands(message)
  2. 开启message_content意图(默认不启用,无法读取消息内容)
  3. 新增message.content.startswith("!!")判断,避免非命令消息触发字符串索引错误

方案二:改用commands.Bot规范管理命令

更推荐这种方式,利用Discord.py内置的命令系统,无需手动解析前缀,同时兼容斜杠命令:

import os
import discord
from discord import app_commands
from discord.ext import commands

token = os.environ['TOKEN']
intents = discord.Intents.default()
intents.message_content = True
# 使用commands.Bot替代Client,指定命令前缀
bot = commands.Bot(command_prefix="!!", intents=intents)
tree = app_commands.CommandTree(bot)
api_token = os.environ['api_token']

# 斜杠命令示例(按需添加)
@tree.command(name="test", description="测试斜杠命令")
async def test(interaction: discord.Interaction):
  await interaction.response.send_message("斜杠命令生效!")

# 前缀命令示例(替代手动解析逻辑)
@bot.command(name="help")
async def help_command(ctx):
  await ctx.send("这是帮助信息!")

# 自定义配置命令示例
@bot.command()
async def custom_command(ctx):
  server_id = str(ctx.guild.id)
  config = load_config()
  if server_id in config and ctx.command.name in config[server_id]:
    await ctx.send(config[server_id][ctx.command.name])

@bot.event
async def on_message(message):
  if message.author == bot.user:
    return

  if bot.user.mentioned_in(message):
    response = f"My prefix is `{bot.command_prefix}`, you can run !!help to get started."
    await message.channel.send(response)

  # 关键词回复逻辑
  if not message.author.bot:
    server_id = str(message.guild.id)
    response_data = load_response()
    for word in message.content.split():
      if server_id in response_data and word in response_data[server_id]:
        await message.channel.send(response_data[server_id][word])
        break

  # 必须调用此方法,让Bot处理前缀命令
  await bot.process_commands(message)

# 同步斜杠命令到服务器
@bot.event
async def on_ready():
  await tree.sync()
  print(f"Logged in as {bot.user}")

bot.run(token)

修改点说明:

  1. 导入discord.ext.commands模块,用commands.Bot创建客户端实例并指定前缀
  2. 保留process_commands调用,用于触发内置前缀命令系统
  3. 添加on_ready事件同步斜杠命令

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:55:33