🔍 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, blogBLOG_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(fallbackTELEGRAM_BOT_TOKEN),TELEGRAM_CHAT_ID. (Nota: no usa notify-router, hacefetchdirecto.) - 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.