2Slides Logo
Tự Động Hóa Tạo Bài Thuyết Trình với Python: Hướng Dẫn API 2Slides
2Slides Team
5 min read

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

Tạo file

.env
:

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

Bắ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