Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
jdvrif — Herramienta de esteganografía para imágenes JPG | Kitploit
Herramientas/GitHubGitHub/cleasbycode/jdvrif
Herramientas de Cifrado/DescifradoExfiltración de DatosAnálisis ForenseEsteganografíaCriptografíaPrivacidad
GitHubcleasbycode/jdvrif

jdvrif

Herramienta de esteganografía para imágenes JPG

Ver Repositorio
69135hace 5 díasRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
# jdvrif

***jdvrif*** (*JPG Data Vehicle*) es una herramienta de línea de comandos de esteganografía rápida y fácil de usar para ocultar y extraer cualquier tipo de archivo mediante una imagen **JPG**. ***Solo Linux***.

Tu archivo de datos se comprime con ***libdeflate/zlib***, luego se cifra con ***XChaCha20-Poly1305*** (secretstream de ***libsodium***) bajo una clave derivada mediante ***Argon2id*** a partir de un ***PIN de recuperación*** generado aleatoriamente, y finalmente se incrusta en la imagen de portada. El PIN se muestra una sola vez, al final de ***conceal***, y nunca se almacena en ningún lugar: sin él, el archivo oculto no puede recuperarse.

Usando el ***modo de ocultación predeterminado***, puedes ocultar cualquier tipo de archivo, con la imagen final limitada a ***2GiB***. Los demás modos de ocultación para plataformas y los sitios de redes sociales compatibles (*enumerados a continuación*) tienen sus propios límites de tamaño ***mucho más pequeños*** y otros requisitos.

