feat(facebook): integração completa com Graph API, whitelist de obras e release notes automatico - #1
Merged
Merged
Conversation
…ebook ## conexao_facebook.py - Reescrito do zero usando requests + Graph API v25.0 diretamente, removendo dependência do facebook-sdk (deprecated) - Fluxo de postagem em 2 passos: upload da imagem (published=false) para obter photo_id, seguido de publicação no feed via attached_media - Passa URL da imagem via parâmetro 'url' em vez de upload de arquivo binário local - Adicionado suporte à flag ENABLE_FB_TEST: quando true, usa credenciais da página de teste (API_TOKEN_PAGINA_TESTE / API_ID_PAGINA_FACEBOOK_TESTE); se as credenciais de teste estiverem ausentes, retorna sem postar - Logging de erros detalhado em cada etapa ## controller_postagem.py - Descomentado e corrigido o bloco de postagem no Facebook (estava comentado como docstring) - Corrigido import de ConexaoFacebook e PostFacebook que estavam ausentes - Chamada real a ConexaoFacebook.postar_anuncio_facebook() restaurada ## post_facebook.py - Corrigido bug de TypeError ao iterar dados_unicos_obras como lista de dicts em vez de indexar como dict diretamente ## tests/test_dao_conexao_facebook.py (novo arquivo) - TestRegraDeNegocioFacebook: testes unitários de remover_obras_que_nao_pode_postar - TestFlagEnableFbTest: valida que sem credenciais de teste nenhuma chamada à API é feita quando ENABLE_FB_TEST=true - TestConexaoFacebook: testes de integração reais, protegidos por pytest.skip quando ENABLE_FB_TEST != true ## requirements.txt - Removido facebook-sdk==3.1.0 (não mais utilizado) ## README.md - Documentação das variáveis de ambiente do Facebook - Guia passo a passo para configurar o App no Meta for Developers, gerar Page Access Token e configurar o .env
## Motivação
A lógica anterior bloqueava obras explicitamente (blacklist).
A nova lógica exige permissão explícita para postar (whitelist):
obras ausentes da lista são ignoradas por padrão.
## atlas_dao.py
- Removido: inserir_obra_nao_permitida_fb() e listar_obras_nao_permitidas_fb()
que operavam na coleção 'obrasNaoPermitidasFB'
- Adicionado: inserir_obra_permitida_fb() — insere na coleção 'obrasPermitidasFB'
- Adicionado: listar_obras_permitidas_fb() — lê da coleção 'obrasPermitidasFB'
## controller_obras.py
- Removido: remover_obras_que_nao_pode_postar() (lógica de blacklist)
- Adicionado: filtrar_obras_permitidas_fb() — retorna apenas obras cujo
titulo_obra consta na whitelist recebida como parâmetro
## controller_postagem.py
- Atualizado o bloco de postagem do FB para usar listar_obras_permitidas_fb()
e filtrar_obras_permitidas_fb() no lugar dos métodos antigos
## bot_endpoint.py
- Comando /adicionar_obra_nao_permitida_fb renomeado para
/adicionar_obra_permitida_fb, agora chama inserir_obra_permitida_fb()
- Comando /listar_obras_nao_permitidas_fb renomeado para
/listar_obras_permitidas_fb, agora chama listar_obras_permitidas_fb()
- Embed de /informacoes_postagem atualizado com os novos nomes de comandos
## tests/test_dao_conexao_facebook.py
- TestRegraDeNegocioFacebook reescrito para whitelist:
testa que whitelist vazia retorna zero obras, que obras ausentes são
removidas e que obras presentes são mantidas
- Adicionado TestWhitelistFluxoPostagem: simula o trecho do
ControllerPostagem que consulta a whitelist e chama ConexaoFacebook,
garantindo que apenas obras autorizadas chegam à API do Facebook
## Atlas (manual)
- Criar coleção 'obrasPermitidasFB' no banco 'DadosPostagem'
- Documentos no formato: { "titulo_obra": "Nome Exato Da Obra" }
- Coleção 'obrasNaoPermitidasFB' pode ser removida
…de ambiente - docs/configuracao_facebook.md: guia completo passo a passo para criar app Meta, configurar caso de uso 'Gerenciar tudo na sua Página', adicionar as 5 permissões necessárias (pages_show_list, pages_read_engagement, pages_read_user_content, pages_manage_posts, pages_manage_engagement), gerar Page Access Token via /me/accounts no Graph API Explorer e converter para token de longa duração - .envExample: reescrito com todas as 12 variáveis documentadas e organizadas em seções (Discord, MongoDB Atlas, Facebook produção, Facebook testes, Gemini, scraper) - README.md: seção de configuração do Facebook substituída por link para o novo guia; referências '(desativado)' removidas do módulo conexao_facebook - src/dao/web_screper_site.py: locale.setlocale encapsulado em try/except para compatibilidade com ambientes sem pt_BR.UTF-8 (ex: WSL) - tests/test_controller_obras.py: atualizado para usar filtrar_obras_permitidas_fb() (whitelist) no lugar do método blacklist removido - tests/test_dao_web_screper.py: adicionado load_dotenv() no topo; teste de data reescrito sem dependência de locale, usando lista fixa de meses em português - tests/test_postagem.py: adicionado load_dotenv() para garantir que URL_SITE esteja disponível durante os testes
- cliff.toml: configuração do git-cliff com categorias em português (Novidades, Correções, Refatorações, Performance, Testes, Documentação, Manutenção, CI/CD, Build); ignora commits de merge e bump; ativa somente para tags no padrão vX.X.X - .github/workflows/release.yml: workflow disparado no push de tags v*; faz checkout completo (fetch-depth: 0), gera release notes com git-cliff (orhun/git-cliff-action@v3) e publica o GitHub Release automaticamente; tags com sufixo -rc/-beta/-alpha são marcadas como pre-release - .github/workflows/test-pytest.yaml: adicionadas variáveis de ambiente faltantes (GEMINI_API, URL_SITE, API_ID_PAGINA_FACEBOOK_TESTE, API_TOKEN_PAGINA_TESTE, ENABLE_FB_TEST=false)
There was a problem hiding this comment.
Pull request overview
Este PR implementa a integração completa de postagem no Facebook via Graph API (substituindo facebook-sdk), troca a lógica de bloqueio por uma whitelist de obras permitidas e adiciona automação de release notes (git-cliff) no CI.
Changes:
- Reescrita do fluxo de postagem no Facebook (upload
published=false+ post no feed comattached_media) e remoção dofacebook-sdk. - Migração de blacklist → whitelist (DAO, controller e comandos do bot Discord) e atualização/adição de testes.
- Documentação expandida (guia Facebook, README,
.envExample) e novo workflow de release automático.
Reviewed changes
Copilot reviewed 17 out of 19 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
tests/test_postagem.py |
Carrega .env nos testes de postagem para padronizar execução em diferentes ambientes. |
tests/test_dao_web_screper.py |
Remove dependência de locale no teste de datas e adiciona load_dotenv(). |
tests/test_dao_conexao_facebook.py |
Adiciona suíte de testes para whitelist/flag ENABLE_FB_TEST e testes de integração (skip por padrão). |
tests/test_controller_obras.py |
Atualiza testes para a nova regra de whitelist no Facebook. |
src/model/posts/post_facebook.py |
Corrige construção do PostFacebook para não tratar dados_unicos_obras como dict e evitar TypeError. |
src/endpoint/bot_endpoint.py |
Atualiza comandos Discord para gerenciar whitelist do Facebook. |
src/dao/web_screper_site.py |
Torna setlocale resiliente (try/except) para ambientes sem pt_BR instalado. |
src/dao/conexao_facebook.py |
Implementa postagem via Graph API v25 usando requests e modo de teste com credenciais separadas. |
src/dao/atlas_dao.py |
Adiciona métodos de whitelist (inserir/listar) e nova coleção Mongo. |
src/controller/controller_postagem.py |
Reativa o fluxo de postagem no Facebook e aplica filtro de whitelist antes de postar. |
src/controller/controller_obras.py |
Implementa filtrar_obras_permitidas_fb() (whitelist). |
requirements.txt |
Remove dependência facebook-sdk. |
docs/configuracao_facebook.md |
Documenta setup completo do app Meta, permissões e geração de token. |
cliff.toml |
Configura git-cliff para geração de release notes por conventional commits. |
README.md |
Atualiza documentação geral, arquitetura, variáveis de ambiente e link para guia do Facebook. |
.gitignore |
Adiciona regra para ignorar *.pyc. |
.github/workflows/test-pytest.yaml |
Organiza e completa variáveis de ambiente no CI para execução do pytest. |
.github/workflows/release.yml |
Novo workflow: gera release notes com git-cliff e publica GitHub Release ao criar tag v*. |
.envExample |
Reescreve e organiza variáveis de ambiente (Discord/Mongo/Facebook/Gemini/Scraper). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- docker-compose.yml com servicos mongo e app (named volumes) - scripts/seed_dev_db.py para criar colecoes e indices no MongoDB local - dev.sh e dev.bat com menu interativo de utilitarios de dev - .gitignore atualizado para ignorar .env.dev
…a UI - Renomeia seção 5 para 'Obter token permanente de página' - Adiciona Opção 1 (chamada OAuth direta em dois passos) - Adiciona Opção 2 (fluxo pela Ferramenta de Token do Explorer, sem código) - Inclui fix do venv no dev.sh e dev.bat (opções 3 e 4)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
- Valida photo_id após upload: aborta com ValueError se ausente ou inválido - Configura timeout de 30s em ambas as requisições (upload e feed) - Adiciona Session com retry automático (3 tentativas, backoff exponencial) para status 429/5xx - Valida credenciais de produção ausentes antes de chamar a API, lançando EnvironmentError com mensagem explícita
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Integração completa com o Facebook Graph API
🚀
conexao_facebook.py— Reescrita completafacebook-sdk(obsoleto) dorequirements.txtrequestsdireto contra a Graph API v25.0published=false→ obtémphoto_idattached_media: [{ media_fbid }]ENABLE_FB_TEST=true: usa credenciais de página separada (API_TOKEN_PAGINA_TESTE/API_ID_PAGINA_FACEBOOK_TESTE) sem tocar na produçãologger_infos/logger_erros) em cada etapa♻️ Blacklist → Whitelist de obras no Facebook
Lógica invertida: apenas obras explicitamente permitidas são postadas no Facebook.
obrasNaoPermitidasFBobrasPermitidasFBinserir_obra_nao_permitida_fb()inserir_obra_permitida_fb()listar_obras_nao_permitidas_fb()listar_obras_permitidas_fb()remover_obras_que_nao_pode_postar()filtrar_obras_permitidas_fb()/adicionar_obra_nao_permitida_fb/adicionar_obra_permitida_fb/listar_obras_nao_permitidas_fb/listar_obras_permitidas_fb🧪 Testes
test_dao_conexao_facebook.py: regras de negócio, flagENABLE_FB_TEST, fluxo de whitelist e testes de integração real (pulados por padrão na CI viaENABLE_FB_TEST=false)test_controller_obras.pyatualizado para a lógica de whitelisttest_dao_web_screper.py: removida dependência de locale; adicionadoload_dotenv()test_postagem.py: adicionadoload_dotenv()📝 Documentação
docs/configuracao_facebook.md: passo a passo completo para criar app Meta, configurar permissões e gerar token permanente de página via/me/accounts(2 opções: chamada OAuth direta e pela Ferramenta de Token do Explorer).envExamplereescrito com todas as 12 variáveis documentadas e organizadas por seção (Discord, MongoDB, Facebook produção, Facebook testes, Gemini, Web scraper)README.mdatualizado com link para o novo guia⚙️ CI/CD
release.yml: gera release notes comgit-cliffe publica GitHub Release automaticamente no push de tagv*; suporta pré-release automático para tags-rc,-betae-alphatest-pytest.yaml: adicionadas todas as variáveis de ambiente necessárias; variáveis organizadas por seção com comentários;ENABLE_FB_TEST=falsegarante que testes de integração reais não rodam na CIcliff.toml: configuração do git-cliff para geração do changelog🛠️ Ambiente de desenvolvimento local
docker-compose.yml: MongoDB 7 + serviçoapp, volumes nomeadosmongo_dev_dataeassets_devdev.sh/dev.bat: scripts interativos com menu de 7 opções (venv, MongoDB local, seed, pytest, compose up/down, build prod); auto-ativação do venv nas opções de seed e testesscripts/seed_dev_db.py: cria coleções com índices para o banco local (sem dados de exemplo).env.devadicionado ao.gitignore