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

如何为Discord Bot创建可执行Python命令的!run指令?

嘿,我完全懂你想要实现的功能——让Discord机器人能直接执行你在聊天框里发的Python代码对吧?这个功能我也见过不少私用机器人在用,但先得给你打个大大的安全预防针:直接执行用户输入的任意Python代码风险极高,要是你的机器人对外开放,很容易被人用来执行恶意操作(比如删文件、搞服务器),所以一定要只在私人服务器用,或者加严格的权限锁!

下面给你基于discord.py的实现方案,毕竟你提到了ctx,应该是用这个库开发的:

实现步骤(discord.py版本)

1. 基础指令框架

核心是用Python的exec()或eval()函数执行代码,关键是要把ctx(还有你需要的其他变量)注入到代码执行环境里,这样用户输入的代码才能调用机器人的上下文方法:

import discord
from discord.ext import commands
import inspect  # 用来判断异步协程对象

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

@bot.command()
@commands.is_owner()  # 只允许机器人所有者使用,安全第一!
async def run(ctx, *, code: str):
    try:
        # 只提供必要的变量给执行环境,减少风险暴露
        local_env = {
            "ctx": ctx,
            "discord": discord,
            "bot": bot  # 如果需要让代码调用bot对象可以加上
        }
        
        # 先尝试用eval执行表达式(比如计算1+2、获取服务器名称)
        result = eval(code, globals(), local_env)
        
        # 如果返回的是协程对象(比如ctx.send是异步方法,需要await)
        if inspect.iscoroutine(result):
            result = await result
        
        # 有返回值就发送结果,没有则提示执行完成
        if result is not None:
            await ctx.send(f"✅ 执行结果:\n`{result}`")
        else:
            await ctx.send("✅ 代码执行完成!")
            
    except SyntaxError:
        # 如果是语句(比如批量发送消息、定义变量),用exec执行
        exec(code, globals(), local_env)
        await ctx.send("✅ 代码执行完成!")
        
    except Exception as e:
        # 捕获所有错误并反馈给用户
        await ctx.send(f"❌ 执行出错:\n`{str(e)}`")

bot.run("你的机器人Token")

2. 关键细节说明

  • 异步处理:discord.py里的多数方法都是异步的,比如ctx.send(),所以用户输入代码时要加上await,比如发送!run await ctx.send("Hello from code!")才能正常执行。
  • 权限控制:我在指令上加了@commands.is_owner()装饰器,仅机器人创建者可用。如果你想给特定用户权限,可以改成检查用户ID:
    ALLOWED_USERS = [1234567890, 9876543210]  # 替换成允许的用户ID
    @bot.command()
    async def run(ctx, *, code: str):
        if ctx.author.id not in ALLOWED_USERS:
            await ctx.send("你没有权限使用这个指令!")
            return
        # 后面的执行代码同上
    
  • 安全强化:如果要更稳妥,可以用restrictedPython库创建沙箱环境,限制代码能访问的模块和方法,避免用户执行import os; os.system("rm -rf /")这种危险操作。

3. 测试示例

  • 执行异步消息发送:!run await ctx.send("Hi there!") → 机器人会发送"Hi there!"
  • 执行表达式计算:!run 2 ** 10 → 机器人返回✅ 执行结果:\n1024``
  • 执行简单语句:!run msg = "Hello"; await ctx.send(msg) → 机器人发送"Hello"

最后再强调一遍:这个功能只适合私人使用,千万不要给不信任的人权限!

内容的提问来源于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:55:24