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.
🔒 Este é o repositório vitrine. O código-fonte completo fica em um repositório privado. Recrutador(a)? Veja como pedir acesso.
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.
| 🗓️ 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. |
| Fila de posts | Calendário |
|---|---|
![]() |
![]() |
| Criar / editar post | Vários arquivos de uma vez |
|---|---|
![]() |
![]() |
| Contas e horários da fila | Configuração pela própria tela |
|---|---|
![]() |
![]() |
Dados fictícios (cafeteria de demonstração). Prints da versão 1.0.
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
- 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.
- 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ó repassacodeestatepara o app local, comstatede 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_UPLOADcomContent-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.
- 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
.exeempacotado.
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
| 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 |
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.
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:
- seu nome e a empresa/vaga;
- o seu usuário do GitHub.
Assim que eu receber, adiciono você ao repositório privado.
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
.exewith 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.








