class_22-cd42ffe3

La App Makers

¡Hola a todo el mundo! El día de hoy nos vamos a poner bien mamadísimos porque vamos a hacer que el “sistema de descarga de Assets” que hicimos en el Post #18, pueda descargar archivos de Mediafire sin problemas.
Esto le vendrá como anillo al dedo para quienes quieren hacer un descargador de Assets en Ren’Py, pero que no tienen para costear un Hosting para alojar los archivos del juego.

Considera a este post como una actualización para el post donde hicimos el sistema de descargas, asi que si no estás enterado de qué va todo, visitalo presionando Este hipervínculo!

Sin más que agregar, ¡vamos a picar código gente!


STATUS CHECK : Todo el contenido de este post ha sido verificado, y es compatible con la última versión emitida de Ren’Py.

DESCARGO DE RESPONSABILIDAD : Lo que veas en este post, se divulga SOLO con fines educativos y para usos que, en la medida de lo posible, no afectarían a ninguna persona o algún servicio. Si decides usar lo enseñado para fines no previstos en este post, o para actos indebidos y/o maliciosos, queda absolutamente bajo TÚ propia responsabilidad.


1. ¿QUÉ ES EL WEB SCRAPING?

Esta técnica sin lugar a dudas será el anfitrión del post de hoy, por lo que necesita tener una introducción decente para que entiendas que qué va a ir todo lo que seguirá del tutorial.

Siendo precisos, el Web Scraping se define como el proceso de recopilar información de forma automática de una Web”.
Esto se traduce como una técnica con el que podemos extraer información que proporciona un determinado sitio web. Gracias a esta técnica, un fragmento de código puede “simular” que es un humano visitando tal sitio web, solo que su propósito real, es extraer datos puntuales y organizarlos para acceder a ellos de una forma más cómoda.

1.1. ¿POR QUÉ RAZÓN SE DEBE APLICAR EL WEB SCRAPING A MEDIAFIRE? :

Este es el punto interesante de discusión, y te voy a dejar el ejemplo puesto de inmediato. Entra a la siguiente URL que pertenece a un archivo de imagen alojado en Mediafire (Por supuesto, regresa al post después de verla >:V) :

Esa es una URL compartida, la que usas para compartir un archivo alojado en Mediafire para que otros usuarios lo descarguen, pero esta URL nos muestra una página con un montón de objetos de interfaz, el cual no nos sirve de nada para lo que queremos hacer.
La clave de nuestro cometido está en el botón de descargas que aparece en esa vista. Ahí está la URL que nos da acceso al archivo físico. ¿Cómo encontrar esa URL? Puedes usar el “Inspector de Elementos” sobre ese botón y te mostrará la URL final de descarga, en la estructura de la web. Mira el Screenshot de abajo :

[SCREENSHOT : Vista de la página de descargas, con la URL final visible en el inspector de elementos.]

Usando el código que se tiene previsto para crear en este tutorial, se rasparon todas las URLs que posee esa vista, dando como resultado lo siguiente :

[SCREENSHOT : Código de raspado corriendo en la línea de comandos. Se marcó la URL a la que debemos prestar atención.]

Hay muchas URLs, pero la URL que nos interesa es la que empieza con “https://download” y termina con el nombre del archivo.
Esa URL nos lleva al archivo físico alojado en los servidores de Mediafire.

1.2. HAY QUE TENER EN CUENTA AL FORMATO DE LAS URLS :

Hay algo que debemos tener siempre presente para saber diferenciar el formato de las URLs de Mediafire. En esta plataforma de nube tenemos principalmente dos tipos de URL: la URL compartida (estática) con la que compartes un archivo al mundo, y la URL final (dinámica) que es la que abre el explorador de archivos con la opción “Guardar como”. El formato para cada URL es el siguiente :

El punto es el siguiente. La URL final de descarga, a diferencia de la URL compartida es dinámica, no se mantiene en el tiempo. En cada descarga ejecutada, el número identificador o las dos cadenas únicas presentes en esa URL van cambiando, pero eso no será un impedimento para hacer lo que queremos hacer.


