| import os |
| import io |
| from PIL import Image |
| from fastapi import FastAPI, File, UploadFile, Form, HTTPException |
| from fastapi.middleware.cors import CORSMiddleware |
| from supabase import create_client, Client |
| from dotenv import load_dotenv |
|
|
| |
| from steg_pvd import embed_text_in_image, extract_text_from_image |
|
|
| |
| load_dotenv() |
|
|
| |
| SUPABASE_URL = os.getenv("SUPABASE_URL") |
| SUPABASE_KEY = os.getenv("SUPABASE_KEY") |
|
|
| |
| if not SUPABASE_URL or not SUPABASE_KEY: |
| raise Exception("Pastikan SUPABASE_URL dan SUPABASE_KEY ada di environment variables Anda.") |
|
|
| supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY) |
| BUCKET_NAME = "stego-images" |
|
|
| |
| app = FastAPI(title="Steganografi PVD API") |
|
|
| |
| |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| @app.get("/", summary="Root Endpoint", description="Endpoint dasar untuk mengecek apakah API berjalan.") |
| def read_root(): |
| return {"message": "Selamat datang di API Steganografi PVD"} |
|
|
| @app.post("/embed-text/", summary="Sisipkan Teks ke Gambar", description="Upload gambar cover dan masukkan teks rahasia.") |
| async def api_embed_text(cover_image: UploadFile = File(...), secret_text: str = Form(...)): |
| try: |
| cover = Image.open(io.BytesIO(await cover_image.read())) |
| stego_img = embed_text_in_image(cover, secret_text) |
|
|
| buffer = io.BytesIO() |
| stego_img.save(buffer, format="PNG") |
| buffer.seek(0) |
|
|
| |
| file_path = f"output/{cover_image.filename.split('.')[0]}_stego_text.png" |
| supabase.storage.from_(BUCKET_NAME).upload(file_path, buffer.getvalue(), {"content-type": "image/png", "x-upsert": "true"}) |
| public_url = supabase.storage.from_(BUCKET_NAME).get_public_url(file_path) |
| |
| return {"stego_image_url": public_url} |
| except Exception as e: |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
| @app.post("/extract-text/", summary="Ekstrak Teks dari Gambar", description="Upload gambar stego untuk mendapatkan teks rahasia.") |
| async def api_extract_text(stego_image: UploadFile = File(...)): |
| try: |
| stego = Image.open(io.BytesIO(await stego_image.read())) |
| secret_text = extract_text_from_image(stego) |
| return {"secret_text": secret_text} |
| except Exception as e: |
| raise HTTPException(status_code=500, detail=str(e)) |