

Tự động hóa Tạo Bản trình bày với Python: Hướng dẫn API 2Slides
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.
Yêu cầu
pip install requests python-dotenvTạo file .env:
TWOSLIDES_API_KEY=sk-2slides-your-api-keyBắt đầu nhanh: Tạo Slide đầu tiên của bạn
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"]}')Chuyển đổi Tài liệu sang Slide
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"]}')Slide Khớp Thiết Kế (Tạo Giống Như Thế Này)
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'
)Thêm Lồng Tiếng
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()Duyệt Chủ Đề
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']}")Ví dụ Pipeline Sản xuất
"""
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}')Best Practices Xử lý Lỗi
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ử')Câu hỏi Thường gặp
Phiên bản Python nào được yêu cầu?
Python 3.7+ cho khả năng tương thích f-strings và requests.
Tôi có thể sử dụng async Python (asyncio/aiohttp) không?
Có — thay thế requests bằng aiohttp cho các HTTP calls bất đồng bộ. Pattern polling hoạt động giống nhau.
Làm thế nào để xử lý các batch jobs lớn?
Sử 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.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free