Entonces, lo que quiero hacer es crear un comando de evaluación en discord.py. Entonces cuando el usuario dice

.evaluate print("hi")

Quiero que envíe el código a Python y lo ejecute. He visto formas con subprocess.Popen o os.system o system en general, pero solo ejecuta los comandos shell. Me preguntaba cómo hago esto?

0
AK - 10CA - Glenforest SS 2172 7 may. 2020 a las 08:23

2 respuestas

La mejor respuesta
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()}```')

Tenga en cuenta que el ejemplo anterior es muy simple y se puede ampliar. Por ejemplo, exec tiene un argumento globals para que pueda usar variables globales (predefinidas) en sus declaraciones de evaluación. Incluso puede formatear su código para que pueda incluir: `` `py

{su código aquí} `` `

Alrededor de su comando eval. Hagas lo que hagas, asegúrate de que nadie tenga acceso a tu comando eval excepto tú . En serio, también podrían estar sentados en su computadora si tienen acceso a ella.

1
hipeople321 7 may. 2020 a las 05:48

Puede usar la función python eval (). Por supuesto, permitir que las personas ejecuten comandos en su script es un riesgo de seguridad, proceda con extrema precaución. No estoy seguro de lo que está tratando de lograr, este tipo de actividad debe evitarse.

Tratar:

@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}')

Salida de la consola

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

Diálogo de discordia (usando un prefijo "?" En lugar de ".":

enter image description here

1
DaveStSomeWhere 7 may. 2020 a las 05:51