← Volver al catálogo

🖼️ FB Cover Now (portada de Facebook)

Archivo: agentes/marketing/fb-cover-now.ts · Plist: _(ninguno)_ · Horario: Manual / one-shot (se ejecuta a mano cuando se quiere refrescar la portada)

Qué hace

Genera una nueva imagen de portada cinematográfica para la página de Facebook de RifKings y la publica como cover. Crea una foto editorial 16:9 con fal.ai (flux/schnell), le superpone con sharp un overlay de marca (gradientes, barra dorada, logo RIFKINGS, tagline "Tu ciudad. Tu ritmo. Tu patinete.", bullets de valor y la URL), sube la imagen a la página y la fija como portada vía Graph API.

Cómo funciona

1. Carga .env (page id/token Meta, fal key).

2. falImage(): encola un job en fal-ai/flux/schnell (landscape_16_9, 4 steps), hace polling hasta COMPLETED y devuelve la URL.

3. compose(): descarga la imagen, la redimensiona a 1640×624, compone un SVG overlay editorial y exporta JPG a data/content-tmp/.

4. Sube la foto a /{PAGE_ID}/photos con published=false.

5. Hace POST /{PAGE_ID}?cover=<foto_id> para asignarla como portada. Imprime el enlace a la página.

Datos/APIs

  • fal.ai (fal-ai/flux/schnell) para la imagen base.
  • sharp (composición local del overlay SVG).
  • Meta Graph API v21.0 (subir foto + set cover).
  • Vars .env: META_PAGE_ID (default 112610281241802), META_PAGE_TOKEN, FAL_API_KEY.

Cómo probarlo

cd /Users/user/rifai-agents && npx tsx agentes/marketing/fb-cover-now.ts

Espera: "Generando imagen cinemática", imagen base generada, portada compuesta en data/content-tmp/fb-cover-v2-*.jpg, foto subida con ID y "Portada v2 activa en FB". Nota: publica de verdad la portada en la página real.

Si se rompe / recuperar

  • Sin plist (acción puntual). Si fal.ai falla → process.exit(1) con "fal.ai falló": reintentar.
  • Si el upload o el set-cover fallan, imprime el error de Graph API (revisar validez de META_PAGE_TOKEN).
  • Logs: solo stdout; redirigir a /Users/user/rifai-agents/logs/fb-cover-now.log si se desea.

Cómo replicarlo

  • fal.ai flux/schnell para una imagen 16:9 con prompt cinematográfico de patinete (no moto).
  • sharp: resize cover + composite de un SVG con marca/tagline/bullets/URL.
  • Graph API: POST /photos (published=false) → POST /{page}?cover=<id>.