Skip to content
aresd-devPublic

About

Programa para Windows que agenda e publica em LinkedIn, Instagram, YouTube, TikTok e X. Vitrine; código privado sob pedido.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

Postador

Postador

Agende uma vez, publique em todas as redes.
Programa para Windows que agenda e publica automaticamente em LinkedIn, Instagram, YouTube, TikTok e X, com várias contas por rede e usando somente as APIs oficiais.

Python 3.14 FastAPI SQLite 123 testes passando Windows Código privado

🔒 Este é o repositório vitrine. O código-fonte completo fica em um repositório privado. Recrutador(a)? Veja como pedir acesso.

Tela inicial do Postador


O problema

Quem cuida das redes de um pequeno negócio publica o mesmo conteúdo em 5 lugares, cada um com suas regras:

  • o X tem limite de 280 caracteres;
  • o Instagram só aceita JPEG;
  • o YouTube exige título;
  • o TikTok tem regras próprias de privacidade.

O projeto começou como um script em Python que lia uma planilha do Google Sheets e um Google Drive e publicava só no Facebook e no Instagram. Ele virou um programa de desktop completo, que eu reescrevi do zero mantendo as boas ideias do script.

O que ele faz

🗓️ Fila com horários fixos Cada conta tem a sua grade (ex.: seg a sex, 9h e 18h). Ao criar um post, basta escolher "próximo horário livre", e cada conta recebe o seu.
📦 Vários arquivos de uma vez Arraste 10 vídeos e saem 10 posts, distribuídos nos próximos horários livres, com legenda por arquivo.
📅 Calendário Visão do mês com status por cor. Arrastar um post muda o dia e mantém a hora.
✅ Validação antes da hora Limites de cada rede checados ao agendar. Só o destino com problema vira rascunho; os outros seguem.
🔁 Robusto Tenta de novo após 1, 5 e 15 min (só em erro temporário). Recupera posts perdidos com o PC desligado. Nunca publica duas vezes.
🔐 Seguro Tokens criptografados, login OAuth oficial de cada rede, proteção contra CSRF e DNS rebinding.
📱 Pelo celular Acesso pela rede Wi-Fi local, com senha, QR code e telas adaptadas para celular.
🖥️ Programa de verdade Um Postador.exe: janela própria, ícone na bandeja, inicia com o Windows, sem precisar de Python.

Telas

Fila de posts Calendário
Fila Calendário
Criar / editar post Vários arquivos de uma vez
Novo post Lote
Contas e horários da fila Configuração pela própria tela
Contas Configuração

Início no celular    Calendário no celular

Dados fictícios (cafeteria de demonstração). Prints da versão 1.0.

Arquitetura

flowchart LR
    subgraph PC["PC do usuário · Postador.exe"]
        UI["Interface web<br/>FastAPI + Jinja2"] --> SVC["Serviço de posts<br/>validação por rede"]
        SVC --> DB[("SQLite<br/>tokens criptografados")]
        SCH["Agendador<br/>thread + retentativas"] --> DB
        SCH --> PUB["Publishers<br/>LinkedIn · Instagram · YouTube · TikTok · X"]
        TRAY["Ícone na bandeja<br/>+ janela Edge (modo app)"] --> UI
    end
    CEL["Celular<br/>mesmo Wi-Fi + senha"] --> UI
    PUB --> API["APIs oficiais das redes"]
    PUB -. "mídia por URL temporária" .-> TUN["Cloudflare quick tunnel"] -.-> IG["Instagram"]
    LOGIN["Login OAuth da rede"] --> PONTE["Página-ponte HTTPS<br/>GitHub Pages"] --> UI
Loading
  • Um processo: servidor web + agendador em thread + ícone na bandeja. Uma única cópia do programa roda por vez, garantido reservando a porta antes de ligar o agendador.
  • Publishers: uma classe por rede, com a mesma interface (validate, publish, OAuth). Adicionar uma rede nova é escrever uma classe.
  • Horário por destino: um post vai para N contas, e cada uma tem o seu horário e o seu status. Isso permite que a mesma publicação saia às 9h no LinkedIn e às 18h no X.

Mais detalhes em docs/decisoes-tecnicas.md.

