🖼️ 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(default112610281241802),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.logsi 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>.