Discord机器人on_guild_update报错:缺少必填参数'after'排查
问题原因与解决方案
核心问题1:事件函数参数错误
Discord.py的on_guild_update事件根本不需要ctx参数,它的标准签名是async def on_guild_update(before: discord.Guild, after: discord.Guild)。你额外加了ctx,导致事件触发时Discord传入的before和after被错当成ctx和before,自然会提示缺少after参数。
核心问题2:头像设置逻辑错误
就算去掉ctx,你原来的await bot.user.edit(avatar=after.icon_url)也会报错——edit方法的avatar参数需要的是二进制字节数据,不是图标URL。你得先把服务器图标下载成bytes格式再传入。
修正后的完整代码
@bot.event async def on_guild_update(before: discord.Guild, after: discord.Guild): # 确认图标确实发生了变更 if before.icon != after.icon: # 处理服务器无图标的情况,避免报错 if after.icon is None: # 可选择设置默认头像,或直接返回不修改 return # 下载服务器图标为二进制数据(这里取最大尺寸) avatar_bytes = await after.icon.read() # 修改机器人头像 await bot.user.edit(avatar=avatar_bytes)
补充说明
因为你的机器人在两个服务器,任意一个服务器图标变更时,机器人头像都会同步为该服务器的新图标,符合你的需求。如果只想监听特定服务器,可以在函数开头加过滤判断:if after.id not in [服务器ID1, 服务器ID2]: return,忽略无关的服务器更新事件。
内容的提问来源于stack exchange,提问作者Happy Deer
相关产品推荐
相关产品推荐

