Logo 2Slides
Otomatisasi Pembuatan Presentasi dengan Python: Tutorial API 2Slides
2Slides Team
4 min read

Otomatisasi Pembuatan Presentasi dengan Python: Tutorial API 2Slides

Python adalah bahasa pilihan untuk otomatisasi, pipeline data, dan alur kerja AI. Tutorial ini menunjukkan cara menggunakan REST API 2Slides dari Python untuk menghasilkan presentasi secara otomatis — dari slide sederhana sekali pakai hingga pipeline otomatis yang kompleks.

Prasyarat

pip install requests python-dotenv

Buat file .env:

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

Panduan Cepat: Buat Slide Pertama Anda

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'): """Buat presentasi dari topik teks.""" 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): """Polling hingga job selesai.""" 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 gagal: {data}') time.sleep(interval) raise TimeoutError(f'Job {job_id} timeout setelah {timeout}s') # Buat presentasi job = generate_slides('10 Tren AI Teratas untuk 2026') print(f'Job ID: {job["jobId"]}') result = wait_for_job(job['jobId']) print(f'Unduh: {result["downloadUrl"]}')

Konversi Dokumen ke Slide

def convert_file_to_slides(file_url, prompt='', theme_id=None): """Konversi file PDF, DOCX, XLSX, atau file lainnya ke 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']) # Konversi PDF laporan triwulanan result = convert_file_to_slides( file_url='https://your-storage.com/q1-report.pdf', prompt='Ringkasan eksekutif untuk dewan direksi, maksimal 10 slide' ) print(f'Unduh: {result["downloadUrl"]}')

Slide Desain-yang-Cocok (Buat Seperti Ini)

def create_like_this(topic, reference_image_url, resolution='2K'): """Hasilkan slide yang sesuai dengan desain referensi.""" 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']) # Sesuaikan dengan template brand Anda result = create_like_this( topic='Pembaruan Tim Bulanan — Maret 2026', reference_image_url='https://your-brand.com/slide-template.png' )

Tambahkan Narasi Suara

def add_narration(job_id, mode='single', voice='Charon', content_mode='concise'): """Tambahkan narasi suara AI ke slide yang sudah ada.""" 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): """Unduh slide dengan file audio suara.""" response = requests.post( f'{BASE_URL}/slides/download-slides-pages-voices', headers=HEADERS, json={'jobId': job_id} ) response.raise_for_status() return response.json()

Jelajahi Tema

def search_themes(query=''): """Cari tema slide yang tersedia.""" 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']}")

Contoh Pipeline Produksi

""" Pipeline laporan mingguan otomatis. Jalankan via cron: 0 9 * * MON python weekly_report.py """ import json from datetime import datetime def weekly_report_pipeline(): print(f'Membuat laporan mingguan: {datetime.now().isoformat()}') # 1. Generate slide job = generate_slides( topic='''Pembaruan Engineering Mingguan — Minggu 23 Maret 2026: - Deploy v2.4 ke produksi (uptime 99,9%) - 3 endpoint API baru dirilis - Performa: latensi p99 turun 40% - Velocity sprint: 42 story points (target: 40) - Minggu depan: migrasi database, sistem auth baru''', theme_id='corporate-standard-id' ) result = wait_for_job(job['jobId']) print(f'Slide siap: {result["downloadUrl"]}') # 2. Tambahkan narasi add_narration(job['jobId'], mode='single', voice='Kore') print('Narasi ditambahkan') # 3. Unduh paket package = download_with_audio(job['jobId']) print(f'Paket lengkap: {json.dumps(package, indent=2)}') return result['downloadUrl'] if __name__ == '__main__': url = weekly_report_pipeline() print(f'\nURL Laporan: {url}')

Best Practice Penanganan Error

from requests.exceptions import HTTPError, Timeout, ConnectionError def safe_generate(topic, retries=3): """Generate slide dengan logika 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'Rate limited. Menunggu {wait}s...') time.sleep(wait) elif e.response.status_code == 402: raise Exception('Kredit tidak mencukupi') else: raise except (Timeout, ConnectionError) as e: print(f'Error jaringan (percobaan {attempt + 1}): {e}') time.sleep(5) raise Exception(f'Gagal setelah {retries} percobaan')

Pertanyaan yang Sering Diajukan

Versi Python apa yang diperlukan?

Python 3.7+ untuk kompatibilitas f-string dan requests.

Bisakah saya menggunakan async Python (asyncio/aiohttp)?

Ya — ganti requests dengan aiohttp untuk HTTP call async. Pola polling-nya tetap sama.

Bagaimana cara menangani batch job besar?

Gunakan asyncio untuk menjalankan beberapa generasi secara bersamaan, dengan tetap menghormati rate limit (60 req/menit).


Mulai otomatisasi — dapatkan API key 2Slides Anda dan buat presentasi dari Python.

About 2Slides

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

Try For Free
2Slides logo

Agen AI Anda untuk slide. Hemat waktu, bersinar lebih cepat dengan pembuatan presentasi yang cerdas.

Ringkas dengan AI

ChatGPTClaudeGrokPerplexity
Semua layanan online

© 2026 2slides. Hak cipta dilindungi.