
2Slides Team
5 min read

Python là ngôn ngữ được ưa chuộng cho tự động hóa, data pipeline và quy trình làm việc với AI. Hướng dẫn này chỉ cho bạn cách sử dụng REST API của 2Slides từ Python để tạo bản trình bày tự động — từ các slide đơn giản đến các quy trình tự động phức tạp.
pip install requests python-dotenv
Tạo file
.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'): """Tạo bản trình bày từ chủ đề văn bản.""" 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): """Kiểm tra định kỳ cho đến khi công việc hoàn thành.""" 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') # Tạo một bản trình bày job = generate_slides('Top 10 xu hướng AI năm 2026') print(f'Job ID: {job["jobId"]}') result = wait_for_job(job['jobId']) print(f'Download: {result["downloadUrl"]}')
def convert_file_to_slides(file_url, prompt='', theme_id=None): """Chuyển đổi file PDF, DOCX, XLSX hoặc các file khác thành slide.""" 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']) # Chuyển đổi file PDF báo cáo quý result = convert_file_to_slides( file_url='https://your-storage.com/q1-report.pdf', prompt='Tóm tắt điều hành cho hội đồng quản trị, tối đa 10 slide' ) print(f'Download: {result["downloadUrl"]}')
def create_like_this(topic, reference_image_url, resolution='2K'): """Tạo slide khớp với thiết kế mẫu.""" 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']) # Khớp với mẫu thương hiệu của bạn result = create_like_this( topic='Cập Nhật Nhóm Hàng Tháng — Tháng 3 năm 2026', reference_image_url='https://your-brand.com/slide-template.png' )
def add_narration(job_id, mode='single', voice='Charon', content_mode='concise'): """Thêm lồng tiếng AI vào slide hiện có.""" 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ải slide với các tệp âm thanh lồng tiếng.""" 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=''): """Tìm kiếm các chủ đề slide có sẵn.""" 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']}")
""" Pipeline báo cáo tuần tự động. Chạy qua cron: 0 9 * * MON python weekly_report.py """ import json from datetime import datetime def weekly_report_pipeline(): print(f'Đang tạo báo cáo tuần: {datetime.now().isoformat()}') # 1. Tạo slides job = generate_slides( topic='''Cập nhật Kỹ thuật Hàng tuần — Tuần 23 tháng 3, 2026: - Đã triển khai v2.4 lên production (99.9% uptime) - 3 API endpoints mới được phát hành - Hiệu suất: p99 latency giảm 40% - Tốc độ Sprint: 42 story points (mục tiêu: 40) - Tuần sau: migration database, hệ thống auth mới''', theme_id='corporate-standard-id' ) result = wait_for_job(job['jobId']) print(f'Slides đã sẵn sàng: {result["downloadUrl"]}') # 2. Thêm thuyết minh add_narration(job['jobId'], mode='single', voice='Kore') print('Đã thêm thuyết minh') # 3. Tải gói xuống package = download_with_audio(job['jobId']) print(f'Gói đầy đủ: {json.dumps(package, indent=2)}') return result['downloadUrl'] if __name__ == '__main__': url = weekly_report_pipeline() print(f'\nURL Báo cáo: {url}')
from requests.exceptions import HTTPError, Timeout, ConnectionError def safe_generate(topic, retries=3): """Tạo slides với logic 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'Bị giới hạn tốc độ. Đang chờ {wait}s...') time.sleep(wait) elif e.response.status_code == 402: raise Exception('Không đủ credits') else: raise except (Timeout, ConnectionError) as e: print(f'Lỗi mạng (lần thử {attempt + 1}): {e}') time.sleep(5) raise Exception(f'Thất bại sau {retries} lần thử')
Python 3.7+ cho khả năng tương thích f-strings và
requestsCó — thay thế
requestsaiohttpSử dụng asyncio để chạy nhiều generations đồng thời, tuân thủ giới hạn tốc độ (60 req/phút).
Bắt đầu tự động hóa — lấy API key 2Slides của bạn và tạo presentations từ 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.
© 2026 2slides. All rights reserved.