Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
jdvrif — Ferramenta de Esteganografia para Imagens JPG | Kitploit
Ferramentas/GitHubGitHub/cleasbycode/jdvrif
Ferramentas de Criptografia/DescriptografiaExfiltração de DadosAnálise ForenseEsteganografiaCriptografiaPrivacidade
GitHubcleasbycode/jdvrif

jdvrif

Ferramenta de Esteganografia para Imagens JPG

Ver Repositório
69136há 5 diasRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
# jdvrif

***jdvrif*** (*JPG Data Vehicle*) é uma ferramenta de linha de comando de esteganografia rápida e fácil de usar para ocultar e extrair qualquer tipo de ficheiro através de uma imagem **JPG**. ***Apenas Linux***.

O seu ficheiro de dados é comprimido com ***libdeflate/zlib***, depois encriptado com ***XChaCha20-Poly1305*** (secretstream da ***libsodium***) sob uma chave derivada por ***Argon2id*** a partir de um ***PIN de recuperação*** gerado aleatoriamente, e finalmente incorporado na imagem de capa. O PIN é apresentado uma única vez, no final de ***conceal***, e nunca é armazenado em lado nenhum: sem ele, o ficheiro oculto não pode ser recuperado.

Utilizando o ***modo de ocultação predefinido***, pode ocultar qualquer tipo de ficheiro, com a imagem final limitada a ***2GiB***. Os outros modos de ocultação por plataforma e os sites de redes sociais compatíveis (*listados abaixo*) têm os seus próprios limites de tamanho ***muito mais pequenos*** e outros requisitos.

