Guia para Desenvolvedores

Como Automatizar Publicacoes em Redes Sociais com Python

Seja voce construindo um pipeline de conteudo para sua startup, automatizando posts para clientes ou integrando publicacao social em um produto SaaS, Python torna tudo facil. Este tutorial cobre desde o seu primeiro upload ate um script de automacao pronto para producao.

Por que Python para automação de redes sociais

Python e a linguagem preferida para automacao. E legivel, tem um ecossistema gigante e e perfeita para scripts que rodam em um cronograma. E quando se trata de postar em redes sociais de forma programatica, a alternativa a usar uma API como o Upload-Post e construir integracoes OAuth para cada plataforma por conta propria. Isso significa lidar com a Content Posting API do TikTok, a Graph API do Instagram, a Data API do YouTube, e por ai vai. Cada uma com seu proprio fluxo de autenticacao, limites de taxa e peculiaridades.

Com a API de publicação em redes sociais, voce faz uma chamada de API e ela publica em todas as dez plataformas. O SDK Python torna isso ainda mais simples.

Configurando seu ambiente

1. Instale o SDK

pip install upload-post

2. Obtenha sua chave de API

Crie uma conta gratuita em app.upload-post.com e gere uma chave de API no painel de Chaves de API. Armazene-a como variavel de ambiente:

export UPLOAD_POST_API_KEY="your-api-key-here"

3. Conecte suas contas sociais

No painel do Upload-Post, crie um perfil (ex.: "minhaMarca") e conecte seu TikTok, Instagram, YouTube e quaisquer outras contas para as quais voce quer publicar. O nome do perfil e o que voce vai referenciar no seu codigo.

Seu primeiro upload: publicando um vídeo

import os
from upload_post import UploadPostClient

client = UploadPostClient(
    api_key=os.environ["UPLOAD_POST_API_KEY"]
)

response = client.upload_video(
    video_path="my-video.mp4",
    title="Nosso novo produto em ação",
    user="mybrand",
    platforms=["tiktok", "instagram", "youtube"]
)

if response["success"]:
    for platform, result in response["results"].items():
        if result["success"]:
            print(f"{platform}: {result['url']}")
        else:
            print(f"{platform}: upload failed")
else:
    print("Upload failed:", response)

Esse e um script funcional. Execute e seu video vai ao ar em tres plataformas. Agora vamos fazer mais coisas com ele.

Postando fotos e carrosséis

response = client.upload_photos(
    photos=["slide-1.jpg", "slide-2.jpg", "slide-3.jpg"],
    title="Lookbook da coleção de verão",
    description="Cada peça, feita em Portugal. Compre pelo link na bio.",
    user="mybrand",
    platforms=["instagram", "tiktok", "linkedin"]
)

print(response)

O Instagram cria um post carrossel, o TikTok cria um slideshow e o LinkedIn exibe como post com multiplas imagens. Cada plataforma recebe o formato que ela prefere.

Postando conteúdo de texto

Para posts somente texto (pense em threads do Twitter, atualizacoes do LinkedIn ou submissoes no Reddit):

response = client.upload_text(
    title="Acabamos de lançar uma grande atualização para nossa API. Aqui está o que mudou...",
    user="mybrand",
    platforms=["x", "linkedin", "threads", "bluesky"]
)

print(response)

Se o seu texto ultrapassa o limite de caracteres de uma plataforma, a API lida com isso de forma inteligente. No X, texto acima de 280 caracteres automaticamente vira uma thread. No Threads, a divisao acontece em 500 caracteres. No Bluesky, em 300.

Usando parâmetros específicos por plataforma

O parametro title define a legenda padrao para todas as plataformas, mas muitas vezes voce vai querer textos diferentes para cada uma. Veja como personalizar por plataforma:

import requests
import os

API_KEY = os.environ["UPLOAD_POST_API_KEY"]

