Bygg · Automatisering av usynlig dukke

Automatiser uthenting av usynlig dukke for katalogen din

I én setning

Hent katalogdeltaet siden forrige kjøring, POST en product_images-matrise (hvert element en bilde-URL pluss valgfritt back_image) med én stil til /api/v1/ghost-mannequin/batch, poll batch-ID-en hvert 3. sekund til hvert element er completed eller failed, og oppdater deretter hver produktrad med sin output_url. Samtidige batcher er begrenset per plan.

  • Credits: 4 credits ved 2K · 5 credits ved 4K
  • Typisk tidsbruk: 1.5–4 min
  • Prosessering: asynkron, polling

Hvert tall på denne siden er hentet fra dokumentasjonen for Photta-API-et · verifisert

Fjern dukken fra hvert eneste PDP-bilde uten å involvere en designer. Phottas ghost-mannequin-endpoint batcher naturlig — en nattlig cron gjør en feed på 50K SKU-er om til en katalog med usynlige dukker på timer, ikke uker.

RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/ghost-mannequin \
  -H "Authorization: Bearer $PHOTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
  "back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
  "image_side": "front",
  "angle": "side",
  "style": "3d",
  "background_color": "white",
  "resolution": "2K",
  "aspect_ratio": "3:4",
  "user_instruction": "closed front, cream interior lining",
  "brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')

Slik fungerer det

Nattlig kjøring, over hele katalogen

Fem deler du trenger for en automatisering som kjører uten tilsyn.

  1. Trinn 1

    Kartlegg katalogen din

    Vit hvilke produktrader som trenger et bilde med usynlig dukke, hvilke som allerede har et, og hvilke som har begrensede kategorier. Lagre et last_photographed_at-tidsstempel slik at den nattlige jobben bare behandler deltaet.

  2. Trinn 2

    Velg 3D eller flat-lay per kategori

    `3d` for plagg som trenger volum — yttertøy, denim, skreddersydde plagg. `flat_lay` for tilbehør og strikkevarer som fotograferes bedre flatt. Lagre stilen per produktkategori slik at batch-byggeren velger riktig uten manuell justering.

  3. Trinn 3

    Send deltaet i batch

    POST /api/v1/ghost-mannequin/batch med en product_images-matrise — hvert element inneholder image, valgfritt back_image og image_side — pluss én style, background_color og resolution for hele batchen. Hold din egen kobling fra matriseposisjon til produkt-ID; responsen returnerer én generasjons-ID per element i samme rekkefølge.

  4. Trinn 4

    Poll den overordnede batchen

    Batch-endpointet returnerer aggregerte tellere (total, processing, completed, failed). Poll hvert 3. sekund til completed + failed er lik total. Photta behandler elementer parallelt i batchen, så du slipper å polle individuelle genereringer.

  5. Trinn 5

    Lagre i databasen din

    Iterer over status.data.items i rekkefølge — batchen bevarer matriserekkefølgen din — og oppdater hver produktrad med sin output_url. Loggfør feil — de peker nesten alltid mot et dårlig kildebilde i feeden din, som du kan rette opp og sende inn på nytt ved neste kjøring.

Tre steg i Python

Delta-uthenting, batch-innsending, overordnet polling — den minste levedyktige katalogautomatiseringen.

from datetime import datetime, timedelta

yesterday = datetime.utcnow() - timedelta(days=1)
rows = db.execute(
    "SELECT id, source_image_url FROM products WHERE updated_at > %s",
    (yesterday,),
).fetchall()
import os, requests

res = requests.post(
    "https://api.photta.app/api/v1/ghost-mannequin/batch",
    headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
    json={
      "product_images": [
        {
          "image": "https://cdn.yourstore.com/products/jacket-front.jpg",
          "back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
          "image_side": "front"
        },
        {
          "image": "https://cdn.yourstore.com/products/shirt-front.jpg",
          "image_side": "front"
        },
        {
          "image": "https://cdn.yourstore.com/products/trousers-front.jpg",
          "image_side": "front"
        }
      ],
      "style": "3d",
      "background_color": "white",
      "resolution": "2K",
      "aspect_ratio": "3:4",
      "user_instruction": "closed front, buttoned up",
      "brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
    },
)
data = res.json()["data"]  # data["id"], data["status"]
import os, time, requests

BASE = "https://api.photta.app/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"}
# data["items"] comes back in the order of the product_images you submitted.
batch_id = data["batch_id"]
for _ in range(240):  # 240 × 3s = 12 minutes
    status = requests.get(f"{BASE}/ghost-mannequin/batch/{batch_id}", headers=HEADERS).json()["data"]
    if status["completed"] + status["failed"] == status["total"]:
        break
    time.sleep(3)

for row, item in zip(rows, status["items"]):
    if item["status"] == "completed":
        db.execute(
            "UPDATE products SET ghost_image_url = %s WHERE id = %s",
            (item["output_url"], row.id),
        )

Spørsmål utviklere stiller

Kjøre usynlig dukke i katalogskala

Hvor stor kan en enkelt batch være?

Batch-endpointet godtar opptil noen hundre elementer per kall ifølge dokumentasjonen. For en nattlig kjøring på 50K SKU-er bør du dele deltaet opp i batcher på 100–200 og sende dem sekvensielt, slik at du holder deg godt under planens rate limit.

Kan en batch blande 3D og flat-lay?

Ja — style er et felt per element, så en enkelt batch kan inneholde begge deler. I praksis deler de fleste team opp etter kategori uansett, fordi den påfølgende lagringslogikken er enklere når hver rad i en batch havner i samme databasekolonne.

Hva skjer med mislykkede elementer?

Mislykkede elementer i en batch refunderer automatisk sine credits og har en error_code + error_message i elementets endelige payload. Loggfør feilene og prøv dem på nytt neste natt, etter at teamet ditt har hatt mulighet til å fikse kildebildet eller merke raden som permanent-ugyldige-data.

Hvordan kobler jeg resultatene tilbake til mine produkt-ID-er?

Hold din egen kobling fra matriseposisjon til produkt-ID når du sender inn: batch-responsen returnerer én generasjons-ID per element i samme rekkefølge som product_images, og batch-statusen lister også opp elementene i den rekkefølgen.

Kan jeg planlegge dette som en daglig cron-jobb?

Ja — en enkel daglig cron-jobb som henter deltaet for de siste 24 timene, deler det opp i chunks, sender inn batcher og skriver resultatene til databasen din, er et bærende mønster for team med katalogskala. Sørg for at runneren er idempotent, slik at en feilet nattkjøring kan spilles av på nytt på en trygg måte.

Lever usynlig dukke i katalogskala i kveld

Tre Python-funksjoner, én cron-jobb, 50K bilder. Skaff deg en API-nøkkel og rett den mot katalogen din.