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

discord.py中on_member_ban事件触发时TypeError报错求助

解决on_member_ban事件的TypeError报错

报错核心原因

discord.py 的 on_member_ban 事件触发时,会自动传入两个位置参数:guild(触发事件的服务器对象)和 user(被封禁的成员对象)。你定义的回调函数只接收了一个 message 参数,导致参数数量不匹配,抛出 TypeError。

修正方案及代码

  1. 修正函数参数:将函数签名改为接收 guild 和 user 两个参数
  2. 修正对象引用:原代码错误使用了 message 对象,需替换为正确的事件参数和审核日志条目数据
  3. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:42:52