如何根据用户输入发送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
相关产品推荐
相关产品推荐

