2Slides Logo
Automatiser la Création de Présentations avec Python : Tutoriel API 2Slides
2Slides Team
4 min read

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-dotenv

Créez un fichier

.env
:

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

Dé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