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

Discord.py报错AttributeError: CategoryChannel对象无history属性如何解决

问题原因

抛出该错误的核心原因是Discord中的频道分为多种类型,只有**文字频道(TextChannel)**才支持history()方法,你当前遍历的guild.channels包含了分类频道(CategoryChannel)、语音频道(VoiceChannel)等不支持消息历史查询的频道类型,调用history()时自然会触发属性不存在报错。

修复方案

你需要对遍历的频道做过滤,同时原代码还存在其他逻辑bug,可以按以下步骤调整:

  • 直接遍历guild.text_channels获取所有可读取历史的文字频道,避免无效频道进入后续逻辑
  • 修正存储消息的字典初始化逻辑,原代码setdefault传入字符串作为初始值,后续调用append()会触发类型错误
  • 取消冗余的全用户遍历匹配逻辑,直接判断消息作者身份即可,大幅提升运行效率
修复后完整代码
import discord
from discord.ext import commands

# 注意开启消息内容权限,Discord开发者后台需要开启MESSAGE CONTENT INTENT
intents = discord.Intents.default()
intents.message_content = True
intents.members = True

client = commands.Bot(command_prefix='!', intents=intents)

@client.event
async def on_ready():
    # 存储结构:key为用户对象,value为用户发送的所有消息内容列表
    user_msg_data = {}
    for guild in client.guilds:
        # 只遍历服务器下的文字频道
        for channel in guild.text_channels:
            # 可在history里加limit参数限制读取消息数量,避免消息太多运行过久
            async for message in channel.history(limit=None):
                # 跳过机器人发送的消息,不需要统计的话可以删除这行
                if message.author.bot:
                    continue
                # 初始化用户对应的消息列表
                user_msg_data.setdefault(message.author, [])
                user_msg_data[message.author].append(message.content)
    # 输出统计结果,可按需求修改输出格式
    for user, msgs in user_msg_data.items():
        print(f"用户{user.name} 发送消息总数量:{len(msgs)}")
    print("统计完成")

client.run("你的机器人Token")
注意事项
  • 需要在Discord开发者后台的机器人设置页,开启MESSAGE CONTENT INTENT权限,否则无法读取消息内容
  • 如果服务器消息量很大,建议给history()方法加limit参数限制拉取的消息数量,避免触发Discord接口限流

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:15:05