
2Slides Team
4 min read

Python은 자동화, 데이터 파이프라인, AI 워크플로우를 위한 최고의 언어입니다. 이 튜토리얼에서는 Python에서 2Slides REST API를 사용하여 간단한 일회성 슬라이드부터 복잡한 자동화 파이프라인에 이르기까지 프레젠테이션을 자동으로 생성하는 방법을 보여줍니다.
pip install requests python-dotenv
.envTWOSLIDES_API_KEY=sk-2slides-your-api-key
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'): """텍스트 주제로 프레젠테이션을 생성합니다.""" 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): """작업이 완료될 때까지 폴링합니다.""" 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 failed: {data}') time.sleep(interval) raise TimeoutError(f'Job {job_id} timed out after {timeout}s') # 프레젠테이션 생성 job = generate_slides('Top 10 AI Trends for 2026') print(f'작업 ID: {job["jobId"]}') result = wait_for_job(job['jobId']) print(f'다운로드: {result["downloadUrl"]}')
def convert_file_to_slides(file_url, prompt='', theme_id=None): """PDF, DOCX, XLSX 또는 기타 파일을 슬라이드로 변환합니다.""" 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']) # 분기별 보고서 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'다운로드: {result["downloadUrl"]}')
def create_like_this(topic, reference_image_url, resolution='2K'): """참조 디자인과 일치하는 슬라이드를 생성합니다.""" 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']) # 브랜드 템플릿과 일치시키기 result = create_like_this( topic='Monthly Team Update — March 2026', reference_image_url='https://your-brand.com/slide-template.png' )
def add_narration(job_id, mode='single', voice='Charon', content_mode='concise'): """기존 슬라이드에 AI 음성 내레이션을 추가합니다.""" 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): """음성 오디오 파일이 포함된 슬라이드를 다운로드합니다.""" response = requests.post( f'{BASE_URL}/slides/download-slides-pages-voices', headers=HEADERS, json={'jobId': job_id} ) response.raise_for_status() return response.json()
def search_themes(query=''): """사용 가능한 슬라이드 테마를 검색합니다.""" 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']}")
""" 자동화된 주간 보고서 파이프라인. cron을 통해 실행: 0 9 * * MON python weekly_report.py """ import json from datetime import datetime def weekly_report_pipeline(): print(f'주간 보고서 생성 중: {datetime.now().isoformat()}') # 1. 슬라이드 생성 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'슬라이드 준비 완료: {result["downloadUrl"]}') # 2. 내레이션 추가 add_narration(job['jobId'], mode='single', voice='Kore') print('내레이션 추가됨') # 3. 패키지 다운로드 package = download_with_audio(job['jobId']) print(f'전체 패키지: {json.dumps(package, indent=2)}') return result['downloadUrl'] if __name__ == '__main__': url = weekly_report_pipeline() print(f'\n보고서 URL: {url}')
from requests.exceptions import HTTPError, Timeout, ConnectionError def safe_generate(topic, retries=3): """재시도 로직으로 슬라이드를 생성합니다.""" 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'속도 제한됨. {wait}초 대기 중...') time.sleep(wait) elif e.response.status_code == 402: raise Exception('크레딧 부족') else: raise except (Timeout, ConnectionError) as e: print(f'네트워크 오류 (시도 {attempt + 1}): {e}') time.sleep(5) raise Exception(f'{retries}번의 재시도 후 실패')
f-string 및
requests네, 비동기 HTTP 호출을 위해
requestsaiohttpasyncio를 사용하여 속도 제한(분당 60회 요청)을 준수하면서 여러 생성을 동시에 실행하세요.
자동화를 시작하세요 — 2Slides API 키를 받고 Python으로 프레젠테이션을 생성하세요.
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For FreeYour AI Agent for slides. Save time, shine faster with intelligent presentation creation.
All services online© 2026 2slides. All rights reserved.