2. TIME TO WORK! VAMOS A CREAR EL EXTRACTOR DE LA URL DE DESCARGA

Damas y caballeros, vayan encendiendo sus tostadoras y no olviden aplicar refrigeración a sus CPUs que esto se va a poner de p*ta madre. En este punto empezaremos a picar código en Python asi que pongan absoluta atención.

Esta etapa será la parte donde crearemos el cerebro de lo que queremos lograr hacer al final del post: descargar archivos de Mediafire con el sistema de descarga de Assets. Aconsejo que todo lo que veas a partir de ahora hasta el final del post, lo hagas en un archivo vacío (haz un script RPY nuevo).

Para este post haremos uso de los siguientes módulos de Python :

  • Módulo “SSL” : Lo usaremos para interactuar con actividades que requieran certificados SSL en una conexión.
  • Módulo “RE” : Lo usaremos para buscar coincidencias mediante el uso de Expresiones Regulares (RegEx).
  • Módulo “Requests” : Lo usaremos para realizar las solicitudes web hacia las URLs compartidas de un archivo de Mediafire.
  • Módulo “Threading” : Lo usaremos para hacer Multithreading, ya que sin esto, el juego podría “bugearse” en tiempo de ejecución.

Ahora, como es tradición en este hilo, les presentaré el código y luego lo iremos desglosando para entender con calma su lógica (Advertencia de mucho texto xD) :

NOTA : Todo el código que verás a continuación, debe declararse dentro de un bloque init python ya que está escrito en Python.

[SCREENSHOTS : Estructura del extractor escrito en Python.]

El código que viste allá arriba, es el código que se encargará de ejecutar el raspado de la página de descarga de Mediafire en tu juego Ren’Py. Cuando termina con de raspar y filtrar los datos, devuelve la URL final de descarga del archivo objetivo dada por la URL compartida que se le pasa como argumento.
Ahora te explicaré cada parte de ese código para que puedas entender cómo funciona. Mira a continuación :

  • DownloadFetch(threading.Thread) [Clase] : Esta clase que hicimos será la responsable de todas las actividades de extracción. En la declaración de la clase se ha heredado a threading.Thread, que se encargará de ejecutar todas las actividades en un hilo aparte del que se ejecuta el juego.
  • __init__(self, ) [Función / Método] : Este método es el constructor de la clase DownloadFetch(). Se encarga de recibir los argumentos necesarios cuando se llama a la clase, y establece los atributos para trabajar. Para usar la clase, es necesario pasar dos argumentos a la llamada: shared_url que corresponde a la URL compartida del archivo de Mediafire, y file_extension que corresponde a la extensión del archivo que se pretende descargar.
  • fetch_finished(self) [Función / Método] : Este método informará si la recuperación de la URL ha terminado o no. Devolverá True si la extracción ha terminado, de lo contrario, retornará False.
  • end_url(self) [Función / Método] : Este método retornará una cadena con la URL final del archivo objetivo, en referencia de la URL compartida. Si aún no finaliza la extracción de la URL, este método retornará None.
  • runtime_exception(self) [Función / Método] : Este método retornará True si ocurrió una excepción durante la extracción. Pueden ocurrir excepciones si tu conexión a Internet es deficiente.
  • raise_now(self) [Función / Método] : Si ocurrió una excepción, cuando este método sea llamado lanzará la excepción en tiempo de ejecución, mostrando el error en pantalla y deteniendo al juego.
  • run(self) [Función / Método] : Este es el método donde ocurre la magia. Se encarga de ejecutar la solicitud web hacia la URL compartida y extraerá la URL final.
  • headers = {“User-Agent” : “…”} [Diccionario de encabezados] : Es un diccionario que contiene el encabezado que se enviará mediante la solicitud GET. En este caso se enviará el encabezado “User-Agent” con la identificación de un navegador web (en este caso Chrome en Windows 10), con el fin de “camuflar” la solicitud web como si la estuviera haciendo un navegador web real.
  • = ssl._create_unverified_context [Método] : Se usa para evitar la verificación de los certificados SSL de un host. Lo añadí porque hay veces en que la solicitud no se concreta porque no encuentra certificados SSL en la URL final de descarga.
  • requests.get(“…”, headers = “…”) [Método] : Se uso para ejecutar la solicitud web hacia la URL compartida del archivo alojado en Mediafire y recibe la respuesta. Se pasan dos argumentos en esta ocasión: la URL compartida a contactar y los headers de la solicitud.
  • re.findall(‘…’, r.text) [Método] : Se usa para buscar las coincidencias en “tal objeto”, en base a los patrones que nosotros decidamos establecer. El orden de los argumentos en el método findall, es la “string con el patrón de búsqueda”, y el objeto en donde se debe buscar esos patrones.
  • if i[0].endswith(“…”) [Condicional] : Esta condicional se ubica dentro de un bucle for que recorre todas las coincidencias encontradas, y se puede traducir literalmente como: “Si tal objeto en la tupla termina de esta forma, entonces es verdadero, de lo contrario, es falso”. La URL es el primer objeto de la tupla entregada por re.findall, por lo tanto su índice es el número cero. Entonces, si la URL encontrada termina con “tal extensión”, se guarda esa URL en la variable / atributo self.url_end hasta que el bucle deja de recorrer las coincidencias.
  • renpy.restart_interaction() [Método de Ren’Py] : En algunas ocasiones Ren’Py no actualiza las interacciones por sí mismo, y estos cambios no se ven reflejadas en las screens, entonces para que haya una interacción nueva, se ejecuta este método.

