2Slides Logo
Automatizzare la Generazione di Presentazioni con Python: Tutorial API 2Slides
2Slides Team
4 min read

Automatizzare la Generazione di Presentazioni con Python: Tutorial sull'API 2Slides

Python è il linguaggio di riferimento per l'automazione, le pipeline di dati e i flussi di lavoro AI. Questo tutorial ti mostra come utilizzare la REST API di 2Slides da Python per generare presentazioni automaticamente — da semplici diapositive singole a complesse pipeline automatizzate.

Prerequisiti

pip install requests python-dotenv

Crea un file

.env
:

TWOSLIDES_API_KEY=sk-2slides-your-api-key

Avvio Rapido: Genera le Tue Prime Diapositive

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'): """Genera una presentazione da un argomento testuale.""" 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): """Esegue il polling finché un job non è completato.""" 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' Job {job_id}: {status}') if status == 'success': return data if status == 'failed': raise Exception(f'Job fallito: {data}') time.sleep(interval) raise TimeoutError(f'Il job {job_id} è scaduto dopo {timeout}s') # Genera una presentazione job = generate_slides('Top 10 AI Trends for 2026') print(f'ID Job: {job["jobId"]}') result = wait_for_job(job['jobId']) print(f'Download: {result["downloadUrl"]}')

Converti Documenti in Diapositive

def convert_file_to_slides(file_url, prompt='', theme_id=None): """Converte file PDF, DOCX, XLSX o altri file in diapositive.""" 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']) # Converti un report trimestrale PDF result = convert_file_to_slides( file_url='https://your-storage.com/q1-report.pdf', prompt='Executive summary for the board, 10 slides max' ) print(f'Download: {result["downloadUrl"]}')

Diapositive con Design Corrispondente (Crea Come Questo)

def create_like_this(topic, reference_image_url, resolution='2K'): """Genera diapositive che corrispondono a un design di riferimento.""" 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']) # Abbina il tuo template di brand result = create_like_this( topic='Monthly Team Update — March 2026', reference_image_url='https://your-brand.com/slide-template.png' )

Aggiungi Narrazione Vocale

def add_narration(job_id, mode='single', voice='Charon', content_mode='concise'): """Aggiunge narrazione vocale AI a diapositive esistenti.""" 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): """Scarica diapositive con file audio vocali.""" response = requests.post( f'{BASE_URL}/slides/download-slides-pages-voices', headers=HEADERS, json={'jobId': job_id} ) response.raise_for_status() return response.json()

Sfoglia Temi

def search_themes(query=''): """Cerca temi di diapositive disponibili.""" 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('corporate') for theme in themes.get('themes', []): print(f"{theme['id']}: {theme['name']}")

Esempio di Pipeline di Produzione

""" Pipeline automatizzata per il report settimanale. Esegui tramite cron: 0 9 * * MON python weekly_report.py """ import json from datetime import datetime def weekly_report_pipeline(): print(f'Generazione report settimanale: {datetime.now().isoformat()}') # 1. Genera diapositive job = generate_slides( topic='''Weekly Engineering Update — Week of March 23, 2026: - Deployed v2.4 to production (99.9% uptime) - 3 new API endpoints shipped - Performance: p99 latency down 40% - Sprint velocity: 42 story points (target: 40) - Next week: database migration, new auth system''', theme_id='corporate-standard-id' ) result = wait_for_job(job['jobId']) print(f'Diapositive pronte: {result["downloadUrl"]}') # 2. Aggiungi narrazione add_narration(job['jobId'], mode='single', voice='Kore') print('Narrazione aggiunta') # 3. Scarica il pacchetto package = download_with_audio(job['jobId']) print(f'Pacchetto completo: {json.dumps(package, indent=2)}') return result['downloadUrl'] if __name__ == '__main__': url = weekly_report_pipeline() print(f'\nURL Report: {url}')

Migliori Pratiche per la Gestione degli Errori

from requests.exceptions import HTTPError, Timeout, ConnectionError def safe_generate(topic, retries=3): """Genera diapositive con logica di 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 # Exponential backoff print(f'Limite di richieste raggiunto. Attendo {wait}s...') time.sleep(wait) elif e.response.status_code == 402: raise Exception('Crediti insufficienti') else: raise except (Timeout, ConnectionError) as e: print(f'Errore di rete (tentativo {attempt + 1}): {e}') time.sleep(5) raise Exception(f'Fallito dopo {retries} tentativi')

Domande Frequenti

Quale versione di Python è richiesta?

Python 3.7+ per le f-strings e la compatibilità con

requests
.

Posso usare Python asincrono (asyncio/aiohttp)?

Sì — sostituisci

requests
con
aiohttp
per le chiamate HTTP asincrone. Il pattern di polling funziona allo stesso modo.

Come gestisco grandi batch di job?

Usa asyncio per eseguire più generazioni contemporaneamente, rispettando il rate limit (60 req/min).


Inizia ad automatizzare — ottieni la tua chiave API 2Slides e genera presentazioni da Python.

About 2Slides

Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.

Try For Free