Existe una [***edición Web***](https://cleasbycode.co.uk/jdvrif/app/) de ***jdvrif***, que puedes usar de inmediato como alternativa conveniente a descargar y compilar el código fuente de la CLI. Las cargas de archivos web están limitadas a **20MiB**.

También está disponible un port experimental a ***Rust*** [***jdvrif-rs***](https://github.com/CleasbyCode/jdvrif-rs) para quienes estén interesados en ese lenguaje. Es compatible en formato: cualquiera de las dos compilaciones puede recuperar las imágenes de la otra.

***jdvrif*** deriva en parte de la ***[técnica implementada](https://www.vice.com/en/article/bj4wxm/tiny-picture-twitter-complete-works-of-shakespeare-steganography)*** por el investigador de seguridad ***[David Buchanan](https://www.da.vidbuchanan.co.uk/).***

![Demo Image](https://raw.githubusercontent.com/CleasbyCode/jdvrif/main/demo_image/jrif_043b7c551.jpg)  
*Imagen de demostración: **"A place of concealment"** / ***PIN: 7912872750612437051****

## Cómo oculta datos jdvrif

A diferencia del método común de esteganografía [***LSB***](https://ctf101.org/forensics/what-is-stegonagraphy/) (*Least Significant Bit*) para ocultar datos dentro de los píxeles de una imagen de portada, ***jdvrif*** oculta principalmente los datos dentro de los ***segmentos de aplicación*** de una imagen ***JPG*** (ICC, EXIF, XMP, etc.).

| Modo de ocultación | Dónde van los datos | Compartir la imagen de salida en |
| --- | --- | --- |
| *(sin opción)* | Segmentos de perfil APP2/ICC | X-Twitter, Tumblr, Mastodon, Pixelfed, PostImage, ImgBB, ImgPile, Flickr |
| ***-b*** | Segmentos EXIF / Photoshop / XMP enmarcados | ***Bluesky*** únicamente |
| ***-r*** | Coeficientes DCT de JPEG (***QIM***) | ***Reddit*** únicamente |
| ***-x*** | Coeficientes DCT de JPEG (***J-UNIWARD/STC***) | ***X-Twitter*** únicamente |

Las dos excepciones de plataforma al método de almacenamiento en segmentos predeterminado son ***Reddit*** y ***X-Twitter***. Ambas tienen su propio modo de ocultación, y ninguno de esos modos utiliza segmentos de metadatos en absoluto: ***-r*** y ***-x*** transportan la carga útil en los coeficientes DCT de la imagen ***JPG*** en su lugar.  

***Reddit*** recodifica las imágenes subidas y descarta los segmentos de metadatos en los que se basa el modo predeterminado, por lo que ***-r*** es el único modo que funciona allí. ***X-Twitter*** sí conserva un único segmento ICC pequeño, por lo que el modo predeterminado sigue funcionando en esa plataforma, pero solo para una carga útil muy pequeña.

Para el modo de ocultación de ***Reddit*** (***-r***), usamos el [***método de esteganografía QIM***](https://www.google.com/search?q=QIM+steganography+method&sourceid=chrome&ie=UTF-8&source=chrome.ctxt) (*Modulación por Índice de Cuantización en el dominio DCT de JPEG*), ya que este es el único método de almacenamiento que funciona actualmente para ***Reddit***. La portada se transcodifica a baseline Q75 4:2:0 y la carga útil se transporta en sus bloques DCT de luminancia.

Para maximizar la capacidad de almacenamiento para la plataforma ***Reddit***, usa una imagen de portada con dimensiones grandes, **2048x2048**, **4096x4096**, **8192x8192 (máx.)**, etc.  

La calidad de la imagen de portada no es importante para este método y debe mantenerse básica para las dimensiones más grandes, para ayudar a minimizar el tamaño del archivo de la imagen de portada.

Aunque la plataforma ***X-Twitter*** puede usar el método predeterminado proporcionado por ***jdvrif***, donde los datos se ocultan dentro de segmentos APP2/ICC, ***X-Twitter*** limita esto a un único segmento ICC con un tamaño máximo de solo **~10KiB**.

Para transportar más de esos **~10KiB**, utilice el modo de ocultación de la plataforma ***X-Twitter*** (***-x***). Abandona por completo los segmentos de metadatos —no se escribe nada en un perfil ICC— y en su lugar utiliza el [***método de esteganografía adaptativo J-UNIWARD con Syndrome-Trellis Coding (STC)***](https://www.google.com/search?q=adaptive+J-UNIWARD+steganography+method+with+Syndrome-Trellis+Coding+(STC)). La imagen portadora se transcodifica a 4:2:0 progresivo con su calidad derivada del origen (limitada a **Q97**).

Para maximizar la capacidad de almacenamiento para la plataforma ***X-Twitter***, utilice una imagen portadora de alta calidad/con detalle y con dimensiones grandes, **1024x1024**, **2048x2048**, **4096x4096 (máx.)**, etc.

Los portadores ***-r*** y ***-x*** cifran sus datos y vinculan su ubicación a su PIN de recuperación mediante ***Argon2id***, pero la inserción sigue alterando las estadísticas DCT de la imagen, por lo que un estegoanálisis dedicado podría revelar que una imagen contiene datos ocultos.

Las imágenes ***-r*** y ***-x*** creadas con ***jdvrif v9.0*** siguen siendo recuperables, pero ***v9.0*** no puede recuperar imágenes ***-r*** o ***-x*** creadas con ***v9.1***.

Ambos modos DCT transportan mucha menos información que el modo predeterminado, así que utilice ***capsize*** para medir una imagen portadora antes de elegir una carga útil (consulte [Comprobación de la capacidad](#checking-capacity-with-capsize)).

## Requisitos y compilación (Linux)

La compilación requiere **CMake 3.20 o superior**, `flock` de **util-linux**, y **Ninja** (preferido) o **Make**. El compilador debe ser **GCC 14 o superior**, o **Clang 18 o superior** junto con una biblioteca estándar de C++23 que implemente características como `std::format` y `std::print`. Las bibliotecas nativas necesarias son **libsodium**, **libjpeg-turbo** (*tanto las API `turbojpeg` como `libjpeg`*), **zlib** y **libdeflate**. **OpenMP** es opcional: cuando está presente, paraleliza la pasada de coste de J-UNIWARD de ***-x***.

```console
$ sudo apt update
$ sudo apt install g++ cmake ninja-build util-linux libsodium-dev libturbojpeg0-dev libjpeg-dev zlib1g-dev libdeflate-dev

$ g++ --version   # confirm the reported version is 14 or newer

$ chmod +x compile_jdvrif.sh
$ ./compile_jdvrif.sh

$ sudo cp jdvrif /usr/bin
```

Si tu distribución incluye GCC 14 como paquete versionado, instala `g++-14` y compila con `CXX=g++-14 ./compile_jdvrif.sh`.

El wrapper mantiene los archivos objeto con seguimiento de dependencias en `src/build/`, de modo que las invocaciones posteriores solo recompilan lo que cambió, y reemplaza el binario `jdvrif` publicado únicamente tras una compilación completa y exitosa. Establece `JDVRIF_JOBS=<count>` para cambiar el límite de paralelismo (por defecto: número de CPU, con un máximo de 8), `JDVRIF_BUILD_DIR=<path>` para usar una caché de compilación separada, o `BUILD_MODE=sanitize` para una compilación con ASan/UBSan.

## Uso

```console
$ jdvrif

Usage: jdvrif conceal [-b|-r|-x] <cover_image> <secret_file>
       jdvrif recover <cover_image>
       jdvrif capsize [-r|-x] <cover_image>
       jdvrif --info
```

Ejecuta `jdvrif --info` para acceder a la guía completa integrada sobre modos, opciones de plataforma y límites de tamaño.

```console
$ jdvrif conceal your_cover_image.jpg your_secret_file.doc

Platform compatibility for output image:-

 ✓ X-Twitter
 ✓ Tumblr
 ✓ Mastodon
 ✓ Pixelfed
 ✓ PostImage
 ✓ ImgBB
 ✓ ImgPile
 ✓ Flickr

Recovery PIN: [***2166776980318349924***]

Important: Keep your PIN safe, so that you can extract the hidden file.


Saved "file-embedded" JPG image: jrif_4e87c566c.jpg (143029 bytes).

Complete!

$ jdvrif recover jrif_4e87c566c.jpg

PIN: *******************

Extracted hidden file: your_secret_file.doc (6165 bytes).

Complete! Please check your file.

```

argumentos de ***mode*** de jdvrif:

  ***conceal*** - Comprime, cifra e incrusta tu archivo de datos secretos dentro de una imagen de portada ***JPG***.  
  ***recover*** - Descifra, descomprime y extrae el archivo de datos oculto de una imagen de portada ***JPG*** (*se requiere PIN de recuperación*).  
  ***capsize*** - Informa de la capacidad portadora de una imagen de portada para el modo ***-r*** o ***-x***. No se guarda ninguna imagen.

Requisitos para la imagen de portada:

● Solo JPEG, de al menos **400x400** píxeles, y en escala de grises o color YCbCr — las imágenes CMYK/YCCK deben convertirse primero a RGB.

● Las dimensiones máximas predeterminadas y de ***-b*** son **4096x4096px**; ***-r*** usa **8192x8192px**, mientras que ***-x*** también está limitado a **4096x4096px**.

● El modo predeterminado (*sin opción*) también rechaza las imágenes de portada cuya calidad JPEG estimada sea superior a **Q97**; vuelve a guardar la imagen con una calidad inferior si se rechaza.

Requisitos para el archivo de datos secretos:

● El nombre de archivo incrustado no debe superar los **20 bytes**, no debe comenzar por `.` o `-` ni terminar con un espacio o `.`, y debe ser UTF-8 válido sin caracteres de control ni de formato bidireccional ni ninguno de `/ \ : * ? " < > |`. El nombre se almacena en la imagen y se restaura en ***recover***.

● Tu archivo de datos se comprime antes del cifrado, excepto para los tipos de archivo ya comprimidos reconocidos (`.zip`, `.7z`, `.mp4`, `.jpg`, `.png`, etc.). En los modos predeterminado y ***-b*** esos tipos omiten la compresión solo cuando son mayores de **10MiB**; en los modos ***-r*** y ***-x*** siempre la omiten. Para cualquier otra cosa destinada a un límite de plataforma pequeño, considera comprimirla tú mismo primero (*zip, rar, 7z, etc.*) para que conozcas su tamaño almacenado exacto.

## Plataformas compatibles

\******************   
Nota: ***Bluesky*** ahora guarda las imágenes como ***WEBP*** de forma predeterminada. 

Para guardar una imagen como ***JPG***, de modo que aún puedas recuperar los datos ocultos con ***jdvrif***:-  

Primero haz clic en la imagen de la publicación para abrirla, luego haz clic derecho sobre la imagen. En el menú, selecciona ***Abrir imagen en una pestaña nueva***.  

Selecciona la pestaña nueva y, en la barra de direcciones, ve al final de la dirección y añade ***@jpg***, luego pulsa Intro.  
Haz clic derecho en la imagen y en el menú selecciona ***Guardar imagen...***  

Tu imagen ahora debería descargarse como ***JPG***, que ya funcionará con ***jdvrif***.
         
Si quieres una herramienta para ocultar datos usando imágenes ***WEBP*** para publicar en ***Bluesky***, puedes usar mi herramienta CLI de esteganografía para ***WEBP*** ***[wbpdv](https://github.com/CleasbyCode/wbpdv)***  
\******************

*Límite de tamaño de publicación medido por el tamaño ***combinado*** de la ***imagen de portada*** + ***archivo de datos comprimido:****  

● ***Flickr*** (**200MiB**), ***ImgPile*** (**100MiB**), ***ImgBB*** (**32MiB**), ***PostImage*** (**32MiB**), ***Pixelfed*** (**15MiB**).

*Límite de tamaño medido ***solo*** por el ***tamaño del archivo de datos comprimido:****  

● ***Mastodon*** (**~6MiB**), ***Tumblr*** (**~64KiB**), ***X-Twitter*** (**~10KiB / método predeterminado**).  

Por ejemplo, con ***Mastodon***, si tu imagen de portada es de **1MiB** aún puedes incrustar un archivo de datos de hasta el límite de tamaño de **~6MiB**.

**Otros: plataformas con su propio modo de ocultación:**

● ***Bluesky*** (***opción -b***). El ***JPG*** final con "*archivo incrustado*" no debe superar los **2.000.000 bytes (~1,9MiB)**, por lo que la imagen de portada y el archivo de datos comprimido comparten un mismo presupuesto. El archivo de datos comprimido por sí solo no debe superar los **~171KiB**. Una imagen de portada que ya ocupe 2.000.000 bytes no deja ningún espacio, así que mantén la portada por debajo del límite al menos en el tamaño de tu archivo de datos comprimido. Se requiere el script "***create_bsky_post.py***" para publicar estas imágenes en ***Bluesky***. *Más información sobre este script más abajo en la página.*

● ***Reddit*** (***opción -r***). La imagen de portada y el archivo de datos no deben superar cada uno los **20MiB**, pero la capacidad portadora real de la imagen de portada es ***mucho menor*** y depende de sus dimensiones. Usa `jdvrif capsize -r` para medirla.

● ***X-Twitter*** (***opción -x***). La imagen de portada y el archivo de datos no deben superar cada uno los **5MiB**, y la portada no debe exceder los **4096x4096** píxeles. La capacidad real del portador es ***mucho menor*** y depende de la calidad de la imagen y de los tamaños de dimensión. Use `jdvrif capsize -x` para medirla.

En los modos predeterminado y ***-b***, la imagen de portada también se optimiza sin pérdida antes de su uso y no debe superar los **4MiB** después de ese paso.

Para plataformas como ***X-Twitter***, ***Reddit*** y ***Tumblr***, que tienen límites pequeños de tamaño de datos, es posible que desee centrarse en datos que se compriman bien, como archivos de texto, etc.

https://github.com/user-attachments/assets/af330d09-f65d-4f75-8290-883078be34b3

https://github.com/user-attachments/assets/fc454d42-0240-4864-b44b-ce5ef7cfd94c

## Comprobar la capacidad con capsize

***capsize*** prepara la imagen de portada exactamente como lo haría ***conceal***, y luego informa cuánta carga útil cifrada puede transportar. No se escribe nada en el disco. Use ***-r*** para el portador de ***Reddit*** y ***-x*** para el portador de ***X-Twitter*** (***-x*** es el predeterminado si no se proporciona ninguna opción).

```console
$ jdvrif capsize -r basic_img_large_dims.jpg

Reddit capacity check for conceal -r mode only.

Cover Image: 384KiB, 8192x8192, Baseline YCbCr 4:2:0, Standard Q75 quantization (C3).

Theoretical C3 capacity limit for this cover image:                    436906 bytes (~426KiB).
Conservative maximum compressed capacity with a 20-character filename: 436792 bytes (~426KiB).
Recommended  maximum compressed capacity with a 20-character filename: 435768 bytes (~425KiB).
```

La cifra reportada es la capacidad total del ***envelope*** cifrado, no un límite bruto del archivo secreto: el nombre de archivo, los metadatos de cifrado y recuperación consumen de 95 a 114 bytes para una carga útil de un solo frame, y las cargas útiles más grandes añaden sobrecarga de framing. No apuntes al límite teórico: cuando la capacidad lo permita, mantén la carga útil comprimida al menos **1KiB** por debajo del máximo conservador. La comprobación de tamaño realizada por ***conceal*** es la autoritativa.

## Opciones de plataforma del modo Conceal

Para crear imágenes ***JPG*** compatibles con "*data-concealed*" para publicarlas en la plataforma ***Reddit***, debes usar la opción ***-r*** con el modo ***conceal***.
  ```console
  $ jdvrif conceal -r my_image.jpg hidden.doc
```

  Estas imágenes solo son compatibles para publicarlas en ***Reddit***. Tu archivo de datos incrustado se perderá si se publica en una plataforma diferente.  
  
  Al guardar/descargar una imagen de ***Reddit***, asegúrate de hacer clic en la imagen dentro de la publicación para expandirla completamente antes de guardarla.  

https://github.com/user-attachments/assets/ead3c34c-dd9a-4018-9ea3-0746fbdfdb8b

Para crear imágenes ***JPG*** compatibles con "*datos ocultos*" para publicarlas en la plataforma ***X-Twitter*** usando el método de esteganografía J-UNIWARD, debes usar la opción ***-x*** con el modo ***conceal***.
  ```console
  $ jdvrif conceal -x my_image.jpg hidden.doc
```

  Estas imágenes solo son compatibles para publicarlas en ***X-Twitter***. Tu archivo de datos incrustado se perderá si se publica en una plataforma diferente.  
  
  Al guardar/descargar una imagen de ***X-Twitter***, asegúrate de hacer clic en la imagen dentro de la publicación para expandirla completamente antes de guardarla.  

Para crear imágenes ***JPG*** compatibles con "*datos incrustados en el archivo*" para publicarlas en la plataforma ***Bluesky***, debes usar la opción ***-b*** con el modo ***conceal***.
  ```console
  $ jdvrif conceal -b my_image.jpg hidden.doc
```

  Estas imágenes solo son compatibles para publicarlas en ***Bluesky***. Tu archivo de datos incrustado se eliminará si se publica en una plataforma diferente.
 
  También debes usar el script de Python [create_bsky_post.py](https://github.com/CleasbyCode/jdvrif/blob/main/src/bsky/create_bsky_post.py) (que se encuentra en la carpeta ***src/bsky*** del repositorio) para publicar la imagen en ***Bluesky***.
  No funcionará si publicas imágenes en ***Bluesky*** a través del sitio web del navegador o de la aplicación móvil.  

  Para usar el script, deberás crear una [***contraseña de aplicación***](https://bsky.app/settings/app-passwords) desde tu cuenta de ***Bluesky***. Pasa tus credenciales a través del entorno en lugar de la línea de comandos, donde serían visibles para otros usuarios locales mediante herramientas como `ps`:

  ```console
  $ pip install -r bsky/requirements.txt

  $ export ATP_AUTH_HANDLE='you.bsky.social'
  $ read -rsp 'Bluesky app password: ' ATP_AUTH_PASSWORD && export ATP_AUTH_PASSWORD

  $ python3 bsky/create_bsky_post.py \
      --image jrif_4e87c566c.jpg \
      --alt-text "alt-text here [optional]" \
      "standard post text here [required]"

  $ unset ATP_AUTH_PASSWORD
```

  Consulta [src/bsky/README.md](https://github.com/CleasbyCode/jdvrif/blob/main/src/bsky/README.md) para ver el conjunto completo de opciones (*múltiples imágenes, respuestas, publicaciones de cita, tarjetas de enlace*) y para saber contra qué protege la bifurcación reforzada del script.

https://github.com/user-attachments/assets/1daef508-d304-491f-bfe2-2cdbb5d62081

## Pruebas

Cada uno de los scripts de prueba en `src/tests` recibe el binario que se va a ejercitar:

```console
$ bash tests/run_golden_tests.sh --bin ./jdvrif        # recover pre-built images with known PINs
$ bash tests/run_roundtrip_tests.sh --bin ./jdvrif     # fresh conceal/recover round-trips
$ bash tests/run_security_smoke.sh --bin ./jdvrif      # negative-path and boundary checks
$ bash tests/run_reddit_tests.sh --bin ./jdvrif        # -r QIM carrier
$ bash tests/run_twitter_tests.sh --bin ./jdvrif       # -x J-UNIWARD/STC carrier
$ bash tests/run_io_security_tests.sh --bin ./jdvrif   # input-size bounds, PIN signal/job-control handling
$ bash tests/run_jpeg_safety_tests.sh                  # JPEG parser/decoder safety (builds its own test binary)
$ bash tests/run_bsky_tests.sh                         # Bluesky posting helper
```

## Software y recursos de terceros

  ### Aplicaciones principales

  - [libsodium](https://github.com/jedisct1/libsodium) — generación aleatoria criptográfica, derivación de claves Argon2id y flujos secretos XChaCha20-Poly1305. Enlazada dinámicamente como biblioteca del sistema.
      
      Licencia: [ISC License](https://github.com/jedisct1/libsodium/blob/master/LICENSE)
    
      Copyright (c) 2013–2026 Frank Denis.
    
 - [libjpeg-turbo](https://github.com/libjpeg-turbo/libjpeg-turbo) — procesamiento de JPEG y transformación sin pérdida. Enlazada dinámicamente como biblioteca del sistema.

      Este software se basa en parte en el trabajo del Independent JPEG Group.

      Licencias: [Independent JPEG Group License, Modified BSD 3-Clause License,
      and zlib License](https://github.com/libjpeg-turbo/libjpeg-turbo/blob/2.1.5/LICENSE.md).

      Copyright © 1991–2020 Thomas G. Lane y Guido Vollbeding.
   
      Copyright © 2009–2023 D. R. Commander. Todos los derechos reservados.
   
      Copyright © 2015 Viktor Szathmáry. Todos los derechos reservados.
   
  - [zlib](https://github.com/madler/zlib) — Compresión y descompresión zlib en streaming. Enlazada dinámicamente como biblioteca del sistema.

    Licencia: [zlib License](https://github.com/madler/zlib/blob/develop/LICENSE)
    
    Copyright (C) 1995–2026 Jean-loup Gailly y Mark Adler.

  - [libdeflate](https://github.com/ebiggers/libdeflate) — Compresión rápida de búfer completo en formato zlib. Enlazada dinámicamente como biblioteca del sistema.

    Licencia: [MIT](https://github.com/ebiggers/libdeflate/blob/master/COPYING)
    
    Copyright 2016 Eric Biggers.
    
    Copyright 2024 Google LLC.

  ### Código y recursos incorporados

  - [Compact ICC Profiles](https://github.com/saucecontrol/Compact-ICC-Profiles) — perfil ICC compatible con Adobe
  incrustado.

    Licencia: [CC0 1.0 Universal](https://github.com/saucecontrol/Compact-ICC-Profiles/blob/master/license)

  ### Asistente opcional para publicar en Bluesky

  - Bryan Newbold / ATProto Hacker Cookbook — create_bsky_post.py — Base para el asistente [bifurcado](https://gist.github.com/CleasbyCode/1eb678ca1fa1975b1c1e20aeec33637e) de publicación en Bluesky (src/bsky/create_bsky_post.py). 
    Como referencia, véase la [copia del Cookbook](https://github.com/bluesky-social/cookbook/blob/main/python-bsky-post/create_bsky_post.py)

    Licencia: [CC0 1.0 Universal](https://github.com/bluesky-social/cookbook/blob/main/LICENSE-CC0).

  - Requests — Solicitudes HTTP y a la API de Bluesky.

    Licencia: [Apache 2.0](https://github.com/psf/requests/blob/main/LICENSE) / [NOTICE](https://github.com/psf/requests/blob/main/NOTICE)
    
    Copyright 2019 Kenneth Reitz.

  - Beautiful Soup 4 — análisis de metadatos HTML y Open Graph.

    Licencia: [MIT](https://pypi.org/project/beautifulsoup4/)
    
    Copyright (c) Leonard Richardson.

  - Pillow — Validación de imágenes, dimensiones y manejo de la relación de aspecto.

    Licencia: [MIT-CMU](https://github.com/python-pillow/Pillow/blob/main/LICENSE)
    
    Copyright de PIL © 1997–2011 Secret Labs AB y © 1995–2011 Fredrik Lundh y colaboradores.
    
    Copyright de Pillow © 2010 Jeffrey “Alex” Clark y colaboradores.
    
##
Descargar herramienta