Destaques técnicos

  • OAuth sem servidor próprio. As redes exigem um redirect HTTPS fixo, mas o app roda no localhost. A solução é uma página estática no GitHub Pages que só repassa code e state para o app local, com state de uso único e PKCE.
  • Instagram exige a mídia em URL pública. Um mini-servidor isolado entrega só o arquivo daquele post, com token aleatório, por um túnel temporário da Cloudflare. O túnel é aberto só durante a publicação, e a interface nunca fica exposta.
  • Agendador confiável.
    • A seleção do que publicar é uma função pura (ver trecho).
    • Um claim atômico no SQLite impede publicação dupla.
    • Se o app cai no meio do envio, o post vai para "conferir", em vez de repetir sozinho e duplicar.
  • Upload em partes com retomada:
    • YouTube: resumable, com tratamento do HTTP 308;
    • LinkedIn: partes com ETag;
    • TikTok: FILE_UPLOAD com Content-Range;
    • X: initialize, append, finalize e status.
  • Restrições reais das plataformas viraram funcionalidade:
    • TikTok e YouTube só publicam como privado até a auditoria do app;
    • o X é pago por post, e o app estima o custo antes de agendar;
    • o token do LinkedIn expira em 60 dias, e o app avisa antes;
    • o Instagram só aceita JPEG, e o app converte com ffmpeg;
    • a tela de post segue as diretrizes de UX exigidas na auditoria do TikTok.
  • Segurança:
    • tokens das redes com Fernet (AES + HMAC);
    • senha de acesso remoto com scrypt e sessão assinada com HMAC;
    • limite de tentativas de login;
    • verificação de mesma origem (CSRF) e de Host (DNS rebinding);
    • segredos nunca voltam para a tela.

Qualidade

  • 123 testes com pytest, sem nenhuma chamada real de rede: o HTTP de cada rede é simulado com responses (ver exemplo).
  • Cobrem agendador, banco e migrações, cada rede (requisições, upload em partes, erros), OAuth, fila de horários, interface (TestClient) e autenticação.
  • Desenvolvido em etapas pequenas, com um commit por funcionalidade e testes verdes em cada uma.
  • Verificação no app real: fluxo completo em modo simulação, prints em desktop e celular (375 px, sem rolagem horizontal) e teste do .exe empacotado.

Stack

Back-end: Python 3.14 · FastAPI · Uvicorn · SQLite · Requests · Cryptography (Fernet, scrypt) Front-end: Jinja2 · Pico CSS · JavaScript puro (drag and drop, upload com barra de progresso) Desktop: PyInstaller (.exe único) · pystray (bandeja) · Microsoft Edge em modo aplicativo Integrações: LinkedIn Posts API · Instagram Graph API (Instagram Login) · YouTube Data API v3 · TikTok Content Posting API · X API v2 · Cloudflare Tunnel · GitHub Pages Testes: pytest · responses · FastAPI TestClient

Em números

Python (aplicação) ~4.500 linhas
Python (testes) ~1.600 linhas, 123 testes
HTML, CSS e JS ~1.600 linhas
Redes suportadas 5, com várias contas cada

Estrutura do código (repositório privado)

postador-codigo/
├── main.py                  # programa: servidor + agendador + janela + bandeja
├── social_bot/
│   ├── publishers/          # uma classe por rede (LinkedIn, Instagram, YouTube, TikTok, X)
│   ├── scheduler.py         # seleção do que venceu, retentativas, recuperação
│   ├── service.py           # criar/editar/agendar/mover posts com validação por conta
│   ├── slots.py             # fila com horários fixos
│   ├── oauth.py             # conectar contas (state, PKCE) e renovar tokens
│   ├── tunnel.py            # URL pública temporária para o Instagram
│   ├── db.py, crypto.py     # SQLite com migrações e tokens criptografados
│   ├── desktop_app.py       # janela, bandeja, iniciar com o Windows, atalhos
│   └── web/                 # interface (FastAPI + Jinja2), autenticação do celular
├── site/                    # página-ponte do OAuth + privacidade + termos (GitHub Pages)
├── tests/                   # 123 testes
└── build.bat                # gera o Postador.exe

Nesta vitrine estão só trechos curtos para mostrar o estilo do código. O núcleo (integrações com as redes, OAuth, agendador e interface) fica no repositório privado.

🔑 Acesso ao código

O código completo (aplicação, testes e todo o histórico de commits) está no repositório privado aresd-dev/postador-codigo.

Recrutador(a) ou empresa? Envie um e-mail para aresd.dev@gmail.com com:

  1. seu nome e a empresa/vaga;
  2. o seu usuário do GitHub.

Assim que eu receber, adiciono você ao repositório privado.


In English

Postador is a Windows desktop app that schedules and auto-publishes to LinkedIn, Instagram, YouTube, TikTok and X, with multiple accounts per network, using only official APIs. Highlights:

  • per-account posting slots and bulk upload;
  • drag-and-drop calendar;
  • a reliable scheduler (pure selection function, atomic claims, retry with backoff, no double posting);
  • OAuth through a static HTTPS bridge page;
  • a temporary Cloudflare tunnel for Instagram media;
  • encrypted tokens, CSRF and DNS-rebinding protection;
  • LAN access from a phone with a password;
  • packaged as a single .exe with a tray icon;
  • 123 tests with mocked HTTP.

The source code is private: email aresd.dev@gmail.com with your GitHub username to request access.

© 2026 aresd-dev. Todos os direitos reservados: imagens e trechos publicados apenas para avaliação do projeto.

About

Programa para Windows que agenda e publica em LinkedIn, Instagram, YouTube, TikTok e X. Vitrine; código privado sob pedido.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages