【问题标题】:Executing Python Command from Discord.py从 Discord.py 执行 Python 命令
【发布时间】:2020-08-22 07:34:37
【问题描述】:

所以我想做的是我想在 discord.py 中创建一个评估命令。所以当用户说

.evaluate print("hi")

我希望它将代码发送到 python 并运行它。我看到了subprocess.Popenos.systemsystem 的方法,但它只运行shell 命令。我想知道我是怎么做到的?

【问题讨论】:

    标签: python python-3.x discord discord.py


    【解决方案1】:

    您可以使用 python eval() 函数。当然,允许人们在您的脚本中执行命令是一种安全风险,请格外小心。不确定您要完成什么,应避免此类活动。

    试试:

    @client.command()
    async def evaluate(ctx, *, cmd=None):
        try:
            eval(cmd)
            await ctx.send(f'Your bot friend executed your command --> {cmd}')
        except:
            print(f'{cmd} is an invalid command')
            await ctx.send(f'Your bot friend could not execute an invalid command --> {cmd}')
    

    控制台输出

    None is an invalid command
    hi
    nocommand(junk) is an invalid command
    

    Discord 对话框(使用“?”前缀而不是“.”:

    【讨论】:

    • 为什么这么危险?比如它是如何构成安全风险的?
    【解决方案2】:
    import contextlib
    import io
    @bot.command()
    async def eval(ctx, *, code):
        str_obj = io.StringIO() #Retrieves a stream of data
        try:
            with contextlib.redirect_stdout(str_obj):
                exec(code)
        except Exception as e:
            return await ctx.send(f"```{e.__class__.__name__}: {e}```")
        await ctx.send(f'```{str_obj.getvalue()}```')
    

    请记住,上面的示例非常简单,并且可以扩展。例如,exec 有一个 globals 参数,以便您可以在 eval 语句中使用全局(预定义)变量。你甚至可以格式化你的代码,以便你可以包括:```py

    {你的代码在这里}```

    围绕您的 eval 命令。无论您做什么,确保除了您之外没有人可以访问您的 eval 命令。说真的,如果他们可以访问您的计算机,他们还不如坐在您的计算机旁。

    【讨论】:

    • 我如何允许像py #code 这样的块代码
    • 如果有人可以访问您的 eval 命令,他们将能够用它做可怕的事情。他们可以删除频道、禁止成员并从您的计算机(或运行您的机器人的 vps)中获取个人信息。底线是不要把它给任何人。
    【解决方案3】:

    这里的命令只有所有者。

    @client.command()
    @commands.is_owner()
    async def evaluate(ctx, *, cmd=None):
        try:
            eval(cmd)
            await ctx.send(f'Your bot friend executed your command --> {cmd}')
        except:
            print(f'{cmd} is an invalid command')
            await ctx.send(f'Your bot friend could not execute an invalid command --> {cmd}')
    

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2017-11-01
      • 2013-08-25
      • 1970-01-01
      相关资源
      最近更新 更多