Python开发Discord机器人调用Member.edit()遇参数错误求助
问题解决:Discord机器人Mute命令参数错误
错误原因
你遇到的Member.edit() got an unexpected keyword argument问题,本质是discord.py版本差异导致的参数命名不一致:
- discord.py v1.x版本使用
timeout参数,接收timedelta类型的时长 - discord.py v2.x及以上版本使用
communication_disabled_until参数,接收datetime类型的结束时间
分步解决方案
1. 确认你的discord.py版本
在终端执行以下命令查看当前版本:
pip show discord.py
2. 根据版本修改代码
情况A:discord.py v1.x版本
v1.x没有is_timed_out()方法,且需要用timeout参数传递时长:
@bot.hybrid_command(name="mute", description="Time out a member in the server.") @app_commands.describe(member="The member to time out", duration="Time out duration in minutes", reason="Reason for the time out") @commands.has_permissions(moderate_members=True) async def mute(ctx, member: discord.Member, duration: int, *, reason: str = "No reason provided"): # 替换原is_timed_out()判断逻辑 if member.timed_out_until is not None and member.timed_out_until > datetime.utcnow(): await send_embed(ctx, "Error", f"{member.display_name} is already timed out.") return try: # 使用timeout参数,传递timedelta时长 await member.edit(timeout=timedelta(minutes=duration), reason=reason) await send_embed(ctx, "Success", f"{member.display_name} has been timed out for {duration} minutes. Reason: {reason}") except Exception as e: await send_embed(ctx, "Error", f"Failed to time out {member.display_name}. Error: {str(e)}")
情况B:discord.py v2.x及以上版本
确保代码中正确导入datetime和timedelta,且使用communication_disabled_until参数:
# 确保顶部导入 from datetime import datetime, timedelta @bot.hybrid_command(name="mute", description="Time out a member in the server.") @app_commands.describe(member="The member to time out", duration="Time out duration in minutes", reason="Reason for the time out") @commands.has_permissions(moderate_members=True) async def mute(ctx, member: discord.Member, duration: int, *, reason: str = "No reason provided"): if member.is_timed_out(): await send_embed(ctx, "Error", f"{member.display_name} is already timed out.") return end_time = datetime.utcnow() + timedelta(minutes=duration) try: await member.edit(communication_disabled_until=end_time, reason=reason) await send_embed(ctx, "Success", f"{member.display_name} has been timed out for {duration} minutes. Reason: {reason}") except Exception as e: await send_embed(ctx, "Error", f"Failed to time out {member.display_name}. Error: {str(e)}")
如果仍报错,执行命令升级到最新稳定版:
pip install --upgrade discord.py
3. 额外检查
- 确保机器人在服务器中拥有超时成员(Moderate Members)权限
- 确认目标成员的权限等级低于机器人,避免无法操作
内容的提问来源于stack exchange,提问作者TIon
相关产品推荐
相关产品推荐

