Bot que monitora lançamentos de capítulos em um site de mangás/webtoons e realiza postagens automáticas de anúncio em canais do Discord.
flowchart TD
MAIN["Main.py\n(Ponto de entrada)"]
subgraph classes_io ["classes_io"]
GESTOR["GestorTXT\nLê/grava data anterior\ne modo de teste (TXT)"]
DOWNLOAD["DownloadImagens\nBaixa imagens das obras\nregistradas no Atlas"]
end
subgraph controller ["controller"]
CTRL_POST["ControllerPostagem\nOrquestra o fluxo\nde postagem"]
CTRL_OBRA["ControllerObras\nFiltra e valida\nlistas de obras"]
end
subgraph dao ["dao"]
ATLAS["AtlasDAO\nMongoDB Atlas\n(obras registradas,\nanunciadas, etc.)"]
SCRAPER["WebScreperSite\nWeb scraping dos\ncapítulos diários do site"]
DISCORD["ConexaoDiscord\nEnvia embeds para\ncanais do Discord"]
GEMINI["GeminiDAO\nIntegração com\nGoogle Gemini AI"]
end
subgraph model ["model"]
OBRA["Obra"]
CAPITULO["Capitulo"]
POST_DC["PostDiscord\nMonta o embed\ndo anúncio"]
POST_FB["PostFacebook"]
MSGS["Mensagens\nLogs e prints"]
LOGGER["LoggerConfig\nConfiguração de logs"]
end
subgraph assets ["assets (volume)"]
TXT_DATA["registro_horario/\ndata_anterior.txt"]
TXT_MODE["config/\ntest_mode.txt"]
IMGS["imagens/\n(cache local de imagens)"]
end
MAIN --> GESTOR
MAIN --> DOWNLOAD
MAIN --> CTRL_POST
MAIN --> LOGGER
GESTOR --> TXT_DATA
GESTOR --> TXT_MODE
DOWNLOAD --> ATLAS
DOWNLOAD --> IMGS
CTRL_POST --> ATLAS
CTRL_POST --> SCRAPER
CTRL_POST --> CTRL_OBRA
CTRL_POST --> POST_DC
CTRL_POST --> DISCORD
SCRAPER --> OBRA
SCRAPER --> CAPITULO
POST_DC --> OBRA
POST_DC --> CAPITULO
CTRL_OBRA --> OBRA
- GestorTXT lê a data da última execução e o modo de teste.
- DownloadImagens sincroniza o cache local de imagens com os dados do MongoDB Atlas.
- WebScreperSite faz scraping do site e retorna a lista de obras com capítulos lançados no dia.
- ControllerObras filtra obras não registradas no Atlas e remove capítulos já anunciados.
- ControllerPostagem itera sobre as obras restantes, monta um
PostDiscorde envia o embed via ConexaoDiscord. - O registro de obras anunciadas é persistido no MongoDB Atlas para evitar duplicatas.
| Variável | Descrição |
|---|---|
API_KEY |
Token do bot Discord. Obtido em https://discord.com/developers/applications → Bot → Token |
CANAL_LANCAMENTOS |
ID do canal onde os anúncios de lançamentos são postados em produção |
CANAL_TESTES |
ID do canal usado quando o bot é executado em modo de teste |
CANAL_TAGS |
ID do canal de tags/cargos, usado para menções nos embeds |
| Variável | Descrição |
|---|---|
URI_ATLAS |
URI de conexão com o cluster MongoDB Atlas. Formato: mongodb+srv://<user>:<password>@<cluster>.mongodb.net/ |
| Variável | Descrição |
|---|---|
GEMINI_API |
Chave da API do Google Gemini AI. Obtida em https://aistudio.google.com/app/apikey |
| Variável | Descrição |
|---|---|
API_ID_PAGINA_FACEBOOK |
ID numérico da página do Facebook de produção onde os posts serão publicados |
API_TOKEN_PAGINA |
Page Access Token de longa duração da página de produção. Veja configuracao_facebook.md para instruções de geração |
API_ID_PAGINA_FACEBOOK_TESTE |
ID numérico da página de teste (usada apenas quando ENABLE_FB_TEST=true) |
API_TOKEN_PAGINA_TESTE |
Page Access Token da página de teste |
ENABLE_FB_TEST |
"true" para habilitar os testes unitários de postagem no Facebook. Por padrão "false" para evitar postagens acidentais |
Consulte o guia completo em docs/configuracao_facebook.md.
bot-notification/
├── src/
│ ├── Main.py # Ponto de entrada
│ ├── classes_io/
│ │ ├── download_imagens.py # Download de imagens das obras
│ │ └── gestor_txt.py # Leitura/escrita de arquivos TXT
│ ├── controller/
│ │ ├── controller_obras.py # Filtragem e validação de obras
│ │ └── controller_postagem.py # Orquestração do fluxo de postagem
│ ├── dao/
│ │ ├── atlas_dao.py # Acesso ao MongoDB Atlas
│ │ ├── conexao_discord.py # Envio de mensagens ao Discord
│ │ ├── conexao_facebook.py # Integração Facebook (Graph API v25.0)
│ │ ├── gemini_dao.py # Integração Google Gemini AI
│ │ └── web_screper_site.py # Web scraping do site de mangás
│ ├── endpoint/
│ │ ├── bot_endpoint.py
│ │ └── pagination.py
│ └── model/
│ ├── capitulo.py # Entidade Capítulo
│ ├── logger_config.py # Configuração de loggers
│ ├── mensagens.py # Mensagens de log/console
│ ├── obra.py # Entidade Obra
│ └── posts/
│ ├── post_discord.py # Modelo do embed Discord
│ └── post_facebook.py # Modelo do post Facebook
├── assets/ # Volume Docker (persistente)
│ ├── config/
│ │ └── test_mode.txt # "true" para modo de teste
│ ├── imagens/ # Cache local de capas das obras
│ └── registro_horario/
│ └── data_anterior.txt # Data da última execução
├── tests/ # Testes unitários (pytest)
├── Dockerfile
├── Dockerfile-dev
└── requirements.txt
A versão do Python utilizada é: python:3.10
Para criar o ambiente, utilize:
python3 -m venv venv
source venv/bin/activatePara instalar as dependências do projeto:
pip install -r requirements.txtPara executar os testes:
pytestA imagem utiliza volume para persistir os dados em assets/. Crie o volume antes de rodar:
docker volume create <nome-do-volume>Construir a imagem:
docker build -t bot-notif:<versao-do-bot> .Executar o container:
docker run -d -v <nome-do-volume>:/home/project/assets bot-notif:<versao-do-bot>Acompanhar a saída do bot:
docker attach <id-do-container>Encontrar o ID do container:
docker ps