¡Excelente! Si has llegado hasta este punto y has seguido todo al pie de la letra, entonces ya tienes terminado el extractor de URLs para descargar archivos de Mediafire en Ren’Py.

A continuación viene una parte más liviana donde empezaremos a crear la UI / pantalla de carga mientras el juego obtiene la URL final de descarga. ¡Vamos allá!


3. ¡AHORA VAMOS A CREAR LA INTERFAZ DE CARGA!

Este ítem será más liviano, pues ya volveremos al ambiente natural de Ren’Py donde nos dedicaremos a usar el “Lenguaje de Screens” y Python en su forma sencilla. En materia del lenguaje de pantallas, nosotros haremos una screen que mostrará una pantalla de carga al usuario, y a su vez, ejecutará la clase que permite extraer la URL final. Luego de extraer la URL final, esta pantalla se ocultará para llamar a la screen que posee los elementos visuales para mostrar el progreso de la descarga.

Al igual que como lo hicimos en el interior, les mostraré el código para empezar a desglosarlo posteriormente :3

[SCREENSHOT : Código de la UI de la pantalla de carga.]

El código anterior se encarga de mostrar una ventana que señala que se está adquiriendo la URL final. ¡OJO OJITO OJETE! Esto no significa de que se mostrará cuando se esté descargando el recurso, sino que se mostrará ANTES de que inicie la descarga. En caso de que haya errores de conexión (tanto local como a nivel de servidor), saltará una alerta de error.

