← Volver al catálogo

🔍 SEO Engine (SEO productos + Blog v1)

Archivo: /Users/user/rifai-agents/agentes/content/seo-blog.ts · Plist: com.rifai.seo-engine · Horario: todos los días a las 8:00 (Europe/Madrid, StartCalendarInterval Hour=8 Min=0)

> Este es el motor SEO en producción. Las versiones seo-blog-v2.ts y seo-blog-v3.ts (más visuales) NO tienen plist y no corren solas.

Qué hace

Motor SEO diario con dos modos según el día de la semana. Lun/Mié/Vie: optimiza el SEO de 3 productos top de Shopify (meta-title, meta-description, body_html y alt-texts generados por IA). Mar/Jue/Sáb: genera y publica un artículo de blog completo (1500-2000 palabras, HTML editorial estilo Wirecutter/Monocle, con imágenes fal.ai y product cards) en el blog "news" de Shopify. Domingo: descanso. Cada modo notifica al bot SEO (Sergio) por Telegram.

Cómo funciona

Arranque: carga .env, calcula el día de Madrid, lee estado (data/seo-engine-state.json). Flags FORCE_BLOG=1 / FORCE_SEO=1 fuerzan modo.

Modo SEO productos (actualizarSeoProductos): por cada uno de 3 productos rotativos (TOP_PRODUCT_IDS), pide a gemini-cli (sonnet) un JSON con meta_title, meta_description, body_html y alt_texts; hace PUT a Shopify del producto (incluye metafields_global_title_tag/description_tag) y PUT de los alt-texts de las imágenes.

Modo BLOG (generarBlog): elige un topic de BLOG_TOPICS (evitando los 5 últimos), busca productos relevantes vía GraphQL Shopify, genera 3 imágenes lifestyle con fal.ai (flux/schnell), pide el artículo HTML a gemini-cli (sonnet, 16k tokens) con plantilla fija (lede, tldr, H2s, tabla, FAQ, CTA), sustituye {{IMG_n}} y {{PRODUCT_CARDS}}, envuelve con hero (foto de producto) + CSS embebido, y publica vía REST POST /blogs/{BLOG_ID}/articles.json (published:true). Notifica el link por Telegram.

Datos/APIs

  • Shopify Admin REST + GraphQL (/admin/api/2024-10, blog BLOG_ID=75567464627). Vars: SHOPIFY_STORE, SHOPIFY_ACCESS_TOKEN.
  • fal.ai (flux/schnell / flux/dev). Var: FAL_API_KEY.
  • Telegram directo (bot SEO Sergio, envío silencioso). Vars: TELEGRAM_SEO_TOKEN (fallback TELEGRAM_BOT_TOKEN), TELEGRAM_CHAT_ID. (Nota: no usa notify-router, hace fetch directo.)
  • LLM local tools/gemini-cli (sonnet).

Cómo probarlo

# Forzar generación de blog inmediata:
cd /Users/user/rifai-agents && FORCE_BLOG=1 npx tsx agentes/content/seo-blog.ts
# Forzar optimización SEO de 3 productos:
cd /Users/user/rifai-agents && FORCE_SEO=1 npx tsx agentes/content/seo-blog.ts

Espera: modo elegido; en BLOG → topic, productos encontrados, imágenes, artículo (chars) y ✅ Publicado: <url>; en SEO → 3 productos optimizados. Escribe de verdad en Shopify (publica artículo / modifica productos).

Si se rompe / recuperar

launchctl unload ~/Library/LaunchAgents/com.rifai.seo-engine.plist
launchctl load   ~/Library/LaunchAgents/com.rifai.seo-engine.plist

Logs en /Users/user/rifai-agents/logs/seo-engine.log. Estado en data/seo-engine-state.json (índice rotativo + histórico; lo comparten v1/v2). Fallos típicos: JSON inválido del LLM, GraphQL Shopify vacío, fal.ai sin imagen (el blog sigue sin esa imagen), token Shopify sin scope de blogs.

Cómo replicarlo

  • Lector .env + TOP_PRODUCT_IDS + BLOG_TOPICS.
  • Selector de modo por día de Madrid + flags FORCE.
  • LLM local con prompts SEO (producto) y editor jefe (blog HTML).
  • fal.ai para imágenes lifestyle.
  • Shopify: REST PUT productos (+metafields +alt), GraphQL para buscar productos, REST POST artículo de blog.
  • Plantilla HTML con placeholders {{IMG}}/{{PRODUCT_CARDS}} + CSS embebido.
  • Telegram directo (token SEO) y plist 8:00 diario.