Communitygithub.com

erberkk/social-publishing

Utilizar al configurar la publicación programada del contenido de marketing de una aplicación en Instagram (Reels, carruseles, Historias), Threads, X y TikTok a través de las API oficiales, autoalojando Postiz en Docker detrás de un túnel de Cloudflare, creando la aplicación de Meta con el nuevo flujo de casos de uso (portafolio empresarial, página de Facebook vinculada a la cuenta profesional de Instagram, invitación a tester de Threads), créditos de pago por uso y límite de gasto de X, límites de auditoría de TikTok y YouTube, selección segura de cuentas de OAuth cuando un mismo navegador tiene cuentas personales y de marca, límites de recursos y programación de un calendario de publicaciones en torno a eventos de lanzamiento reales.

¿Qué es social-publishing?

Esta habilidad permite configurar un sistema de publicación programada para contenido de marketing en múltiples plataformas (Instagram, Threads, X, TikTok y YouTube) utilizando Postiz autoalojado en Docker detrás de un túnel de Cloudflare. Es útil para equipos que necesitan centralizar la publicación de contenido de lanzamiento sin exponer cuentas personales o de marca a riesgos, garantizando que las cuentas personales no se vinculen a la marca ni viceversa. La habilidad cubre la creación de aplicaciones de Meta con el nuevo flujo de portafolio empresarial, la configuración de cuentas de desarrollador de X con créditos de pago por uso, la auditoría de TikTok y YouTube, y la gestión cuidadosa de la autenticación OAuth cuando un navegador contiene tanto cuentas personales como de marca. También incluye pautas para diseñar un calendario de publicaciones en torno a eventos de lanzamiento reales y consejos para evitar errores comunes como conectar la cuenta personal de Instagram por error o asumir que la configuración antigua de inicio de sesión de Instagram está disponible en aplicaciones nuevas de Meta.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/erberkk/mobile-app-launch-skills/tree/HEAD/skills/social-publishing

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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-automation si 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)

PlataformaRuta oficialLo que te bloquea
InstagramAplicación de Meta + Inicio de sesión de Facebook, cuenta profesional de IG vinculada a una Página de FacebookLas 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.
ThreadsAplicación de Meta con el caso de uso de ThreadsHasta 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.
XCuenta 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.
TikTokAPI de Publicación de ContenidoLas 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.
YouTubeSubida mediante API de datosLos 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)

  1. Comienza desde el archivo oficial postiz-docker-compose. Antes de up:
    • 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=false y SKIP_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; establece MAIN_URL, FRONTEND_URL, NEXT_PUBLIC_BACKEND_URL en el nombre de host público HTTPS.
    • Coloca los secretos (JWT_SECRET, token del túnel, claves de la aplicación) en un .env ignorado por git, referenciados como ${VAR} en el archivo de compose.
    • Agrega mem_limit/cpus por 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), luego wsl --shutdown y reinicia Docker Desktop.
  2. 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=true y reinicia.
  3. Mantén restart: always y 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_tunnel con config_src: cloudflare, PUT .../configurations con la regla de ingreso, un CNAME proxy a <tunnel-id>.cfargotunnel.com, GET .../token).
  • Ejecuta cloudflared como un servicio en la misma red de compose y apunta el ingreso a http://postiz:5000, no a localhost.
  • 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 /uploads accesible para la obtención de contenido multimedia de Meta).

3. Meta (Instagram + Threads)

  1. 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".
  2. 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.
  3. 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.
  4. 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.com mientras el programador usa threads.net: abre la misma URL en threads.com.
  5. 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.
  6. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 solicita user.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 UPLOAD enví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_POST funciona 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.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

erberkk/privacy-and-declarations

Use when filling in or auditing App Store privacy and compliance answers and Google Play App content declarations - Apple App Privacy labels, Play Data safety (CSV import), Health apps declaration and Health Connect permissions, advertising ID, PrivacyInfo.xcprivacy and required-reason APIs, export compliance (ITSAppUsesNonExemptEncryption), age rating, account deletion (in-app, web URL, re-authentication), consent and disclosure for AI features, and rules for health data. Derives every answer from a code and SDK scan so the forms, the privacy policy and the in-app text say the same thing.

erberkk/review-readiness

Use before submitting an app version or a first subscription for App Store or Google Play review, or after receiving a rejection. Runs a go/no-go checklist and writes a report - demo account that signs in with a password (no email one-time code), filled with data and premium unlocked; review notes; in-app purchases visible and purchasable (guideline 2.1(b)); iPad compatibility mode for iPhone-only apps; no placeholders or "coming soon"; metadata matching the app; live privacy URLs; crash-free cold start - and gives a playbook for replying in Resolution Center and deciding when to appeal.

erberkk/store-screenshots

Use when producing or updating App Store and Google Play screenshots and the Play feature graphic - planning a connected "panorama" story across frames, capturing real in-app screens with the app's own test/screenshot harness at each device's logical size and pixel ratio, covering the full device matrix (iPhone 6.9", the required medium Dynamic Island slot, iPhone Duo outer and inner displays, iPad 13" if the app runs on iPad, Play phone, 7" and 10" tablets, 1024x500 feature graphic), checking for alpha channels and wrong sizes, and uploading in order via the App Store Connect and Google Play APIs.

erberkk/web-presence-and-seo

Use when building, checking or deploying the website that a mobile app needs for its store listings and launch - privacy policy, terms, support and web account-deletion pages that work signed-out; hosting apple-app-site-association and assetlinks.json; invite/referral pages (/i/<code>) that open the app or fall back to the store with the Play install referrer; a landing page with store badges and honest per-country prices filled at the edge; Open Graph images; technical SEO (hreflang, canonical, sitemap, robots.txt, JSON-LD); Search Console, Bing Webmaster and IndexNow; AI crawler policy and llms.txt; and a Cloudflare Worker deploy with a production approval gate. Includes a site checker and an IndexNow ping script.

Skills relacionados