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

如何为Discord Bot开发执行Python代码的!run命令

实现Discord Bot的Python代码执行命令

我明白你想要的是那种能直接在Discord聊天框里输入Python代码片段,让Bot执行的功能——我之前帮不少人折腾过类似需求,不过先得给你敲个大大的警钟:这个功能风险极高,如果你的Bot是公开可访问的,随便一个陌生人就能输入恶意代码搞垮你的服务器、窃取数据,所以权限控制必须做到极致!

1. 核心实现思路

核心原理就是利用Python的exec()或eval()函数执行传入的代码片段:

  • eval()只能执行单一表达式(比如计算1+1),适合简单求值场景
  • exec()可以执行多行语句、完整代码块,完全匹配你需要的!run ctx.send("Hi")这类需求

2. 基础代码示例(基于discord.py v2.x)

假设你用的是目前主流的discord.py版本,以下是可直接复用的基础实现:

首先初始化Bot并导入依赖:

import discord
from discord.ext import commands

# 开启消息内容意图,否则无法读取用户输入的代码
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)

然后编写!run命令:

@bot.command()
@commands.is_owner()  # 关键!只允许Bot所有者执行,绝对不能对外开放
async def run(ctx, *, code: str):
    try:
        # 只暴露必要的变量到执行环境,避免泄露危险全局函数
        local_env = {
            "ctx": ctx,
            "discord": discord
        }
        # 执行传入的代码
        exec(code, globals(), local_env)
        await ctx.send("代码执行成功!")
    except Exception as e:
        # 捕获并返回错误信息,防止Bot崩溃
        await ctx.send(f"执行出错:{type(e).__name__}: {str(e)}")

最后启动Bot:

bot.run("你的Bot令牌")

3. 关键优化与安全提示

  • 权限锁死:上面用了@commands.is_owner(),只允许你自己(Bot创建者)执行命令。如果需要给特定用户权限,可以改成@commands.has_role("专属管理员角色ID/名称"),绝对不能放开给所有用户!
  • 环境隔离:只把ctx和discord库暴露给执行环境,不要传入os、subprocess这类危险模块,也不要暴露__import__函数,防止别人执行系统级恶意命令。
  • 支持多行代码:如果想让用户输入多行代码(比如循环语句),可以修改命令识别代码块(用三个反引号包裹):
@bot.command()
@commands.is_owner()
async def run(ctx):
    # 提取!run命令后的代码内容
    raw_code = ctx.message.content[len("!run"):].strip()
    # 识别并提取三个反引号包裹的代码块
    if raw_code.startswith("```") and raw_code.endswith("```"):
        code = raw_code[3:-3].strip()
    else:
        code = raw_code
    
    try:
        local_env = {"ctx": ctx, "discord": discord}
        exec(code, globals(), local_env)
        await ctx.send("代码执行成功!")
    except Exception as e:
        await ctx.send(f"执行出错:{type(e).__name__}: {str(e)}")

这样用户就能输入:

!run

for i in range(3):
    await ctx.send(f"第{i+1}次测试消息")
  • 进阶安全方案:如果担心exec()的风险,可以用restrictedpython库做沙箱隔离,它能严格限制代码可访问的函数和变量,进一步降低安全隐患:
from RestrictedPython import compile_restricted, safe_globals
from RestrictedPython.Eval import default_guarded_getitem

# 定义允许的安全全局变量
safe_env = safe_globals.copy()
safe_env.update({
    "ctx": ctx,
    "discord": discord,
    "__getitem__": default_guarded_getitem,
})

# 编译并执行受限代码
byte_code = compile_restricted(code, '<discord-code>', 'exec')
exec(byte_code, safe_env)

最后提醒

不管怎么优化,这个功能始终是个安全隐患——非必要不要给公开Bot添加,就算是私人使用,也要谨慎输入代码,避免误执行删除文件、占用资源的操作。

内容的提问来源于stack exchange,提问作者Moondancer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:57:47