如何为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
相关产品推荐
相关产品推荐