Ahora si, con esto dicho vamos a darle caña al desglose del código para comprender su funcionamiento. Sigue leyendo por favor, querido visitante :3

  • screen DownloadSetup() [Declaración] : Este elemento es la pantalla que se mostrará al jugador cuando se esté recuperando la URL final. Recibe 3 argumentos de tipo string (cadena) mediante 3 parámetros, donde el parámetro url recibirá la URL compartida del archivo alojado en Mediafire, el parámetro extension recibirá la extensión del archivo que se pretende descargar, y el parámetro download_dir recibirá la ruta física donde se va a descargar el archivo.
  • default dl = DownloadFetch(…) [Variable por defecto] : La declaración de la variable dl servirá para llamar a la clase que recuperará la URL final (la que hicimos en el item anterior). Al llamar a la clase DownloadFetch() pasaremos 2 argumentos: la URL compartida del archivo y la extensión del archivo objetivo. Como ya hemos asignado eso en los parámetros de la screen, entonces los pasaremos directamente a la clase, en el orden url, extension.
  • frame [Propiedades de pantallas] : Este es un recuadro que se dibujará en la pantalla, y este contendrá el mensaje que indicará que se está recuperando la URL. Sus dimensiones están dadas con las propiedades de estilo xsize e ysize, y su ubicación en pantalla está dado por xpos e ypos (aunque puedes usar xalign e yalign también).
  • showif dl.fetch_finished() [Condicional] : En esta condicional se llama al método fetch_finished() de la clase DownloadFetch(). Si la condición se cumple (el método retorna True), quiere decir que la recuperación ha finalizado, de lo contrario (el método retorna False), quiere decir que la recuperación aún se está ejecutando.
  • showif dl.runtime_exception() [Condicional] : En esta condicional se llama al método runtime_exception() de la clase DownloadFetch(). Si la condición se cumple (el método retorna True), quiere decir que ocurrió un error y se mostrará el mensaje “¡Wooops! Hubo un error durante la conexión :(“, de lo contrario (el método retorna False), quiere decir que la URL fue recuperada correctamente y que se puede proceder a descargar con la URL extraida.
  • Show(“download_screen”, url = dl.end_url(), out = download_dir) [Acción] : La clase Show() de Ren’Py llamará a la pantalla que contiene el sistema de descargas que hicimos anteriormente. Esta pantalla, al ser llamada se le pasará argumentos como la URL extraida (devuelta por la llamada al método end_url()) y también la ruta donde se descargará el archivo (pasado a través del parámetro download_dir). [¿No entendiste por qué se llama a esta pantalla? Ve al Post #18!]

¡Waaaaaah! Aquí es el punto placentero en donde dices “¡ya terminé!”, pues el código ya fue escrito y solo queda probarlo, así que vamos por el último y mejor item de este post. Vamos a ver qué pasa xD.


4. ¡VAMOS A PROBAR EL SISTEMA DE DESCARGAS CON ARCHIVOS DE MEDIAFIRE!

Este es el punto de placer máximo donde veremos que todo el desmadre que armamos allá arriba, realmente funciona al 100%. Previo a esto, debemos hacer algunas modificaciones pequeñas al script original del sistema de descargas (el del Post #18), para que esto pueda andar a toda máquina.

Consigue el script que se hizo en el Post #18 directamente en mi repositorio de GitHub (Lee el README para ver las notas adicionales del script) :

Si vas al final del script, encontrarás un ejemplo de cómo usar ese sistema de descargas, pero con este extractor de URL, debemos modificar una parte de ese fragmento de código.

Anteriormente, el fragmento de ejemplo del script se veía así :

[SCREENSHOT : Vista actual del script “DM_Post_18_02.rpy” (sin modificar).]

Con los cambios que se deben hacer, debería quedar algo así :

[SCREENSHOT : Modificaciones que debe recibir el script “DM_Post_18_02.rpy”.]

Los recuadros y líneas rojas señalan exactamente los lugares del código donde debes modificarlos.

En la parte de arriba, se agregó una nueva variable llamada file_extension, el cual debe tener una cadena con la extensión del archivo que se pretende descargar.

NOTA : En el Post #18 hicimos una prueba con una pista llamada “Snow_Halation.mp3”. En esta oportunidad ocuparemos la misma pista, pero la subí a Mediafire para probar el funcionamiento del código de este post.

En la variable link debes colocar la URL compartida del archivo alojado en Mediafire. El código se encarga de obtener la URL final, que como se dijo en el primer item, es una URL dinámica.

Si ya has modificado todo tal como aparece en el último Screenshot, entonces ya estamos casi listos para hacer las pruebas de funcionamiento. El script donde hemos montado este extractor de URL puede quedar en la misma carpeta que el script del sistema de descargas que has modificado. Se ejecutarán sin problemas.

Ahora si. Nos vamos a probar si el sistema de descargas logra obtener el archivo alojado en Mediafire.


  • Test #1 : Simular una eventual desconexión a Internet

Para comprobar correctamente de que el código puede manejar excepciones, empecemos probando de inmediato un evento donde tenemos desconectado la red WiFi/3G/4G/5G. Para esto, abrimos el juego y vamos donde el menú electivo a presionar “Descargar archivo de Audio” :


Justo de que hayamos presionado en “Descargar archivo de Audio”, debería aparecer esta pantalla de inmediato :

Si apareció esa pantalla sin que aparezca una excepción, quiere decir que la excepción por errores en la conexión/solicitud se está manejando correctamente.


  • Test #2 : Probar descarga con URL de Mediafire y con conexión estable a Internet.

Este test es el que más placer puede dar si se ejecuta, pues probaremos si de verdad la descarga se logra ejecutar.

En este punto haremos el mismo procedimiento de arriba, solo que a diferencia del Test #1, ahora debería aparecer esta pantalla :

Si aparece esa pantalla, quiere decir que está recibiendo la información de la URL compartida de Mediafire, y que está buscando a la URL final de descarga.


Luego de un rato, debería aparecer el progreso de la descarga :


Y cuando la descarga haya finalizado aparecerá esto :

¡Lo hemos logrado! El archivo es recuperado desde el servidor de Mediafire sin ningún tipo de problema. 

Ahora, si eres desconfiado(a) y quieres ver si el archivo de verdad se descargó, pues entra a la carpeta /game de tu proyecto y verás al archivo ahí. Aquí por ejemplo abrí la carpeta /game del proyecto en el que hago los tutoriales y ahí está la pista, correctamente descargada y reproduciéndose en Groove :

[SCREENSHOT : Pista descargada y reproduciéndose.]

Por supuesto, este descargador de Assets que hemos creado no se restringe solo a descargar música. Puede descargar el archivo que quieras, código compilado RPYC a tu juego, imágenes, audio, incluso empaquetados RPA, aunque no he probado si WGET soporta descarga de archivos mayores a 500 MB. Si hacen el experimento, podrían informarme xD

Encuentra el código del extractor de URLs de Mediafire, en la carpeta de este post que está en mi repositorio de GitHub! Te dejo la URL acá abajo (Lee el README por si tienes dudas de cómo usarlo) :


Venga esa bandera de meta que aquí la clavamos para concluir el post de hoy. Recuerda que si tienes dudas, puedes plantearlas en los comentarios o bien, puedes comunicarte conmigo en Telegram para un diálogo más calmado :3

Mira el código de los posts anteriores en mi repositorio de GitHub!

Eres nuevo? Descarga el motor Ren’Py para que comiences a hacer tu propia Visual Novel!

  • Visita la web oficial de Ren’Py Presionando Aquí!
  • Link para copiar : https://renpy.org/

No has entendido algo sobre este post u otros de este mismo hilo? No dudes en comunicarte conmigo! Contactame mediante los comentarios o en mi Telegram personal!


Mis queridos visitantes, para el próximo post nos vamos a poner aún más mamadísimos porque ya tengo la idea hecha en la mente de qué va a tratar .

En el próximo post les enseñaré a conectar y manipular una Base de Datos MySQL de forma remota en un juego Ren’Py. Esto servirá para quienes quieran subir datos del juego a algún servidor, o para hacer un ranking de jugadores. Es más, prácticamente es el mismo modelo que emplearé para los Eventos Online de mi actual proyecto :3

Nos vemos en la próxima entrega señores. No olviden respirar y tomar agua xD.


Navega entre los posts de este hilo!

<< Ir al Post #21 | ¡El Post #23 estará disponible próximamente!

<< Eres nuevo? Click aquí para ir al Post #1 >>


CharlieFuu69 Creations! – ElectroBasicsYT

  • Tutorial
  • Programación | Programas, aplicaciones
2 Comentarios
  1. MRX_
    MRX_ 2 meses

    Intereeesante tema. Muy claro.

    1+

Contesta

CONTACTANOS

Esta es su red social de tecnología para compartir tus ideas y proyectos .Puedes enviarnos un correo si tienes dudas.Nos vemos

Enviando

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account