discord.py中on_member_ban事件触发时TypeError报错求助
解决on_member_ban事件的TypeError报错
报错核心原因
discord.py 的 on_member_ban 事件触发时,会自动传入两个位置参数:guild(触发事件的服务器对象)和 user(被封禁的成员对象)。你定义的回调函数只接收了一个 message 参数,导致参数数量不匹配,抛出 TypeError。
修正方案及代码
- 修正函数参数:将函数签名改为接收
guild和user两个参数 - 修正对象引用:原代码错误使用了
message对象,需替换为正确的事件参数和审核日志条目数据 - 调整Embed内容:确保展示的封禁者、被封禁用户及原因信息准确
修正后的完整代码:
import discord import json @bot.event async def on_member_ban(guild, user): # 获取最新的封禁审核日志条目 async for entry in guild.audit_logs(limit=1, action=discord.AuditLogAction.ban): with open("database\\wae.json", encoding="utf-8") as f: data = json.load(f) guild_id_str = str(guild.id) if guild_id_str not in data: return log_channel_id = data[guild_id_str]['logchlID'] if log_channel_id == 0: return channelrs = bot.get_channel(log_channel_id) if not channelrs: return # 防止日志频道不存在导致报错 embed = discord.Embed(title="Member Banned", color=discord.Colour.red()) embed.add_field(name="被封禁用户", value=f"{user} ({user.id})") embed.add_field(name="封禁执行者", value=f"{entry.author} ({entry.author.id})") embed.add_field(name="封禁原因", value=entry.reason if entry.reason else "无") embed.set_author(name=f"{entry.author.display_name} (@{entry.author.name})", icon_url=entry.author.display_avatar.url) embed.set_thumbnail(url=user.display_avatar.url) await channelrs.send(embed=embed)
额外优化说明
- 增加了日志频道不存在的判断,避免因配置错误导致后续报错
- 补充展示用户ID,方便精准定位
- 处理了封禁原因为空的情况,避免显示
None
内容的提问来源于stack exchange,提问作者As2Bax
相关产品推荐
相关产品推荐

