Discord.py开发:命令字符串字符提取错误导致Embed无输出
问题根因
你的代码存在多处逻辑错误,直接导致Embed无内容、判断失效:
- 字符串切片计算完全错误:测试命令
!en L BTC 19500总长度为15,你写的x[4:len(x)-11]等价于取索引4到4的空字符串,永远无法匹配到"L",message变量始终未被赋值,传入Embed自然没有内容 - 权限判断逻辑写法规避了校验:
if (ctx.author.id == 573284477158162433 or 244240895627624448)中,非0整数244240895627624448在布尔判断中恒为True,这个判断永远成立,完全没起到权限校验作用 - 字符串拼接时直接硬换行没有转义,会触发语法错误
- 频道发送逻辑放在for循环外部,循环仅做了频道获取没有执行发送,最终只会给频道列表最后一个频道发消息
- 未编写"L"不在指定位置的处理分支,匹配失败时
message无有效值,直接传入Embed就会出现空内容
修复后可直接运行的代码
@bot.command() async def en(ctx): # 修复权限判断逻辑 if ctx.author.id not in [573284477158162433, 244240895627624448]: return global channels # 按空格拆分命令参数,替代手动算切片位置的写法,容错率更高 args = ctx.message.content.strip().split() # 增加命令格式校验,避免参数缺失报错 if len(args) < 4: await ctx.send("命令格式错误,正确用法:!en [L/S] [币种] [进场价格]") return position_type = args[1] ticker = args[2] entry_price = args[3] if position_type == "L": message = f"**Type:Long **\n**Ticker: **{ticker}\n**Entry Price:** {entry_price}" else: # 可自行替换L不在指定位置时需要发送的消息格式,示例为S空单格式 message = f"**Type:Short **\n**Ticker: **{ticker}\n**Entry Price:** {entry_price}" await ctx.send(content="@everyone", allowed_mentions=allowed_mentions) embed = discord.Embed(title="Entry", description=message, color=0x70f508) embed.timestamp = datetime.datetime.utcnow() embed.set_footer(text="Viggy Analytics") # 修复循环逻辑,给所有配置的频道发送消息 for channel_id in channels: disc_channel = bot.get_channel(channel_id) # 增加频道存在性判断,避免频道ID填错时机器人崩溃 if disc_channel: await disc_channel.send(embed=embed)
优化说明
- 放弃手动计算字符串切片位置的写法,直接用
split()按空格拆分命令参数,不管价格是几位数、币种代码长度是多少都能正确识别,不会因为命令长度变化失效 - 补充了命令格式校验,用户输错参数时会直接提示正确用法,不会抛出异常
- 补全了非L仓位的消息分支,不会出现
message未定义的情况 - 修复了频道循环发送的逻辑,所有配置的频道都能收到消息
- 用f字符串做字符串拼接,比原来的加号拼接可读性高很多,换行直接写
\n不会有语法问题
内容的提问来源于stack exchange,提问作者Vignesh
相关产品推荐
相关产品推荐

