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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:33:02