Publicación social
Propósito
Publicar el contenido de lanzamiento según un cronograma desde un solo lugar, a través de la API oficial de cada plataforma, sin perder una cuenta personal por la marca ni la marca por una cuenta personal. La herramienta aquí es Postiz (código abierto, autoalojado); los pasos de la plataforma se aplican a cualquier programador.
Requisitos previos
- Cuentas de marca ya creadas: cuenta profesional de Instagram, perfil de Threads (proviene de Instagram), cuenta de X, opcionalmente TikTok.
- Un dominio en Cloudflare (para el nombre de host del túnel), Docker Desktop, una máquina que permanezca encendida en los horarios de publicación (o un VPS pequeño).
- La configuración
console-automationsi las consolas se manejan desde un navegador. - Un calendario de contenido (ver "Calendario" más abajo).
Realidad de la plataforma (vuelve a verificar antes de comenzar; esto cambia)
| Plataforma | Ruta oficial | Lo que te bloquea |
|---|---|---|
| Aplicación de Meta + Inicio de sesión de Facebook, cuenta profesional de IG vinculada a una Página de Facebook | Las nuevas aplicaciones de Meta obtienen la configuración de Instagram "Inicio de sesión unificado", que requiere un portafolio empresarial; la configuración anterior solo con inicio de sesión de Instagram "no está disponible para aplicaciones más nuevas". Las Historias se publican como contenido multimedia simple: sin encuestas, enlaces ni pegatinas de cuenta regresiva a través de la API. | |
| Threads | Aplicación de Meta con el caso de uso de Threads | Hasta la Revisión de la aplicación, solo las cuentas con el rol Tester de Threads pueden conectarse; el tester acepta en Threads › Configuración › Cuenta › Permisos del sitio web › Invitaciones. |
| X | Cuenta de desarrollador con acceso a API de pago (consulta los precios actuales de la API de X) | Necesita un método de pago; establece un límite de gasto. |
| TikTok | API de Publicación de Contenido | Las aplicaciones no auditadas publican solo privadas hasta que la auditoría pase (la auditoría lleva tiempo). Las cuentas nuevas necesitan verificación telefónica, y un número puede pertenecer solo a una cuenta. |
| YouTube | Subida mediante API de datos | Los proyectos de API no verificados suben como privados hasta una auditoría de cumplimiento. |
Planifica en torno a los bloqueadores: comienza las auditorías temprano, publica de forma nativa en TikTok/YouTube (programadores de TikTok Studio, YouTube Studio) hasta que pasen las auditorías, o abandona la plataforma.
Procedimiento
1. Autoalojar Postiz (Docker)
- Comienza desde el archivo oficial
postiz-docker-compose. Antes deup:- Elimina los servicios que no necesites y cualquier servicio que vincule puertos ya en uso en la máquina (el archivo upstream vincula la interfaz de usuario de Temporal a
127.0.0.1:8080). - Elimina Elasticsearch: establece
ENABLE_ES=falseySKIP_ADD_CUSTOM_SEARCH_ATTRIBUTES=true(visibilidad SQL). Postiz solo registra dos atributos de palabra clave. Si Temporal se inició primero con ES, su base de datos aún contiene los atributos de texto predeterminados y Postiz falla con "no puede tener más de 3 atributos de búsqueda de tipo Texto": recrea el volumen de la base de datos de Temporal antes de programar cualquier cosa. - Vincula Postiz solo a
127.0.0.1; estableceMAIN_URL,FRONTEND_URL,NEXT_PUBLIC_BACKEND_URLen el nombre de host público HTTPS. - Coloca los secretos (
JWT_SECRET, token del túnel, claves de la aplicación) en un.envignorado por git, referenciados como${VAR}en el archivo de compose. - Agrega
mem_limit/cpuspor servicio. Postiz ejecuta frontend, backend y orquestador en un solo contenedor; observamos aproximadamente 1.5 GB de uso, por lo que un límite de 2 GB evitó alcanzar el límite. En Windows, también limita la VM de WSL en%USERPROFILE%\.wslconfig(memory=4GB,processors=4,autoMemoryReclaim=gradual), luegowsl --shutdowny reinicia Docker Desktop.
- Elimina los servicios que no necesites y cualquier servicio que vincule puertos ya en uso en la máquina (el archivo upstream vincula la interfaz de usuario de Temporal a
- Crea la primera cuenta en el navegador después de que la página se haya hidratado (un formulario no hidratado se envía como GET y coloca la contraseña en la URL). Luego establece
DISABLE_REGISTRATION=truey reinicia. - Mantén
restart: alwaysy habilita "iniciar Docker Desktop al iniciar sesión"; desactiva el modo de suspensión si la máquina es la programadora.
2. Nombre de host público (Túnel de Cloudflare)
- Crea un túnel administrado de forma remota (API:
POST /accounts/{id}/cfd_tunnelconconfig_src: cloudflare,PUT .../configurationscon la regla de ingreso, unCNAMEproxy a<tunnel-id>.cfargotunnel.com,GET .../token). - Ejecuta
cloudflaredcomo un servicio en la misma red de compose y apunta el ingreso ahttp://postiz:5000, no alocalhost. - APROBACIÓN: un túnel expone un servicio local a internet; pregunta antes de crearlo. Opcionalmente, agrega Cloudflare Access al frente (necesita Zero Trust habilitado en la cuenta; mantén
/uploadsaccesible para la obtención de contenido multimedia de Meta).
3. Meta (Instagram + Threads)
- Crea una aplicación de Meta separada para publicar (no agregues casos de uso a una aplicación que ya alimenta una función dentro de la aplicación, como compartir Historias de Instagram). Casos de uso: "Gestionar mensajes y contenido en Instagram" y "Acceder a la API de Threads".
- Instagram:
- Crea un portafolio empresarial cuando el caso de uso lo solicite (gratuito; nombre, nombre del propietario, correo electrónico empresarial). La verificación solo es necesaria para datos de otras personas y la Revisión de la aplicación.
- Crea una Página de Facebook para la marca (también requerida para anuncios de Meta) y vincula la cuenta profesional de Instagram a ella: Configuración de la página › Cuentas vinculadas › Instagram › Conectar. La ventana emergente de OAuth inicia sesión con la cuenta de Instagram que tenga el navegador: lee el nombre "Iniciar sesión como …"; si es una cuenta personal, cambia de cuenta primero (conectar una cuenta personal la convierte en profesional).
- En el caso de uso de Instagram, agrega exactamente los alcances que solicita el programador (Postiz:
instagram_basic,pages_show_list,pages_read_engagement,business_management,instagram_content_publish,instagram_manage_comments,instagram_manage_insights). Establece el URI de redireccionamiento de Inicio de sesión de Facebook para Empresas en la devolución de llamada del programador (Postiz:/integrations/social/instagram). - Identificador de la aplicación + secreto (Configuración de la aplicación › Básico; mostrar el secreto requiere la contraseña de Facebook) →
FACEBOOK_APP_ID/SECRET.
- Threads: agrega
threads_basic,threads_content_publish,threads_manage_replies,threads_manage_insights; establece la redirección (/integrations/social/threads) más las URL de devolución de llamada de desinstalación/eliminación; toma el identificador/secreto de la aplicación de Threads separado; agrega el perfil de la marca como Tester de Threads y acepta la invitación en el teléfono. - Si la URL de consentimiento de Threads aterriza en la página de inicio de Threads en lugar de la pantalla de consentimiento, la sesión del navegador está en
threads.commientras el programador usathreads.net: abre la misma URL enthreads.com. - Si el navegador está actuando actualmente como la Página (después de editarla), el consentimiento de Facebook primero muestra "Debes cambiar a "; continúa como la persona, no como la Página.
- Durante el consentimiento de Facebook, Meta predetermina "todas las Páginas/Empresas/Cuentas de Instagram actuales y futuras". En una cuenta que gestiona otras marcas, elige "solo actual" y selecciona los activos de la marca.
4. X
- Incorporación a la Consola de desarrollador: nombre de la cuenta, una descripción precisa del caso de uso (solo cuenta propia, sin reventa de datos, sin Me gusta/seguimientos/MD automatizados), acepta los términos.
- Compra el paquete de créditos más pequeño; deja la recarga automática desactivada y establece un límite de ciclo de facturación. El total del panel puede retrasarse con respecto a la página de Créditos.
- Aplicación › Configuración de autenticación de usuario: Lectura y escritura, "Aplicación web, aplicación automatizada o bot", devolución de llamada = devolución de llamada del programador (Postiz:
/integrations/social/x), sitio web, términos y URL de privacidad. Guardar muestra el secreto de cliente de OAuth 2.0 una vez. - Postiz usa OAuth 1.0a: regenera la Clave de consumidor y copia la clave + "Secreto de clave de consumidor" (esa etiqueta exacta) una vez →
X_API_KEY/X_API_SECRET. - Autorización: marca "Confío en esta aplicación", confirma que la pantalla muestra el identificador de la marca, luego Autorizar.
5. TikTok (opcional)
Cuenta:
- Las cuentas nuevas requieren verificación telefónica y un número puede estar en una sola cuenta; un registro web puede terminar en "continuar en la aplicación". Opciones: un segundo número para cuentas de marca, o convertir una cuenta personal existente (nuevo nombre de usuario y nombre para mostrar, foto de perfil, biografía; archivar/privatizar videos personales antiguos).
- En algunas regiones, el toque único "Cambiar a cuenta empresarial" ha desaparecido; el menú ofrece "Conviértete en una cuenta empresarial verificada", que solicita documentos de la empresa. Una cuenta personal es suficiente: la programación de TikTok Studio, análisis, Spark Ads y la API de Publicación de Contenido funcionan con ella. La biblioteca de música empresarial es la principal pérdida.
- El nombre de usuario puede cambiar una vez cada 30 días, el nombre para mostrar una vez cada 7 días. El perfil web (nombre, biografía, foto, recuentos) puede retrasarse con respecto a la aplicación un día o más; confía en la aplicación.
- La región de la cuenta se establece al registrarse desde SIM/IP y no se pudo cambiar en la configuración.
Aplicación de desarrollador (para el programador):
- El registro en developers.tiktok.com muestra solo "Desarrollador empresarial" (correo electrónico + código + contraseña), pero al crear la aplicación puedes elegir propiedad Individual, por lo que no se necesita empresa para comenzar.
- Crea la aplicación, luego un Sandbox: información básica (icono 1024², categoría, descripción ≤120 caracteres, URL de términos/privacidad, URL de plataforma web), productos Login Kit (URI de redireccionamiento web = devolución de llamada del programador; Postiz
/integrations/social/tiktok) y API de Publicación de Contenido (activa Publicación directa), y todos los alcances que solicita el programador. Postiz solicitauser.info.basic,user.info.profile,user.info.stats,video.list,video.upload,video.publish; uno faltante muestra "Algo salió mal … corrige lo siguiente: alcance" en la página de consentimiento. Haz clic en "Aplicar cambios" después de cada edición. - Agrega la cuenta de marca como Usuario objetivo del Sandbox (la ventana emergente de inicio de sesión acepta un escaneo de código QR desde la aplicación del teléfono). Usa la clave/secreto del cliente del sandbox en el programador.
- La carga por archivo no necesita verificación de dominio; la carga por URL sí.
- Antes de la auditoría: el modo
UPLOADenvía el video a la bandeja de entrada de TikTok de la cuenta como borrador (publicar desde el teléfono dentro de las 24 h; máximo 5 pendientes por 24 h).DIRECT_POSTfunciona pero publica solo de forma privada. Envía la aplicación de producción para revisión con un video de demostración para publicación directa pública. - El paso de consentimiento puede preguntar "Verifica que realmente eres tú" con un código de correo electrónico. Después de muchos cambios de cuenta en un día (correo electrónico, nombre, biografía, nuevos inicios de sesión), TikTok limita la velocidad de estos códigos ("Se ha alcanzado el número máximo de intentos"): detente y vuelve a intentarlo al día siguiente en lugar de insistir.
6. Verificar
- La lista de canales del programador muestra cada cuenta de marca (nombre/identificador), ninguna deshabilitada.
- Publica una prueba privada/de bajo riesgo por plataforma, o un borrador, antes de que comience el calendario.
- Uso de recursos después de un día:
docker stats --no-stream.
Calendario
- Clave el calendario de publicaciones a eventos de lanzamiento reales, no a fechas fijas: antes del lanzamiento (sin llamada a la acción de descarga, sin precio), luego el lanzamiento de cada tienda, luego ambas en vivo. Las fechas de revisión de la tienda se mueven; reancla el calendario cuando lo hagan.
- Verifica cada afirmación en una publicación contra la compilación enviada, y cada llamada a la acción contra lo que realmente está en vivo en cada tienda.
- Las Historias con encuestas, enlaces o cuenta regresiva no se pueden publicar a través de la API; publícalas en la aplicación.
Puntos de decisión que requieren aprobación humana
Crear cuentas de marca, portafolio empresarial, Página de Facebook; exponer un servicio local a través de un túnel; comprar créditos de API y el límite de gasto; qué cuentas personales nunca se pueden conectar; convertir una cuenta personal; eliminar volúmenes o datos de Docker.
Errores comunes
- Conectar la cuenta personal de Instagram porque la ventana emergente de OAuth reutilizó la sesión del navegador.
- Asumir que la configuración anterior de inicio de sesión de Instagram existe en una nueva aplicación de Meta.
- Agregar casos de uso de publicación a la aplicación de Meta que se envía dentro de la aplicación móvil.
- Elasticsearch dejado en la pila cuando la visibilidad SQL de Temporal es suficiente.
- El archivo de compose upstream tomando un puerto ya utilizado por otro servicio local.
- Clave de X guardada de la etiqueta incorrecta ("Secreto de clave de consumidor", no el título del diálogo).
- Calendario escrito como si la aplicación estuviera en vivo en ambas tiendas el día 1.
- Hacer todos los cambios de cuenta de TikTok y la conexión de desarrollador el mismo día, lo que activa el límite de velocidad del código de verificación.