

Automatize a Geração de Apresentações com Python: Tutorial da API 2Slides
Python é a linguagem ideal para automação, pipelines de dados e fluxos de trabalho de AI. Este tutorial mostra como usar a API REST do 2Slides a partir do Python para gerar apresentações automaticamente — desde slides simples até pipelines automatizados complexos.
Pré-requisitos
pip install requests python-dotenv
Crie um arquivo
.envTWOSLIDES_API_KEY=sk-2slides-your-api-key
Início Rápido: Gere Seus Primeiros Slides
import os import time import requests from dotenv import load_dotenv load_dotenv() API_KEY = os.getenv('TWOSLIDES_API_KEY') BASE_URL = 'https://2slides.com/api/v1' HEADERS = { 'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json' } def generate_slides(topic, theme_id=None, mode='async'): """Gera uma apresentação a partir de um tópico de texto.""" payload = { 'userInput': topic, 'mode': mode, 'responseLanguage': 'en', 'resolution': '2K', } if theme_id: payload['themeId'] = theme_id response = requests.post( f'{BASE_URL}/slides/generate', headers=HEADERS, json=payload ) response.raise_for_status() return response.json() def wait_for_job(job_id, timeout=300, interval=3): """Aguarda até que um trabalho seja concluído.""" start = time.time() while time.time() - start < timeout: response = requests.get( f'{BASE_URL}/jobs/{job_id}', headers=HEADERS ) data = response.json() status = data.get('status') print(f' Trabalho {job_id}: {status}') if status == 'success': return data if status == 'failed': raise Exception(f'Trabalho falhou: {data}') time.sleep(interval) raise TimeoutError(f'Trabalho {job_id} expirou após {timeout}s') # Gera uma apresentação job = generate_slides('As 10 Principais Tendências de AI para 2026') print(f'ID do Trabalho: {job["jobId"]}') result = wait_for_job(job['jobId']) print(f'Download: {result["downloadUrl"]}')
Converta Documentos em Slides
def convert_file_to_slides(file_url, prompt='', theme_id=None): """Converte PDF, DOCX, XLSX ou outros arquivos em slides.""" payload = { 'fileUrl': file_url, 'userInput': prompt, 'mode': 'async' } if theme_id: payload['themeId'] = theme_id response = requests.post( f'{BASE_URL}/slides/create-pdf-slides', headers=HEADERS, json=payload ) response.raise_for_status() job = response.json() return wait_for_job(job['jobId']) # Converte um PDF de relatório trimestral result = convert_file_to_slides( file_url='https://your-storage.com/q1-report.pdf', prompt='Resumo executivo para a diretoria, máximo de 10 slides' ) print(f'Download: {result["downloadUrl"]}')
Slides com Design Correspondente (Criar Como Este)
def create_like_this(topic, reference_image_url, resolution='2K'): """Gera slides correspondentes a um design de referência.""" payload = { 'userInput': topic, 'designStyle': { 'global': { 'referenceImageUrl': reference_image_url } }, 'resolution': resolution, 'mode': 'async' } response = requests.post( f'{BASE_URL}/slides/create-like-this', headers=HEADERS, json=payload ) response.raise_for_status() job = response.json() return wait_for_job(job['jobId']) # Corresponder ao seu modelo de marca result = create_like_this( topic='Atualização Mensal da Equipe — Março 2026', reference_image_url='https://your-brand.com/slide-template.png' )
Adicionar Narração de Voz
def add_narration(job_id, mode='single', voice='Charon', content_mode='concise'): """Adiciona narração de voz AI aos slides existentes.""" payload = { 'jobId': job_id, 'mode': mode, 'voice': voice, 'contentMode': content_mode } response = requests.post( f'{BASE_URL}/slides/generate-narration', headers=HEADERS, json=payload ) response.raise_for_status() return response.json() def download_with_audio(job_id): """Baixa slides com arquivos de áudio de voz.""" response = requests.post( f'{BASE_URL}/slides/download-slides-pages-voices', headers=HEADERS, json={'jobId': job_id} ) response.raise_for_status() return response.json()
Explorar Temas
def search_themes(query=''): """Pesquisa temas de slides disponíveis.""" params = {'query': query} if query else {} response = requests.get( f'{BASE_URL}/themes', headers=HEADERS, params=params ) response.raise_for_status() return response.json() themes = search_themes('corporativo') for theme in themes.get('themes', []): print(f"{theme['id']}: {theme['name']}")
Exemplo de Pipeline de Produção
""" Pipeline automatizado de relatório semanal. Execute via cron: 0 9 * * MON python weekly_report.py """ import json from datetime import datetime def weekly_report_pipeline(): print(f'Gerando relatório semanal: {datetime.now().isoformat()}') # 1. Gerar slides job = generate_slides( topic='''Atualização Semanal de Engenharia — Semana de 23 de março de 2026: - v2.4 implantada em produção (99,9% de uptime) - 3 novos endpoints de API lançados - Performance: latência p99 reduzida em 40% - Velocidade do sprint: 42 story points (meta: 40) - Próxima semana: migração de banco de dados, novo sistema de autenticação''', theme_id='corporate-standard-id' ) result = wait_for_job(job['jobId']) print(f'Slides prontos: {result["downloadUrl"]}') # 2. Adicionar narração add_narration(job['jobId'], mode='single', voice='Kore') print('Narração adicionada') # 3. Baixar pacote package = download_with_audio(job['jobId']) print(f'Pacote completo: {json.dumps(package, indent=2)}') return result['downloadUrl'] if __name__ == '__main__': url = weekly_report_pipeline() print(f'\nURL do Relatório: {url}')
Boas Práticas de Tratamento de Erros
from requests.exceptions import HTTPError, Timeout, ConnectionError def safe_generate(topic, retries=3): """Gerar slides com lógica de retry.""" for attempt in range(retries): try: job = generate_slides(topic) return wait_for_job(job['jobId']) except HTTPError as e: if e.response.status_code == 429: wait = 2 ** attempt * 5 # Backoff exponencial print(f'Limite de taxa atingido. Aguardando {wait}s...') time.sleep(wait) elif e.response.status_code == 402: raise Exception('Créditos insuficientes') else: raise except (Timeout, ConnectionError) as e: print(f'Erro de rede (tentativa {attempt + 1}): {e}') time.sleep(5) raise Exception(f'Falhou após {retries} tentativas')
Perguntas Frequentes
Qual versão do Python é necessária?
Python 3.7+ para f-strings e compatibilidade com
requestsPosso usar Python assíncrono (asyncio/aiohttp)?
Sim — substitua
requestsaiohttpComo lidar com trabalhos em lote grandes?
Use asyncio para executar múltiplas gerações simultaneamente, respeitando o limite de taxa (60 req/min).
Comece a automatizar — obtenha sua chave de API do 2Slides e gere apresentações a partir do Python.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free