Logo 2Slides
Automatizar a Geração de Apresentações com Python: Tutorial da API 2Slides
2Slides Team
4 min read

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 .env:

TWOSLIDES_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 requests.

Posso usar Python assíncrono (asyncio/aiohttp)?

Sim — substitua requests por aiohttp para chamadas HTTP assíncronas. O padrão de polling funciona da mesma forma.

Como 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
2Slides logo

Seu Agente IA para slides. Economize tempo, brilhe mais rápido com criação inteligente de apresentações.

Resumir com IA

ChatGPTClaudeGrokPerplexity
Todos os serviços online

Recursos

Comparação

Galeria

Recursos

Comparação

Galeria

© 2026 2slides. Todos os direitos reservados.