如何在discord.py中移除Markdown格式以保障eval命令正常运行
问题根因
报错是因为用户输入携带的Markdown代码块标记(包括开头的```<语言标识>和结尾的```)会被直接传入执行逻辑,这些标记不属于合法Python语法,因此触发运行错误。
修复后代码
import re import io import sys import discord from discord.ext import commands # 仅允许服务器管理员调用的校验装饰器,必须添加避免安全风险 def is_admin(): async def predicate(ctx): return ctx.author.guild_permissions.administrator return commands.check(predicate) @client.command() @is_admin() async def eval(ctx, *, code): # 清理Markdown代码块标记的正则逻辑 code_block_pattern = r"^```(?:\w+)?\s?\n(.*?)\n```$" match = re.search(code_block_pattern, code, re.DOTALL) if match: code = match.group(1) out, err = io.StringIO(), io.StringIO() sys.stdout = out sys.stderr = err await ctx.channel.trigger_typing() try: await aexec(code) except Exception as e: err.write(str(e)) finally: sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ results = out.getvalue() errors = err.getvalue() # 修复原代码f-string换行的语法问题 if results: await ctx.send(embed = discord.Embed( title = "Eval 输出", description=f"Output Is \n```bash\n{results}\n```" )) if errors: await ctx.send(embed = discord.Embed( title = "Eval 错误", description=f"Error Is \n```bash\n{errors}\n```" )) await ctx.send(embed = discord.Embed( title = "输入代码", description=f"Input Is \n```py\n{code}\n```" ))
补充说明
- 新增的正则逻辑会自动匹配任意格式的Markdown代码块,提取内部的有效代码内容,无代码块的纯代码输入也能正常兼容
- 新增了执行异常捕获逻辑,运行时错误会直接返回给调用方,不会导致命令无响应
- 新增了标准输出/错误的恢复逻辑,避免影响其他功能的日志输出
- 必须保留管理员权限校验,eval命令风险极高,普通用户调用会直接导致服务器控制权泄露
内容的提问来源于stack exchange,提问作者AidanGamin
相关产品推荐
相关产品推荐

