2Slides Logo
Automatyzacja tworzenia prezentacji w Pythonie: Tutorial API 2Slides
2Slides Team
4 min read

Automatyzacja generowania prezentacji z Python: Tutorial API 2Slides

Python to język idealny do automatyzacji, potoków danych i przepływów pracy AI. Ten tutorial pokazuje, jak używać REST API 2Slides z poziomu Pythona do automatycznego generowania prezentacji — od prostych pojedynczych slajdów po złożone zautomatyzowane potoki.

Wymagania wstępne

pip install requests python-dotenv

Utwórz plik

.env
:

TWOSLIDES_API_KEY=sk-2slides-twoj-klucz-api

Szybki start: Wygeneruj swoje pierwsze slajdy

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'): """Generuje prezentację z tematu tekstowego.""" payload = { 'userInput': topic, 'mode': mode, 'responseLanguage': 'pl', '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): """Odpytuje do momentu zakończenia zadania.""" 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' Zadanie {job_id}: {status}') if status == 'success': return data if status == 'failed': raise Exception(f'Zadanie nie powiodło się: {data}') time.sleep(interval) raise TimeoutError(f'Zadanie {job_id} przekroczyło limit czasu {timeout}s') # Generowanie prezentacji job = generate_slides('10 najważniejszych trendów AI na 2026 rok') print(f'ID zadania: {job["jobId"]}') result = wait_for_job(job['jobId']) print(f'Pobierz: {result["downloadUrl"]}')

Konwertowanie dokumentów na slajdy

def convert_file_to_slides(file_url, prompt='', theme_id=None): """Konwertuje pliki PDF, DOCX, XLSX lub inne na slajdy.""" 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']) # Konwersja raportu kwartalnego PDF result = convert_file_to_slides( file_url='https://twoja-przestrzen.com/raport-q1.pdf', prompt='Podsumowanie zarządcze dla zarządu, maksymalnie 10 slajdów' ) print(f'Pobierz: {result["downloadUrl"]}')

Slajdy dopasowane do wzorca (Utwórz w tym stylu)

def create_like_this(topic, reference_image_url, resolution='2K'): """Generuj slajdy dopasowane do wzorcowego projektu.""" 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']) # Dopasuj do szablonu Twojej marki result = create_like_this( topic='Miesięczna aktualizacja zespołu — Marzec 2026', reference_image_url='https://your-brand.com/slide-template.png' )

Dodaj narrację głosową

def add_narration(job_id, mode='single', voice='Charon', content_mode='concise'): """Dodaj narrację głosową AI do istniejących slajdów.""" 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): """Pobierz slajdy z plikami audio narracji.""" response = requests.post( f'{BASE_URL}/slides/download-slides-pages-voices', headers=HEADERS, json={'jobId': job_id} ) response.raise_for_status() return response.json()

Przeglądaj motywy

def search_themes(query=''): """Wyszukaj dostępne motywy slajdów.""" 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']}")

Przykład Pipeline'u Produkcyjnego

""" Automatyczny pipeline raportów tygodniowych. Uruchamiany przez cron: 0 9 * * MON python weekly_report.py """ import json from datetime import datetime def weekly_report_pipeline(): print(f'Generowanie raportu tygodniowego: {datetime.now().isoformat()}') # 1. Wygeneruj slajdy job = generate_slides( topic='''Cotygodniowa Aktualizacja Inżynierska — Tydzień 23 marca 2026: - Wdrożono v2.4 na produkcję (99.9% uptime) - 3 nowe endpointy API dostarczone - Wydajność: p99 latencja spadła o 40% - Prędkość sprintu: 42 story points (cel: 40) - Następny tydzień: migracja bazy danych, nowy system auth''', theme_id='corporate-standard-id' ) result = wait_for_job(job['jobId']) print(f'Slajdy gotowe: {result["downloadUrl"]}') # 2. Dodaj narrację add_narration(job['jobId'], mode='single', voice='Kore') print('Narracja dodana') # 3. Pobierz pakiet package = download_with_audio(job['jobId']) print(f'Pełny pakiet: {json.dumps(package, indent=2)}') return result['downloadUrl'] if __name__ == '__main__': url = weekly_report_pipeline() print(f'\nURL raportu: {url}')

Najlepsze Praktyki Obsługi Błędów

from requests.exceptions import HTTPError, Timeout, ConnectionError def safe_generate(topic, retries=3): """Generuj slajdy z logiką ponownych prób.""" 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 # Wykładniczy backoff print(f'Ograniczenie częstotliwości. Czekanie {wait}s...') time.sleep(wait) elif e.response.status_code == 402: raise Exception('Niewystarczająca liczba kredytów') else: raise except (Timeout, ConnectionError) as e: print(f'Błąd sieci (próba {attempt + 1}): {e}') time.sleep(5) raise Exception(f'Niepowodzenie po {retries} próbach')

Najczęściej Zadawane Pytania

Jaka wersja Python jest wymagana?

Python 3.7+ dla kompatybilności z f-strings i

requests
.

Czy mogę używać asynchronicznego Python (asyncio/aiohttp)?

Tak — zamień

requests
na
aiohttp
dla asynchronicznych wywołań HTTP. Wzorzec pollingu działa w ten sam sposób.

Jak obsługiwać duże zadania wsadowe?

Użyj asyncio do równoczesnego uruchamiania wielu generacji, respektując limit częstotliwości (60 żądań/min).


Zacznij automatyzować — uzyskaj swój klucz API 2Slides i generuj prezentacje z Python.

About 2Slides

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

Try For Free