

Automatiser la génération de présentations avec Python : Tutoriel de l'API 2Slides
Python est le langage de prédilection pour l'automatisation, les pipelines de données et les workflows d'IA. Ce tutoriel vous montrera comment utiliser l'API REST de 2Slides avec Python pour générer des présentations automatiquement — des diapositives uniques et simples aux pipelines automatisés complexes.
Prérequis
pip install requests python-dotenvCréez un fichier .env :
TWOSLIDES_API_KEY=sk-2slides-your-api-keyDémarrage Rapide : Générez Vos Premières Diapositives
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'):
"""Génère une présentation à partir d'un sujet textuel."""
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):
"""Interroge l'API jusqu'à ce qu'une tâche soit terminée."""
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' Tâche {job_id} : {status}')
if status == 'success':
return data
if status == 'failed':
raise Exception(f'La tâche a échoué : {data}')
time.sleep(interval)
raise TimeoutError(f'La tâche {job_id} a expiré après {timeout}s')
# Générer une présentation
job = generate_slides('Top 10 AI Trends for 2026')
print(f'ID de la tâche : {job["jobId"]}')
result = wait_for_job(job['jobId'])
print(f'Téléchargement : {result["downloadUrl"]}')Convertir des Documents en Diapositives
def convert_file_to_slides(file_url, prompt='', theme_id=None):
"""Convertit des fichiers PDF, DOCX, XLSX ou autres en diapositives."""
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'])
# Convertir un rapport trimestriel 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'Téléchargement : {result["downloadUrl"]}')Diapositives au Design Assorti (Créer comme ceci)
def create_like_this(topic, reference_image_url, resolution='2K'):
"""Génère des diapositives correspondant à un design de référence."""
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'])
# Faire correspondre votre modèle de marque
result = create_like_this(
topic='Monthly Team Update — March 2026',
reference_image_url='https://your-brand.com/slide-template.png'
)Ajouter une Narration Vocale
def add_narration(job_id, mode='single', voice='Charon', content_mode='concise'):
"""Ajoute une narration vocale IA aux diapositives existantes."""
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):
"""Télécharge les diapositives avec les fichiers audio vocaux."""
response = requests.post(
f'{BASE_URL}/slides/download-slides-pages-voices',
headers=HEADERS,
json={'jobId': job_id}
)
response.raise_for_status()
return response.json()Parcourir les Thèmes
def search_themes(query=''):
"""Recherche les thèmes de diapositives disponibles."""
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']}")Exemple de Pipeline de Production
"""
Pipeline de rapport hebdomadaire automatisé.
Exécuter via cron : 0 9 * * MON python weekly_report.py
"""
import json
from datetime import datetime
def weekly_report_pipeline():
print(f'Génération du rapport hebdomadaire : {datetime.now().isoformat()}')
# 1. Générer les diapositives
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'Diapositives prêtes : {result["downloadUrl"]}')
# 2. Ajouter la narration
add_narration(job['jobId'], mode='single', voice='Kore')
print('Narration ajoutée')
# 3. Télécharger le package
package = download_with_audio(job['jobId'])
print(f'Package complet : {json.dumps(package, indent=2)}')
return result['downloadUrl']
if __name__ == '__main__':
url = weekly_report_pipeline()
print(f'\nURL du rapport : {url}')Bonnes Pratiques de Gestion des Erreurs
from requests.exceptions import HTTPError, Timeout, ConnectionError
def safe_generate(topic, retries=3):
"""Génère des diapositives avec une logique de réessai."""
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 de débit atteinte. Attente de {wait}s...')
time.sleep(wait)
elif e.response.status_code == 402:
raise Exception('Crédits insuffisants')
else:
raise
except (Timeout, ConnectionError) as e:
print(f'Erreur réseau (tentative {attempt + 1}) : {e}')
time.sleep(5)
raise Exception(f'Échec après {retries} tentatives')Foire Aux Questions
Quelle version de Python est requise ?
Python 3.7+ pour les f-strings et la compatibilité avec requests.
Puis-je utiliser Python asynchrone (asyncio/aiohttp) ?
Oui — remplacez requests par aiohttp pour les appels HTTP asynchrones. Le modèle d'interrogation fonctionne de la même manière.
Comment gérer les tâches par lots importantes ?
Utilisez asyncio pour exécuter plusieurs générations simultanément, en respectant la limite de débit (60 req/min).
Commencez à automatiser — obtenez votre clé API 2Slides et générez des présentations avec Python.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free