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
相关产品推荐
相关产品推荐