with open("product-demo.mp4", "rb") as video:
    response = requests.post(
        "https://api.upload-post.com/api/upload",
        headers={"Autorização": f"Apikey {API_KEY}"},
        files={"video": video},
        data={
            "user": "mybrand",
            "title": "Check this out",
            # Platform specific titles
            "tiktok_title": "POV: seu produto se vende sozinho #ecommerce #dropshipping",
            "instagram_title": "Novo lançamento. Link na bio para acesso antecipado.",
            "youtube_title": "Demonstração do Produto | Revisão Completa",
            "youtube_description": "Neste vídeo, mostramos exatamente como funciona...",
            "linkedin_title": "Animado para compartilhar nosso último lançamento de produto com a comunidade.",
            # Platform specific settings
            "platform[]": ["tiktok", "instagram", "youtube", "linkedin"],
            "privacy_level": "PUBLIC_TO_EVERYONE",
            "media_type": "REELS",
            "tags[]": ["product", "demo", "review"],
            "privacyStatus": "public",
        }
    )

print(response.json())

Este exemplo usa a biblioteca requests diretamente em vez do SDK, o que da acesso a todos os parametros da API. Confira a referencia completa da API para todas as opcoes disponiveis por plataforma.

Agendando posts para depois

from datetime import datetime, timedelta

# Schedule for tomorrow at 9 AM
tomorrow_9am = (datetime.now() + timedelta(days=1)).replace(
    hour=9, minute=0, second=0, microsecond=0
)

response = client.upload_video(
    video_path="tomorrows-content.mp4",
    title="Bom dia! Conteúdo fresco para seu feed",
    user="mybrand",
    platforms=["tiktok", "instagram"],
    scheduled_date=tomorrow_9am.isoformat(),
    timezone="America/Sao_Paulo"
)

print(f"Agendado! ID do trabalho: {response['job_id']}")
print(f"Será publicado em: {response['scheduled_date']}")

Voce pode agendar com ate 365 dias de antecedencia. Para mais detalhes sobre agendamento e o sistema de fila, leia nosso guia de agendamento.

Building a complete automation: folder monitoring

Aqui vai um script pratico que monitora uma pasta em busca de novos arquivos de video e faz upload automaticamente. Isso e otimo para agencias que recebem conteudo de clientes em uma pasta compartilhada:

import os
import time
import json
from upload_post import UploadPostClient

client = UploadPostClient(
    api_key=os.environ["UPLOAD_POST_API_KEY"]
)

WATCH_FOLDER = "/path/to/content/inbox"
PROCESSED_FILE = "/path/to/content/processed.json"
CHECK_INTERVAL = 60  # seconds

def load_processed():
    if os.path.exists(PROCESSED_FILE):
        with open(PROCESSED_FILE) as f:
            return set(json.load(f))
    return set()

def save_processed(processed):
    with open(PROCESSED_FILE, "w") as f:
        json.dump(list(processed), f)

def upload_video(filepath):
    filename = os.path.basename(filepath)
    title = filename.rsplit(".", 1)[0].replace("-", " ").replace("_", " ")

    response = client.upload_video(
        video_path=filepath,
        title=title,
        user="mybrand",
        platforms=["tiktok", "instagram", "youtube"],
        add_to_queue=True,
        async_upload=True
    )
    return response

print(f"Watching {WATCH_FOLDER} for new videos...")

processed = load_processed()

while True:
    for filename in os.listdir(WATCH_FOLDER):
        if filename in processed:
            continue
        if not filename.lower().endswith((".mp4", ".mov")):
            continue

        filepath = os.path.join(WATCH_FOLDER, filename)
        print(f"New file detected: {filename}")

        try:
            result = upload_video(filepath)
            print(f"  Queued successfully: {result.get('job_id', 'done')}")
            processed.add(filename)
            save_processed(processed)
        except Exception as e:
            print(f"  Error: {e}")

    time.sleep(CHECK_INTERVAL)

