

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-dotenvCrea un file .env:
TWOSLIDES_API_KEY=sk-2slides-your-api-keyAvvio 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