Alguien podría traducirme este código de un bot de Discord

Iniciado por DaWrench, Abril 19, 2021, 02:42:32 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 19, 2021, 02:42:32 PM Ultima modificación: Abril 20, 2021, 03:03:22 AM por AXCESS
Hola a tod@s.
Estoy haciendo un reto, en el cual parto de esta imagen y mi objetivo es obtener el valor de FLAG:



Investigando, logré hallar que pertenece a un bot de Discord y deduzco que tengo que enviarle un mensaje de manera que él me responda con la flag. El caso es que he probado un millón de combinaciones atendiendo al código y no hay manera.
Mis conocimientos de programación son muy, muy limitados y esto es lo que he logrado entender o deducir del código leyendo mucho, mucho, pero mucho en Internet:

Código: php
#Algo relacionado con una referencia al token de nuestro bot (una especie de identificador).
token = os.environ["TOKEN"]
#Se refiere a la variable de entorno FLAG (lo que nos interesa)
botf = os.environ["FLAG"]
#Define el prefijo que deben tener los comandos para interactuar con el bot (!).
bot = commands.Bot(command_prefix="!")

#Significa que el bot sólo aceptará mensajes en un entorno DM, es decir, privado.
@commands.dm_only()
#Es el comando que provocará una determinada respuesta en el bot. Se deduce que junto con el prefijo sería "!!".
@bot.command(name="!")
#roll es el nombre de la función.
#async def es una función corutinaria que sirve para definir "grupos" (no me sale el nombre).
# : int convierte el argumento o  en un número entero.
async def roll(ctx ,o: int):
ans = [
':man_shrugging:',
'Para Bellum',
'I once saw him kill three men in a bar... with a pen',
'Everything's got a price',
'Guns. Lots Of Guns'
]
#ctx=El contexto
#message=El mensaje que desencadena la ejecución del comando.
#author=El Miembro que envió el mensaje. Si el canal es privado o el usuario ha dejado el grupo, es un Usuario.
u = ctx.message.author
#t=John en ASCII
t = chr(74)+chr(111)+chr(104)+chr(110)
# object.__str__() = u.__str__(). Devuelve una representación "bonita", que los humanos podamos entender fácilmente, de object.
#str.split() transforma una cadena de texto en una lista. Por ejemplo, si str = "apple#banana#cherry#orange", split() lo transformará en ["apple", "banana", "cherry", "orange"].
#Entiendo que t, es decir, "John", debe estar integrado en u. En otras palabras, el usuario debe mandar "John"
if t in u.__str__().split('#')[0] and o ==299 :
#Parece que está línea es la encargada de mandar la flag (botf).
#.send se encarga de devolver "||" botf "||" al usuario (u)
await u.send("||"+botf+"||")
now = datetime.datetime.now()
else:
await u.send(random.choice(ans))


La línea que más me está matando es if t in u.__str__().split('#')[0] and o ==299 :. Porqué está ese hashtag ahí?! Y el 0?! Y qué demonios es o? Se supone que debo mandar el mensaje 299 veces?!!
No me gusta hacer esto, me siento sucio, pero creo ha llegado la hora de pedir ayuda.
Gracias de antemano a todo el que se ofrezca a echar una mano.

Hola que tal?, no soy programador de py, por lo cual no conozco muy bien las funciones y tal, pero, diría lo siguiente:

Primero el flag que buscas viene de una variable del sistema a la que no puedes acceder directamente, este bot la expone cuando se cumple el if, que dice el if? aparentemente coloca en u el autor del mensaje, luego en el if lo serializa (se ve que es un objeto) convirtiendolo a texto: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta , luego divide el usuario por # (recordar dar que los usuarios de discord son USUARIO#NUMERO y lo divide entonces en 2, y con el 0 agarra la primera parte (el 0 es el usuario y el 1 es el numero), agarra el usuario y verifica si contiene t (entiendo que eso hace el in).

¿que es t?, bueno arriba va convirtiendo numeros en caracteres para formar t, si te fijas una tabla ascii No tienes permitido ver los links. Registrarse o Entrar a mi cuenta parecieran dar las letras de Jhon, que deberían ser parte de tu usuario (por lo cual necesitas un usuario que diga Jhon).

Luego dice y o == 299, de donde sale o?, viene del parametro de la función roll, que según la documentación de bots de discrods No tienes permitido ver los links. Registrarse o Entrar a mi cuenta el segundo parametro son los argumentos del bot es decir los que pondrías segun la documentación en el comando que le envías, tener en cuenta que el comando comienza con el prefijo ! en vez del default $ que dice la documentacion.

en resumen tendrías que enviar un privado con un comando !algo 299 y tu nick contener Jhon para que la respuesta en vez de ser una de esas al azar sea la correcta.

De igual forma no se mucho de python, solo deduzco, quizá alguien de python te de mas data o mas correcta.

Saludos!

Primero que nada, gracias por tomarte las molestias de ayudarme.

He tomado nota de lo que has dicho y me he cambiado el nombre de usuario a John-T y he probado a mandar distintas cosas:
!John 299
!299
!John#299
etc

Y algo que me mosquea es que, como dices, parece que debería darme una de esas respuestas aleatorias pero no me dice NADA. Y pone que está activo.

También leido que el parámetro .split() sirve para sustituir lo que indiques dentro del paréntesis por comas, de hecho aquí hay un ejemplo muy parecido a esta línea: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, por lo que no sé si habrá que poner varias palabras.

Hola,

Donde está el bot?

quiero probar cosas para ver si puedo sacar la flag.

saludos