Execute este script em segundo plano (ou como um servico systemd) e toda vez que alguem colocar um video na pasta, ele sera publicado em todas as suas plataformas conectadas. Se precisar de algo mais robusto, considere usar n8n ou Make.com para um workflow gerenciado.

Trabalhando com a API diretamente (sem o SDK)

Se voce prefere nao usar o SDK ou precisa de controle de nivel mais baixo, pode usar a biblioteca requests diretamente. Aqui esta o equivalente ao upload pelo SDK:

import requests

API_KEY = "your-api-key-here"
API_URL = "https://api.upload-post.com/api/upload"

# Upload a video
with open("video.mp4", "rb") as f:
    response = requests.post(
        API_URL,
        headers={"Autorização": f"Apikey {API_KEY}"},
        files={"video": ("video.mp4", f, "video/mp4")},
        data={
            "user": "mybrand",
            "title": "Postado com requisições Python",
            "platform[]": ["tiktok", "instagram"],
        }
    )

print(response.status_code)
print(response.json())

Validando sua chave de API

Antes de rodar um lote grande, e uma boa ideia validar que sua chave funciona e verificar os limites do seu plano:

response = requests.get(
    "https://api.upload-post.com/api/uploadposts/me",
    headers={"Autorização": f"Apikey {API_KEY}"}
)

data = response.json()
print(f"Email: {data['email']}")
print(f"Plano: {data['plan']}")

Boas práticas de tratamento de erros

Ao construir scripts para producao, trate estes cenarios comuns:

import requests

def upload_with_retry(video_path, title, platforms, max_retries=3):
    for attempt in range(max_retries):
        try:
            with open(video_path, "rb") as f:
                response = requests.post(
                    "https://api.upload-post.com/api/upload",
                    headers={"Autorização": f"Apikey {API_KEY}"},
                    files={"video": f},
                    data={
                        "user": "mybrand",
                        "title": title,
                        "platform[]": platforms,
                        "async_upload": "true",
                    },
                    timeout=120
                )

            if response.status_code == 200:
                return response.json()
            elif response.status_code == 429:
                # Rate limited, check usage
                usage = response.json().get("usage", {})
                print(f"Rate limited. Used {usage.get('count')}/{usage.get('limit')}")
                return None
            elif response.status_code == 401:
                print("Invalid API key")
                return None
            else:
                print(f"Attempt {attempt + 1} failed: {response.status_code}")

        except requests.exceptions.Timeout:
            print(f"Attempt {attempt + 1} timed out, retrying...")

    print(f"Todas as {max_retries} tentativas falharam para {video_path}")
    return None

Consulting upload history

Voce pode puxar seu historico de uploads para verificar o que foi publicado ou montar um dashboard de relatorios:

response = requests.get(
    "https://api.upload-post.com/api/uploadposts/history?page=1&limit=20",
    headers={"Autorização": f"Apikey {API_KEY}"}
)

for entry in response.json()["history"]:
    status = "OK" if entry["success"] else "FAILED"
    print(f"[{status}] {entry['platform']} - {entry['post_title']} - {entry['post_url']}")

Próximos passos

Agora que voce tem o basico, aqui vao algumas ideias do que construir em seguida:

  • Conecte seu script a um CMS ou banco de dados para que novos conteúdos sejam publicados automaticamente.
  • Use a abordagem de upload em massa para processar bibliotecas inteiras de conteudo
  • Reaproveite vídeos longos em clipes curtos usando FFmpeg e a API do Upload-Post
  • Construa uma integracao white label se voce esta criando um produto SaaS que precisa de publicacao social
  • Explore nossos templates n8n para workflows com IA que geram e publicam conteudo automaticamente

Comece a automatizar com Python hoje

Instale o SDK, pegue sua chave de API e publique seu primeiro video em menos de 5 minutos. O plano gratuito inclui 10 uploads por mes.

pip install upload-post