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

如何根据用户输入发送Discord embed,修复discord.py MissingRequiredArgument报错

错误根因

你将msg设置为了peakrating命令的必填入参,要求用户必须发送!peakrating 具体ID才能触发命令,和你预期「用户先发送!peakrating、机器人主动询问ID再接收用户后续输入」的逻辑完全不匹配,所以用户只发!peakrating时就会触发缺少必填参数的报错。同时你的原代码中ctx.send("What is your id")前漏写了await关键字,即使参数问题解决也会执行失败。

修复后完整代码

import discord
from discord.ext import commands
import requests

# 替换为你自己的API密钥
BRAWLHALLA_API_KEY = "MY_API_KEY"

@client.command()
async def peakrating(ctx):
    # 先回复询问用户ID
    await ctx.send("What is your id")
    
    # 监听用户回复,只接收触发命令的同一用户、同一频道的消息
    def check(msg):
        return msg.author == ctx.author and msg.channel == ctx.channel
    
    try:
        # 等待用户回复,超时时间设为30秒,可自行调整
        user_msg = await client.wait_for('message', check=check, timeout=30)
        player_id = user_msg.content.strip()
        
        # 调用Brawlhalla接口
        url = f"https://api.brawlhalla.com/player/{player_id}/ranked?api_key={BRAWLHALLA_API_KEY}"
        resp = requests.get(url)
        resp.raise_for_status() # 接口返回4xx/5xx时主动抛出异常
        udata = resp.json()
        
        if 'peak_rating' not in udata:
            await ctx.send("未查询到对应用户的峰值评分数据,请检查输入的ID是否正确")
            return
        
        upeakrating = udata['peak_rating']
        premb = discord.Embed(title="PeakRating")
        premb.add_field(name="Your peak elo", value=f"{upeakrating}")
        await ctx.send(embed=premb)
    
    except requests.exceptions.RequestException:
        await ctx.send("接口请求失败,请稍后重试")
    except TimeoutError:
        await ctx.send("已超时,请重新发送命令触发查询")

核心修改点

  • 移除了命令定义中的必填msg参数,用户仅发送!peakrating即可正常触发命令
  • 补全了所有异步方法前的await关键字,符合discord.py的异步执行要求
  • 新增wait_for逻辑监听同用户同频道的后续输入,匹配你要先询问再接收ID的交互逻辑
  • 新增了超时、接口请求失败、数据不存在的异常兜底,避免特殊情况直接抛出错误

内容的提问来源于stack exchange,提问作者Alex is funny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:02