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

Discord.py中如何获取被提及用户的消息?旧版Bot更新后wait_for参数报错问题解决

解决discord.py中Client.wait_for()的"unexpected keyword argument 'author'"错误

你遇到的问题是因为discord.py的API更新后,wait_for()方法不再支持直接传入author关键字参数了——这个参数在旧版本里可用,但新版本已经移除,必须通过**check回调函数**来验证消息发送者的身份。

问题根源

原来的代码里这一行:

antwort = await bot.wait_for(author = op, timeout=90)

在新版本discord.py中,wait_for()第一个参数必须指定要等待的事件类型(比如'message'),然后通过check参数传入一个函数,用来过滤符合条件的事件。

修改方案

  1. 首先,定义一个check函数,确保回复来自目标用户op,且在同一个频道内(避免其他频道的消息干扰):
def check(msg):
    return msg.author == op and msg.channel == ctx.channel
  1. 修改wait_for()的调用方式,加上事件类型'message'和check参数,同时处理超时情况(避免程序卡住):
import asyncio  # 需要导入asyncio来处理超时异常

# ... 前面的攻击计算代码保持不变 ...

else:
    await ctx.send(f"{ctx.message.author.mention} griff {op.mention} mit **{__erfolg}** Erfolgen an! {op.nick} gib bitte deinen Wert für physische Verteidigung ein.")

# 修改后的wait_for部分
try:
    antwort = await bot.wait_for('message', check=check, timeout=90)
except asyncio.TimeoutError:
    return await ctx.send(f"{op.mention} 超时未回复,操作已取消!")

antwortVer = antwort.content
verteidigung = int(antwortVer)
# ... 后面的防御计算代码保持不变 ...

额外优化建议

你可以把重复的掷骰子逻辑封装成一个独立函数,减少代码冗余,比如:

def calculate_success(dice_count):
    erfolg = 0
    sechs = dice_count
    while sechs > 0:
        _, current_erfolg, current_sechs = wurf(sechs)
        erfolg += current_erfolg
        sechs = current_sechs
    return erfolg

这样前面的攻击计算可以简化为__erfolg = calculate_success(a),防御计算简化为erfolgVer = calculate_success(verteidigung),代码会更整洁易维护。

内容的提问来源于stack exchange,提问作者Kendel Ventonda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:22:39