Выполнение Python команды из Discord.py - PullRequest
0 голосов

Итак, я хочу создать команду оценки в discord.py. Поэтому, когда пользователь говорит

.evaluate print("hi")

, я хочу, чтобы он отправил код на python и запустил его. Я видел способы с subprocess.Popen или os.system или system в целом, но он запускает только команды shell. Интересно, как мне это сделать?

Ответы [ 2 ]

1 голос
/ 07 мая 2020
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, кроме вас . Серьезно, они могут сидеть за вашим компьютером, если у них есть к нему доступ.

1 голос
/ 07 мая 2020

Вы можете использовать функцию python eval () . Конечно, разрешение людям выполнять команды в вашем сценарии представляет собой угрозу безопасности, поэтому будьте предельно осторожны. Не уверен, что вы пытаетесь выполнить sh, этого типа деятельности следует избегать.

Попробуйте:

@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 (используя префикс «?» вместо «.»:

enter image description here

...