Skip to content

feat(facebook): integração completa com Graph API, whitelist de obras e release notes automatico - #1

Merged
Vincius-dev merged 10 commits into
mainfrom
impl-facebook
Mar 7, 2026
Merged

feat(facebook): integração completa com Graph API, whitelist de obras e release notes automatico#1
Vincius-dev merged 10 commits into
mainfrom
impl-facebook

Conversation

@Vincius-dev

@Vincius-dev Vincius-dev commented Mar 7, 2026

Copy link
Copy Markdown
Owner

Integração completa com o Facebook Graph API

🚀 conexao_facebook.py — Reescrita completa

  • Removido o pacote facebook-sdk (obsoleto) do requirements.txt
  • Reescrito com requests direto contra a Graph API v25.0
  • Fluxo de postagem em duas etapas:
    1. Upload da imagem com published=false → obtém photo_id
    2. Publicação no feed com attached_media: [{ media_fbid }]
  • Suporte a modo de teste via ENABLE_FB_TEST=true: usa credenciais de página separada (API_TOKEN_PAGINA_TESTE / API_ID_PAGINA_FACEBOOK_TESTE) sem tocar na produção
  • Logging estruturado (logger_infos / logger_erros) em cada etapa

♻️ Blacklist → Whitelist de obras no Facebook

Lógica invertida: apenas obras explicitamente permitidas são postadas no Facebook.

Antes (blacklist) Depois (whitelist)
obrasNaoPermitidasFB obrasPermitidasFB
inserir_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

  • Nova suite completa test_dao_conexao_facebook.py: regras de negócio, flag ENABLE_FB_TEST, fluxo de whitelist e testes de integração real (pulados por padrão na CI via ENABLE_FB_TEST=false)
  • test_controller_obras.py atualizado para a lógica de whitelist
  • test_dao_web_screper.py: removida dependência de locale; adicionado load_dotenv()
  • test_postagem.py: adicionado load_dotenv()
  • 39/39 testes passando

📝 Documentação

  • Novo 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)
  • .envExample reescrito com todas as 12 variáveis documentadas e organizadas por seção (Discord, MongoDB, Facebook produção, Facebook testes, Gemini, Web scraper)
  • README.md atualizado com link para o novo guia

⚙️ CI/CD

  • Novo release.yml: gera release notes com git-cliff e publica GitHub Release automaticamente no push de tag v*; suporta pré-release automático para tags -rc, -beta e -alpha
  • test-pytest.yaml: adicionadas todas as variáveis de ambiente necessárias; variáveis organizadas por seção com comentários; ENABLE_FB_TEST=false garante que testes de integração reais não rodam na CI
  • cliff.toml: configuração do git-cliff para geração do changelog

🛠️ Ambiente de desenvolvimento local

  • docker-compose.yml: MongoDB 7 + serviço app, volumes nomeados mongo_dev_data e assets_dev
  • dev.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 testes
  • scripts/seed_dev_db.py: cria coleções com índices para o banco local (sem dados de exemplo)
  • .env.dev adicionado ao .gitignore

…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)

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 com attached_media) e remoção do facebook-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.

Comment thread src/controller/controller_postagem.py
Comment thread src/dao/conexao_facebook.py
Comment thread src/dao/conexao_facebook.py Outdated
Comment thread src/dao/conexao_facebook.py
Comment thread .envExample Outdated
Vincius-dev and others added 5 commits March 7, 2026 15:27
- 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
@Vincius-dev
Vincius-dev merged commit 874d2cc into main Mar 7, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants