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

Discord.py中on_member_update监听昵称变更运行异常报参数错误

问题原因

on_member_update 是discord.py的原生事件,本身不传递ctx上下文参数,仅会传入修改前的成员对象和修改后的成员对象两个参数。你的函数多定义了ctx参数,导致框架触发事件时传参数量不匹配,触发参数缺失报错。

修复方案

除了修正参数定义外,还需要同步调整依赖ctx的逻辑,同时优化原有代码的边界问题:

  • 移除参数定义中的多余ctx参数
  • 替换Embed的时间戳来源,使用标准UTC时间即可
  • 修正昵称判断逻辑,用户无服务器昵称时显示全局用户名,避免输出None
  • 增加昵称变更判断,避免用户其他信息(如身份组、头像)变更时误触发通知
  • 优化头像获取逻辑,适配默认头像场景避免报错

修复后代码

import discord
from discord.ext import commands

@commands.Cog.listener()
async def on_member_update(self, member_before, member_after):
    # 仅昵称变更时触发通知
    if member_before.nick == member_after.nick:
        return
    
    # 处理昵称展示逻辑,无昵称时显示全局用户名
    nickname_before = member_before.nick if member_before.nick else member_before.name
    nickname_after = member_after.nick if member_after.nick else member_after.name

    embed = discord.Embed(
        timestamp = discord.utils.utcnow(),
        color = discord.Colour.random(),
        title = "成员昵称变更"
    )
    embed.add_field(name = "变更前昵称", value = nickname_before, inline = True)
    embed.add_field(name = "变更后昵称", value = nickname_after, inline = True)
    embed.set_thumbnail(url = member_after.display_avatar.url)
    embed.set_author(name = f"{self.osamu.user}", icon_url = self.osamu.user.display_avatar.url)
    channel = self.osamu.get_channel(898199584726188042)
    await channel.send(embed = embed)

内容的提问来源于stack exchange,提问作者Itz-Toothless

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:57:00