Existe uma [***edição Web***](https://cleasbycode.co.uk/jdvrif/app/) do ***jdvrif***, que pode utilizar imediatamente, como uma alternativa conveniente ao download e compilação do código-fonte da CLI. Os uploads de ficheiros pela Web estão limitados a **20MiB**.

Está também disponível um port experimental em ***Rust*** [***jdvrif-rs***](https://github.com/CleasbyCode/jdvrif-rs) para quem tenha interesse nessa linguagem. É compatível ao nível do formato: qualquer das compilações consegue recuperar as imagens da outra.

O ***jdvrif*** deriva em parte da ***[técnica implementada](https://www.vice.com/en/article/bj4wxm/tiny-picture-twitter-complete-works-of-shakespeare-steganography)*** pelo investigador de segurança ***[David Buchanan](https://www.da.vidbuchanan.co.uk/).***

![Demo Image](https://raw.githubusercontent.com/CleasbyCode/jdvrif/main/demo_image/jrif_043b7c551.jpg)  
*Imagem de Demonstração: **"A place of concealment"** / ***PIN: 7912872750612437051****

## Como o jdvrif oculta dados

Ao contrário do método comum de esteganografia [***LSB***](https://ctf101.org/forensics/what-is-stegonagraphy/) (*Least Significant Bit*) de ocultar dados nos píxeis de uma imagem de capa, o ***jdvrif*** esconde sobretudo os dados dentro de ***segmentos de aplicação*** de uma imagem ***JPG*** (ICC, EXIF, XMP, etc).

| Modo de ocultação | Onde os dados são colocados | Partilhe a imagem de saída em |
| --- | --- | --- |
| *(sem opção)* | Segmentos de perfil APP2/ICC | X-Twitter, Tumblr, Mastodon, Pixelfed, PostImage, ImgBB, ImgPile, Flickr |
| ***-b*** | Segmentos EXIF / Photoshop / XMP emoldurados | Apenas ***Bluesky*** |
| ***-r*** | Coeficientes DCT JPEG (***QIM***) | Apenas ***Reddit*** |
| ***-x*** | Coeficientes DCT JPEG (***J-UNIWARD/STC***) | Apenas ***X-Twitter*** |

As duas exceções de plataforma ao método predefinido de armazenamento em segmentos são o ***Reddit*** e o ***X-Twitter***. Ambos têm o seu próprio modo de ocultação, e nenhum desses modos utiliza segmentos de metadados: ***-r*** e ***-x*** transportam a carga útil nos coeficientes DCT da imagem ***JPG***.

O ***Reddit*** recodifica as imagens carregadas e descarta os segmentos de metadados dos quais o modo predefinido depende, pelo que ***-r*** é o único modo que funciona nessa plataforma. O ***X-Twitter*** preserva um único segmento ICC pequeno, pelo que o modo predefinido ainda funciona nessa plataforma, mas apenas para uma carga útil minúscula.

Para o modo de ocultação do ***Reddit*** (***-r***), utilizamos o [***método de esteganografia QIM***](https://www.google.com/search?q=QIM+steganography+method&sourceid=chrome&ie=UTF-8&source=chrome.ctxt) (*Quantization Index Modulation no domínio DCT de JPEG*), uma vez que este é o único método de armazenamento que atualmente funciona para o ***Reddit***. A capa é transcodificada para baseline Q75 4:2:0 e a carga útil é transportada nos seus blocos DCT de luminância.

Para maximizar a capacidade de armazenamento para a plataforma ***Reddit***, utilize uma imagem de capa com grandes dimensões, **2048x2048**, **4096x4096**, **8192x8192 (máx.)**, etc.

A qualidade da imagem de capa não é importante para este método e deve ser mantida básica para as maiores dimensões, de modo a ajudar a minimizar o tamanho do ficheiro da imagem de capa.

Embora a plataforma ***X-Twitter*** possa utilizar o método predefinido fornecido pelo ***jdvrif***, em que os dados são ocultados dentro de segmentos APP2/ICC, o ***X-Twitter*** limita isto a um único segmento ICC com um tamanho máximo de apenas **~10KiB**.

Para carregar mais do que esses **~10KiB**, use o modo de ocultação da plataforma ***X-Twitter*** (***-x***). Ele abandona completamente os segmentos de metadados — nada é gravado em um perfil ICC — e, em vez disso, usa o [***método de esteganografia adaptativo J-UNIWARD com Syndrome-Trellis Coding (STC)***](https://www.google.com/search?q=adaptive+J-UNIWARD+steganography+method+with+Syndrome-Trellis+Coding+(STC)). A imagem de cobertura é transcodificada para 4:2:0 progressivo na qualidade derivada da fonte (limitada a **Q97**).

Para maximizar a capacidade de armazenamento para a plataforma ***X-Twitter***, use uma imagem de cobertura de alta qualidade/detalhada com grandes dimensões, **1024x1024**, **2048x2048**, **4096x4096 (máx.)**, etc.

Os transportadores ***-r*** e ***-x*** criptografam seus dados e vinculam sua localização ao seu PIN de recuperação usando ***Argon2id***, mas a incorporação ainda altera as estatísticas DCT da imagem, de modo que a esteganálise dedicada pode revelar que uma imagem carrega dados ocultos.

Imagens ***-r*** e ***-x*** criadas com ***jdvrif v9.0*** permanecem recuperáveis, mas a ***v9.0*** não consegue recuperar imagens ***-r*** ou ***-x*** criadas com a ***v9.1***.

Ambos os modos DCT carregam muito menos dados do que o modo padrão, então use ***capsize*** para medir uma imagem de cobertura antes de escolher um payload (veja [Verificando a capacidade](#checking-capacity-with-capsize)).

## Requisitos e Compilação (Linux)

A compilação requer **CMake 3.20 ou mais recente**, `flock` do **util-linux**, e **Ninja** (preferido) ou **Make**. O compilador deve ser **GCC 14 ou mais recente**, ou **Clang 18 ou mais recente** emparelhado com uma biblioteca padrão C++23 que implemente recursos como `std::format` e `std::print`. As bibliotecas nativas necessárias são **libsodium**, **libjpeg-turbo** (*tanto as APIs `turbojpeg` quanto `libjpeg`*), **zlib** e **libdeflate**. **OpenMP** é opcional: quando presente, ele paraleliza a passagem de custo J-UNIWARD do ***-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
```

Se a sua distribuição fornece o GCC 14 como um pacote versionado, instale `g++-14` e compile com `CXX=g++-14 ./compile_jdvrif.sh`.

O wrapper mantém os arquivos objeto rastreados por dependências em `src/build/`, de modo que invocações posteriores recompilam apenas o que mudou, e substitui o binário `jdvrif` publicado apenas após uma compilação completa e bem-sucedida. Defina `JDVRIF_JOBS=<count>` para alterar o limite de paralelismo (padrão: número de CPUs, limitado a 8), `JDVRIF_BUILD_DIR=<path>` para usar um cache de compilação separado, ou `BUILD_MODE=sanitize` para uma compilação com 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
```

Execute `jdvrif --info` para obter o guia completo integrado sobre modos, opções de plataforma e limites de tamanho.

```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*** do jdvrif:

  ***conceal*** - Comprime, criptografa e incorpora seu arquivo de dados secretos em uma imagem de capa ***JPG***.  
  ***recover*** - Descriptografa, descomprime e extrai o arquivo de dados oculto de uma imagem de capa ***JPG*** (*é necessário o PIN de recuperação*).  
  ***capsize*** - Informa a capacidade de portadora de uma imagem de capa para o modo ***-r*** ou ***-x***. Nenhuma imagem é salva.

Requisitos para a imagem de capa:

● Apenas JPEG, com pelo menos **400x400** pixels, e em escala de cinza ou cor YCbCr — imagens CMYK/YCCK devem ser convertidas para RGB primeiro.

● As dimensões máximas padrão e do ***-b*** são **4096x4096px**; o ***-r*** usa **8192x8192px**, enquanto o ***-x*** também é limitado a **4096x4096px**.

● O modo padrão (*sem opção*) também rejeita imagens de capa cuja qualidade JPEG estimada seja superior a **Q97**; salve novamente a imagem com uma qualidade menor se ela for recusada.

Requisitos para o arquivo de dados secretos:

● O nome de arquivo incorporado deve ter no máximo **20 bytes**, não pode começar com `.` ou `-` nem terminar com espaço ou `.`, e deve ser UTF-8 válido, sem caracteres de controle ou de formatação bidirecional nem qualquer um de `/ \ : * ? " < > |`. O nome é armazenado na imagem e restaurado no ***recover***.

● Seu arquivo de dados é comprimido antes da criptografia, exceto para tipos de arquivo reconhecidamente já comprimidos (`.zip`, `.7z`, `.mp4`, `.jpg`, `.png`, etc). Nos modos padrão e ***-b***, esses tipos só pulam a compressão quando forem maiores que **10MiB**; nos modos ***-r*** e ***-x*** eles sempre a pulam. Para qualquer outra coisa destinada a um limite pequeno de plataforma, considere comprimi-la você mesmo primeiro (*zip, rar, 7z, etc.*) para saber seu tamanho exato armazenado.

## Plataformas Compatíveis

\******************   
Nota: o ***Bluesky*** agora salva imagens como ***WEBP*** por padrão. 

Para salvar uma imagem como ***JPG***, de modo que você ainda possa recuperar dados ocultos com o ***jdvrif***:-  

Primeiro clique na imagem da postagem para abri-la, depois clique com o botão direito na imagem. No menu, selecione ***Abrir imagem em nova aba***.  

Selecione a nova aba e, na barra de endereços, vá até o final do endereço e adicione ***@jpg***, depois pressione Enter.  
Clique com o botão direito na imagem e, no menu, selecione ***Salvar imagem...***  

Sua imagem agora deve ser baixada como ***JPG***, que passará a funcionar com o ***jdvrif***.
         
Se você quiser uma ferramenta para ocultar dados usando imagens ***WEBP*** para postar no ***Bluesky***, você pode usar minha ferramenta CLI de esteganografia ***WEBP*** ***[wbpdv](https://github.com/CleasbyCode/wbpdv)***  
\******************

*Limite de tamanho de postagem medido pelo tamanho ***combinado*** da ***imagem de capa*** + ***arquivo de dados comprimido:****  

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

*Limite de tamanho medido ***apenas*** pelo ***tamanho do arquivo de dados comprimido:****  

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

Por exemplo, com o ***Mastodon***, se sua imagem de capa tiver **1MiB**, você ainda pode incorporar um arquivo de dados até o limite de tamanho de **~6MiB**.

**Outros: plataformas com modo de ocultação próprio:**

● ***Bluesky*** (***opção -b***). O ***JPG*** final com "*arquivo incorporado*" não deve exceder **2.000.000 bytes (~1,9MiB)**, então a imagem de capa e o arquivo de dados comprimido compartilham um único orçamento. O arquivo de dados comprimido sozinho não deve exceder **~171KiB**. Uma imagem de capa que já tenha 2.000.000 bytes não deixa espaço algum, então mantenha a capa menor que o limite em pelo menos o tamanho do seu arquivo de dados comprimido. O script "***create_bsky_post.py***" é necessário para postar essas imagens no ***Bluesky***. *Mais informações sobre este script mais adiante na página.*

● ***Reddit*** (***opção -r***). A imagem de capa e o arquivo de dados devem ter cada um no máximo **20MiB**, mas a capacidade real de portadora da imagem de capa é ***muito menor*** e depende das dimensões dela. Use `jdvrif capsize -r` para medi-la.

● ***X-Twitter*** (***opção -x***). A imagem de capa e o arquivo de dados não devem ter mais de **5MiB** cada, e a capa não deve exceder **4096x4096** pixels. A capacidade real de transporte é ***muito menor*** e depende da qualidade e das dimensões da imagem. Use `jdvrif capsize -x` para medi-la.

Nos modos padrão e ***-b***, a imagem de capa também é otimizada sem perdas antes do uso e não deve exceder **4MiB** após essa etapa.

Para plataformas como ***X-Twitter***, ***Reddit*** e ***Tumblr***, que têm limites pequenos de tamanho de dados, você pode querer focar em dados que se comprimem bem, como arquivos 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

## Verificando a capacidade com capsize

***capsize*** prepara a imagem de capa exatamente como ***conceal*** faria, e então informa quanto payload criptografado ela pode transportar. Nada é gravado em disco. Use ***-r*** para o transportador ***Reddit*** e ***-x*** para o transportador ***X-Twitter*** (***-x*** é o padrão se nenhuma opção for fornecida).

```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).
```

A figura reportada é a capacidade total do ***envelope*** criptografado, não um limite bruto do arquivo secreto: o nome do arquivo, os metadados de criptografia e de recuperação consomem de 95 a 114 bytes para um payload de quadro único, e payloads maiores adicionam sobrecarga de enquadramento. Não mire no limite teórico — onde a capacidade permitir, mantenha o payload comprimido pelo menos **1KiB** abaixo do máximo conservador. A verificação de tamanho realizada pelo ***conceal*** é a autoritativa.

## Opções de plataforma do modo conceal

Para criar imagens ***JPG*** compatíveis com "*data-concealed*" para publicação na plataforma ***Reddit***, você deve usar a opção ***-r*** com o modo ***conceal***.
  ```console
  $ jdvrif conceal -r my_image.jpg hidden.doc
```

  Essas imagens são compatíveis apenas para publicação no ***Reddit***. Seu arquivo de dados incorporado será perdido se for publicado em uma plataforma diferente.  
  
Ao salvar/baixar uma imagem do ***Reddit***, certifique-se de clicar na imagem dentro da postagem para expandi-la totalmente antes de salvar.  

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

Para criar imagens ***JPG*** compatíveis com "*data-concealed*" para publicação na plataforma ***X-Twitter*** usando o método de esteganografia J-UNIWARD, você deve usar a opção ***-x*** com o modo ***conceal***.
  ```console
  $ jdvrif conceal -x my_image.jpg hidden.doc
```

  Essas imagens são compatíveis apenas para publicação no ***X-Twitter***. Seu arquivo de dados incorporado será perdido se for publicado em uma plataforma diferente.  
  
  Ao salvar/baixar uma imagem do ***X-Twitter***, certifique-se de clicar na imagem dentro da publicação para expandi-la totalmente antes de salvar.  

Para criar imagens ***JPG*** "*com arquivo incorporado*" compatíveis para publicação na plataforma ***Bluesky***, você deve usar a opção ***-b*** com o modo ***conceal***.
  ```console
  $ jdvrif conceal -b my_image.jpg hidden.doc
```

  Essas imagens são compatíveis apenas para publicação no ***Bluesky***. Seu arquivo de dados incorporado será removido se for publicado em uma plataforma diferente.
 
  Você também precisa usar o script Python [create_bsky_post.py](https://github.com/CleasbyCode/jdvrif/blob/main/src/bsky/create_bsky_post.py) (encontrado na pasta ***src/bsky*** do repositório) para publicar a imagem no ***Bluesky***.
  Não funcionará se você publicar imagens no ***Bluesky*** pelo site no navegador ou pelo aplicativo móvel.  

  Para usar o script, você precisará criar uma [***app password***](https://bsky.app/settings/app-passwords) a partir da sua conta do ***Bluesky***. Passe suas credenciais por meio do ambiente, em vez de na linha de comando, onde elas ficariam visíveis para outros usuários locais por meio de ferramentas 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
```

  Consulte [src/bsky/README.md](https://github.com/CleasbyCode/jdvrif/blob/main/src/bsky/README.md) para ver o conjunto completo de opções (*várias imagens, respostas, posts de citação, cartões de link*) e para saber contra o que o fork reforçado do script protege.

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

## Testes

Os scripts de teste em `src/tests` recebem cada um o binário a exercitar:

```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 e ativos de terceiros

  ### Aplicações principais

  - [libsodium](https://github.com/jedisct1/libsodium) — geração aleatória criptográfica, derivação de chave Argon2id e fluxos secretos XChaCha20-Poly1305. Vinculada dinamicamente como biblioteca do sistema.
      
      Licença: [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) — processamento de JPEG e transformação sem perdas. Vinculada dinamicamente como biblioteca do sistema.

      Este software baseia-se em parte no trabalho do Independent JPEG Group.

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

      Copyright © 1991–2020 Thomas G. Lane e Guido Vollbeding.
   
      Copyright © 2009–2023 D. R. Commander. Todos os direitos reservados.
   
      Copyright © 2015 Viktor Szathmáry. Todos os direitos reservados.
   
  - [zlib](https://github.com/madler/zlib) — compressão e descompressão zlib em fluxo. Vinculada dinamicamente como biblioteca do sistema.

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

  - [libdeflate](https://github.com/ebiggers/libdeflate) — compressão rápida de buffer completo no formato zlib. Vinculada dinamicamente como biblioteca do sistema.

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

  ### Código e ativos incorporados

  - [Compact ICC Profiles](https://github.com/saucecontrol/Compact-ICC-Profiles) — perfil ICC compatível com Adobe incorporado.

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

  ### Auxiliar opcional de postagem no Bluesky

  - Bryan Newbold / ATProto Hacker Cookbook — create_bsky_post.py — Base para o auxiliar de postagem no Bluesky [forked](https://gist.github.com/CleasbyCode/1eb678ca1fa1975b1c1e20aeec33637e) (src/bsky/create_bsky_post.py). 
    Para referência, consulte a [cópia do Cookbook](https://github.com/bluesky-social/cookbook/blob/main/python-bsky-post/create_bsky_post.py)

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

  - Requests — requisições HTTP e à API do Bluesky.

    Licença: [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álise de metadados HTML e Open Graph.

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

  - Pillow — validação de imagens, dimensões e tratamento de proporção.

    Licença: [MIT-CMU](https://github.com/python-pillow/Pillow/blob/main/LICENSE)
    
    Copyright do PIL © 1997–2011 Secret Labs AB e © 1995–2011 Fredrik Lundh e colaboradores.
    
    Copyright do Pillow © 2010 Jeffrey “Alex” Clark e colaboradores.
    
##
Baixar ferramenta