Tutorial: Integrar OpenAI API en Python paso a paso
Desde tu primera llamada a GPT hasta un sistema completo con streaming, function calling y manejo de errores. Código production-ready.
Esta guía te permitirá automatizar la publicación de contenido (en este caso, Instagram Stories) utilizando el nodo comunitario n8n-nodes-meta-publisher. Este nodo es muy potente porque maneja automáticamente el ciclo de "subida → espera de procesamiento → publicación" de la API de Graph, eliminando la necesidad de crear bucles de espera manuales.
Dado que este es un nodo de la comunidad, no viene preinstalado en n8n.
Ve a tu instancia de n8n.
Haz clic en Settings (Configuración) > Community Nodes.
Haz clic en Install.
Pega el nombre del paquete npm:Plaintext
n8n-nodes-meta-publisher
Acepta los riesgos y confirma la instalación. Una vez instalado, reinicia n8n si es necesario (aunque usualmente es inmediato).
Antes de configurar el flujo, necesitas credenciales válidas. La API de Meta es estricta.
instagram_basicinstagram_content_publishpages_show_listpages_read_engagementigUserId:
me/accounts?fields=instagram_business_account.He limpiado y optimizado el JSON que compartiste para que funcione como una plantilla robusta.
Instrucciones: Copia el siguiente código JSON y pégalo directamente en tu lienzo (canvas) de n8n (Ctrl+V / Cmd+V).
JSON
{ "nodes": [ { "parameters": {}, "id": "69b8b0cb-f989-4f91-9973-26d6b4f4f6f1", "name": "Trigger Manual", "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, "position": [ -560, 464 ] }, { "parameters": { "assignments": { "assignments": [ { "id": "ig-user-id", "name": "igUserId", "value": "PON_AQUI_TU_IG_USER_ID_NUMERICO", "type": "string" }, { "id": "media-url", "name": "mediaUrl", "value": "<https://images.unsplash.com/photo-1546552356-3fae876a61ca?w=1080&q=80>", "type": "string" }, { "id": "story-kind", "name": "storyKind", "value": "image", "type": "string" }, { "id": "caption", "name": "caption", "value": "Probando automatización con n8n 🚀", "type": "string" } ] }, "options": {} }, "id": "f6579ee3-3aba-4768-9bee-71f08bfe5cc7", "name": "Configurar Datos", "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -340, 464 ] }, { "parameters": { "operation": "publishStory", "pollSec": 5, "maxWaitSec": 120, "igUserId": "={{ $json.igUserId }}", "storyKind": "={{ $json.storyKind }}", "mediaUrl": "={{ $json.mediaUrl }}", "caption": "={{ $json.caption }}" }, "id": "25b6d1f3-4a5f-43a5-a84b-3dff4e812cb1", "name": "Meta Publisher", "type": "n8n-nodes-meta-publisher.metaPublisher", "typeVersion": 1, "position": [ -120, 464 ], "credentials": { "metaGraphApi": { "id": "", "name": "Meta Graph (Access Token) account" } } }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 1 }, "conditions": [ { "id": "condition-published", "leftValue": "={{ $json.published }}", "rightValue": true, "operator": { "type": "boolean", "operation": "equals" } } ] }, "combinator": "and" }, "id": "22d141aa-bc9c-4967-a68d-e673d54c8a11", "name": "¿Publicado?", "type": "n8n-nodes-base.if", "typeVersion": 2, "position": [ 100, 464 ] }, { "parameters": { "assignments": { "assignments": [ { "id": "success-message", "name": "mensaje", "value": "✅ Historia publicada exitosamente", "type": "string" }, { "id": "creation-id", "name": "creationId", "value": "={{ $json.creationId }}", "type": "string" }, { "id": "status", "name": "status", "value": "={{ $json.status }}", "type": "string" } ] }, "options": {} }, "id": "89ba655e-2822-4876-86f9-a27a17a00e32", "name": "Éxito", "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ 340, 360 ] }, { "parameters": { "assignments": { "assignments": [ { "id": "error-message", "name": "mensaje", "value": "❌ Error al publicar historia", "type": "string" }, { "id": "error-details", "name": "error", "value": "={{ $json }}", "type": "object" } ] }, "options": {} }, "id": "370d18d4-befb-4444-b5be-209261eeed98", "name": "Error", "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ 340, 560 ] } ], "connections": { "Trigger Manual": { "main": [ [ { "node": "Configurar Datos", "type": "main", "index": 0 } ] ] }, "Configurar Datos": { "main": [ [ { "node": "Meta Publisher", "type": "main", "index": 0 } ] ] }, "Meta Publisher": { "main": [ [ { "node": "¿Publicado?", "type": "main", "index": 0 } ] ] }, "¿Publicado?": { "main": [ [ { "node": "Éxito", "type": "main", "index": 0 } ], [ { "node": "Error", "type": "main", "index": 0 } ] ] } }, "pinData": {} }
Este nodo prepara el "Payload" que necesita Meta. Es importante no usar datos "quemados" (hardcoded) dentro del nodo Publisher para mantener el flujo dinámico.
PON_AQUI_TU_IG_USER_ID_NUMERICO con el ID que obtuviste en el paso 2.image o video.Este es el núcleo de la automatización.
Meta Graph API.Instagram.Publish Story.IG User ID, Media URL y Caption están configurados como expresiones (ej. {{ $json.mediaUrl }}). Esto lee automáticamente lo que configuraste en el nodo anterior.Poll Interval en 5 segundos. Esto significa que n8n preguntará a Facebook cada 5 segundos: "¿Ya está lista la imagen para publicarse?". Una vez que Facebook dice "Sí", el nodo finaliza.Este nodo verifica la respuesta del nodo Publisher.
published.published es true → Va al camino de Éxito.false o no existe → Va al camino de Error.| Error | Causa Probable | Solución |
|---|---|---|
| (#100) The parameter user_id is required | El igUserId está vacío o es incorrecto. |
Verifica que estás usando el ID de la cuenta de Instagram Business (numérico), no el de la Página de Facebook ni el handle (@). |
| Error validating access token | El token caducó o faltan permisos. | Genera un nuevo token asegurando los permisos instagram_content_publish. |
| Media processing failed / URL Error | Facebook no puede acceder a la URL de la imagen. | Asegúrate de que la URL termina en .jpg o .png y es accesible sin iniciar sesión (pruébala en modo incógnito). Evita enlaces de previsualización de Dropbox/Drive. |
| Account not linked | La cuenta de Instagram no es Business. | Ve a la App de Instagram en el móvil > Configuración > Cuenta > Cambiar a cuenta profesional. |
Regístrate gratis para descargar archivos, guardar recursos en favoritos, ganar XP y acceder a cursos y el foro de la comunidad.
¿Ya tienes cuenta? Inicia sesión
Autor
Erik Taveras
Creado por
Erik Taveras
Desde tu primera llamada a GPT hasta un sistema completo con streaming, function calling y manejo de errores. Código production-ready.
Implementación paso a paso de Stripe Checkout para cobros únicos y suscripciones en Django. Incluye webhooks, portal del cliente y manejo de estados.
Comparativa práctica entre REST y GraphQL con ejemplos en Python. Ventajas, desventajas y criterios de decisión para tu próximo proyecto.