Programar en redes sociales
Configuración: completa estos datos
Reemplaza cada marcador de posición a continuación antes de la primera ejecución.
| Marcador | Qué es |
|---|---|
<YOUR_METRICOOL_BLOG_ID> | El blogId de tu marca en Metricool (de getBrandSettings) |
<YOUR_TIMEZONE> | Zona horaria IANA para la programación, ej. America/Chicago |
<YOUR_POST_TIME> | Hora de publicación diaria predeterminada, ej. 10:00 |
<YOUR_IG_HANDLE>, <YOUR_TIKTOK_HANDLE>, <YOUR_YOUTUBE_CHANNEL_ID> | Las cuentas conectadas en Metricool |
<YOUR_DRIVE_UPLOAD_FOLDER_ID> | Una carpeta de Google Drive compartida con 'cualquier persona con el enlace' (ver el salto de medios) |
<YOUR_VIDEO_LIBRARY> | Donde se guardan los archivos terminados, ej. ~/Videos/Finished |
<YOUR_STANDING_CTA> | Línea de cierre opcional que pones en cada pie de foto |
<YOUR_VOICE_FILE> | Opcional: ruta a un archivo de voz/guía de estilo para los pies de foto |
Marca: blogId <YOUR_METRICOOL_BLOG_ID>, zona horaria <YOUR_TIMEZONE>.
Conectado: Instagram (<YOUR_IG_HANDLE>), TikTok (<YOUR_TIKTOK_HANDLE>), YouTube (<YOUR_YOUTUBE_CHANNEL_ID>).
El salto de medios (la parte que no es obvia)
La API de Metricool solo acepta URLs públicas. No puede aceptar un archivo local. La cadena de trabajo:
- Sube el MP4 a una carpeta de Drive como
Metricool Uploads (Claude)(<YOUR_DRIVE_UPLOAD_FOLDER_ID>). Comparte la carpeta con 'cualquier persona con el enlace' una vez; los archivos heredan eso, así que no es necesario compartir por archivo.cd <directorio con el archivo> && gws drive files create \ --params '{"uploadType":"multipart","supportsAllDrives":true}' \ --json '{"name":"<nombre>.mp4","mimeType":"video/mp4","parents":["<YOUR_DRIVE_UPLOAD_FOLDER_ID>"]}' \ --upload "<archivo>" - Programa con la URL de descarga directa:
https://drive.google.com/uc?id=<fileId>&export=download. El enlace/viewfalla con 'Error al normalizar el medio'. - Metricool copia el archivo a su propio almacenamiento; el
mediade la respuesta cambia astatic.metricool.com/.... - Elimina la copia de Drive una vez que veas eso. El almacenamiento nunca se acumula.
Claude normalmente no puede hacer públicos los archivos de Drive (el sandbox lo bloquea) y no puede editar sus propios permisos. Por eso existe la carpeta compartida. Si un archivo termina fuera de la carpeta, pide al usuario que lo mueva en lugar de intentar compartirlo.
Pies de foto
Si mantienes una guía de voz, lee primero <YOUR_VOICE_FILE> y ajústate a ella. De lo contrario, usa estos valores predeterminados.
Cuando el reel tiene un CTA de palabra clave en comentarios (una palabra clave que activa un DM o correo automatizado), la línea 1 es el CTA:
- Línea 1:
Comenta <KEYWORD> y te enviaré <nombre del recurso> gratis 👇, palabra clave en mayúsculas, exactamente como se habla en el clip del CTA del reel. - Luego la línea de gancho y las 2-4 líneas de enseñanza a continuación.
- Cierra con el CTA fijo, si lo usas.
- La palabra clave debe coincidir con el CTA hablado del reel (
reel_ctaen el archivo de estado del video). Una palabra clave por video.
Formato para reels sin un CTA de palabra clave:
- La línea 1 es el gancho. Es la única línea que se muestra en el feed. Generalmente la misma línea con la que abre el reel.
- 2-4 líneas cortas que enseñan una cosa. Saltos de línea entre ellas, no un párrafo.
- Sin spam de hashtags. Pocos o ninguno.
- Cierra con
<YOUR_STANDING_CTA>textualmente si lo tienes.
Escribe basándote en lo que realmente está en el reel, usando las palabras del creador de la transcripción, no consejos genéricos. Corto pero educativo: el espectador debe aprender algo utilizable solo con el pie de foto.
Ejemplos genéricos de la forma:
'Publicar todos los días = AGOTAMIENTO / Publicar 3 buenos videos a la semana = CRECIMIENTO'
'Consejo rápido si quieres mejor audio: pon el micrófono más cerca, no subas la ganancia...'
Renderización
Los pies de foto se queman: video-reels los coloca en V3 como un clip de superposición alfa, con la tarjeta de texto de gancho en V2. Nada que importar, sin casilla de verificación de quemado.
- El usuario recorta el reel. Ambas pistas de superposición son clips independientes, por lo que recortar V1 no las mueve. Si el tiempo se re-corta, vuelve a renderizar los pies de foto de ese reel en lugar de deslizarlos.
- Claude los renderiza a través de la API de Resolve. Cuatro reels tardan unos 90 segundos.
out = os.path.expanduser("~/Movies/<video>-deliverables/reels-final")
os.makedirs(out, exist_ok=True)
project.DeleteAllRenderJobs()
for i in range(project.GetTimelineCount()):
t = project.GetTimelineByIndex(i+1)
if not t.GetName().startswith("Reel"):
continue
project.SetCurrentTimeline(t)
project.SetRenderSettings({"TargetDir": out, "CustomName": t.GetName().replace(" ", "_"),
"SelectAllFrames": True, "FormatWidth": 1080, "FormatHeight": 1920,
"ExportVideo": True, "ExportAudio": True})
project.SetCurrentRenderFormatAndCodec("mp4", "H264")
project.AddRenderJob()
Luego start_rendering. La cadena del códec es "H264", no "H.264", y el formato es "mp4". Consulta el directorio de salida en lugar del estado del trabajo; los archivos aparecen cuando terminan. Espera unos ~40MB para 30 segundos.
3. La renderización es el punto de no retorno para el tiempo, así que haz cualquier recorte primero.
4. Verifica la salida con ffmpeg antes de subir, un fotograma dentro de la ventana del gancho y otro a mitad del reel:
ffmpeg -v error -ss 1.5 -i reel.mp4 -frames:v 1 hook.png -y
ffmpeg -v error -ss 8 -i reel.mp4 -frames:v 1 cap.png -y
Apílelos en una sola hoja de prueba y mírala realmente. Este es el último lugar donde se puede detectar una tarjeta de gancho faltante o una pista de pie de foto vacía, y después de la programación no hay eliminación.
Dónde van los archivos terminados
Todo lo que se guarda termina en <YOUR_VIDEO_LIBRARY>/, una carpeta por video:
<YOUR_VIDEO_LIBRARY>/<Video> YYYY-MM-DD/
Reels/ lo que se publicó. 1080x1920 H.264
Reels/Masters/ mismo corte, archivo de 60 Mbps
Timelines/ un .drt por timeline + el proyecto .drp
Covers/ las portadas de reel de Instagram aprobadas, 1080x1920 JPG
Thumbnails/ las opciones de tamaño completo
YouTube/ el video largo exportado, entrega + archivo
Posting schedule.txt qué sale, dónde y cuándo
El archivo de subida: tan alto como lo permite la API de publicación de Instagram
Metricool publica a través de la API de publicación de contenido de Meta, que limita lo que acepta. Sube el mejor archivo que quepa dentro de esos límites, creado a partir del archivo maestro de 60 Mbps y no de la renderización de entrega de Resolve:
- H.264 High, yuv420p, 1080x1920, GOP cerrado, moov al principio (
+faststart) - video 24 Mbps máximo (el límite es 25), audio AAC 128 kbps a 48 kHz (Resolve escribe 320 kbps, que está por encima)
- solo flujos de video y audio. Resolve añade una pista de datos de código de tiempo; elimínala con
-dn
ffmpeg -i "Masters/<n>.mp4" -map 0:v:0 -map 0:a:0 -map_metadata -1 -dn \
-c:v libx264 -preset slow -crf 11 -maxrate 24M -bufsize 48M -pix_fmt yuv420p -profile:v high \
-g 48 -keyint_min 48 -sc_threshold 0 -flags +cgop \
-c:a aac -b:a 128k -ar 48000 -movflags +faststart "Reels/<n>.mp4"
Con CRF 16, el metraje de solo cabeza parlante solo usó ~8 Mbps, por lo que CRF 11 gasta más del presupuesto. Ejecútalo en segundo plano, ya que varios reels tardan minutos en -preset slow. Codifica un archivo a la vez, no en paralelo: muchas codificaciones paralelas pueden llenar el disco a mitad de escritura y truncar todos los archivos. Instagram aún re-comprime por su lado; esto asegura que lo que comienza sea tan limpio como lo permite.
Dos renderizados por reel, no uno. Mismo códec, misma resolución, diferente tasa de bits:
| Resolución | Tasa de bits | Para | |
|---|---|---|---|
| entrega | 1080x1920 H.264 | Pase de Resolve, luego reemplazado por el archivo de subida anterior | subir |
| maestro | 1080x1920 H.264 | 60 Mbps mediante "VideoQuality": 60000 | archivo |
Mismos dos pases para el video largo a 1920x1080: ~900MB de entrega, ~4.5GB de maestro para un video de 10 minutos.
1080x1920 es la resolución correcta: Instagram sirve 1080 de ancho independientemente, y el recorte del reel ya está sobremuestreado desde 4K. No ofrezcas ProRes o un fotograma más grande a menos que te lo pidan.
VideoQuality es persistente. Establécelo en cada pase.
La configuración de renderizado reside en el proyecto, no en el trabajo. Si omites VideoQuality en una llamada a SetRenderSettings, el renderizado reutiliza silenciosamente el que se usó antes. Un pase de entrega de video largo que herede 60000 de los maestros de reel sale ~5 veces más grande de lo previsto.
project.SetRenderSettings({..., "VideoQuality": 12000}) # entrega, ~12 Mbps
project.SetRenderSettings({..., "VideoQuality": 60000}) # maestro, ~60 Mbps
Nunca confíes en el valor predeterminado para el pase de entrega. Y nunca confíes en la lista de trabajos: VideoQuality se lee como None desde GetRenderJobList() incluso cuando se aplicó. Verifica el archivo terminado:
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 out.mp4
Verifica el espacio libre antes de encolar un par de video largo. Un maestro de 10 minutos a 60 Mbps es ~4.5GB.
Exporta también las líneas de tiempo a la carpeta, para que la edición sea portátil sin la base de datos del proyecto:
for i in range(project.GetTimelineCount()):
t = project.GetTimelineByIndex(i+1)
t.Export(os.path.join(d, t.GetName() + ".drt"), resolve.EXPORT_DRT)
resolve.GetProjectManager().ExportProject(project.GetName(), os.path.join(d, project.GetName() + ".drp"))
- Renderiza directamente en ella. Establece el
TargetDirde Resolve en<esa carpeta>/Reels, para que no haya que mover nada después. - Renombra según los nombres de las líneas de tiempo de Resolve.
Reel_2_-_my_best_tip.mp4se convierte en2. my best tip.mp4: numerados para que se ordenen, legibles de un vistazo. Mismos nombres para los maestros y los archivos .drt, para que las tres carpetas coincidan. - Mueve, no copies.
~/Movies/<video>-*contiene archivos de trabajo (whisper JSON, SRTs, overlay movs, caption movs). Esos se quedan para re-renderizados; las exportaciones terminadas se van. - Escribe
Posting schedule.txtdespués de la programación, listando la fecha, hora y redes de cada reel, para que el usuario pueda ver lo que ya se ha publicado sin abrir Metricool.
Menciona el espacio en disco solo si un renderizado realmente falla por espacio, o si un par de video largo claramente no cabe.
Portadas (solo Instagram)
Cada reel recibe una portada personalizada de Instagram antes de programarse. Ejecuta el skill reel-covers después de que los pies de foto estén aprobados y antes de programar. Devuelve un JPG aprobado por reel en <Video>/Covers/. Muestra las portadas en la misma compuerta que los pies de foto y los espacios, para que todo se apruebe de una vez.
Sube cada portada a través del mismo salto de Drive que el video (misma carpeta <YOUR_DRIVE_UPLOAD_FOLDER_ID>, mimeType: image/jpeg), y pásala como videoThumbnailUrl usando la forma uc?id=...&export=download. Elimina la copia de Drive una vez que Metricool tenga su propia copia, igual que con el video.
Programación
Una publicación por reel, las tres redes, portada incluida. La portada solo importa en Instagram. TikTok la ignora en una cuenta personal, y Shorts solo la muestra en un canal verificado. No dividas la publicación.
"providers":[{"network":"instagram"},{"network":"tiktok"},{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<video id>&export=download"],
"videoThumbnailUrl":"https://drive.google.com/uc?id=<cover id>&export=download",
"instagramData":{"type":"REEL","showReelOnFeed":true,"isAiGenerated":false},
"tiktokData":{"privacyOption":"PUBLIC_TO_EVERYONE","title":"<título corto>"},
"youtubeData":{"type":"short","privacy":"public","madeForKids":false,"title":"<título, <100 caracteres>"}
- Agregar una portada a una publicación ya programada:
updateScheduledPostcon todos los campos originales de la publicación (texto, proveedores, medios, todos los datos de la red, fecha) másvideoThumbnailUrl. Sobrescribe y no tiene deshacer, así que copia los campos degetScheduledPoststextualmente. Nunca reemplaces unvideoThumbnailUrlovideoCoverMillisecondsexistente: una publicación que tenga cualquiera de ellos ya tiene una portada elegida. - Si una actualización falla con 'Error al normalizar el medio' mientras que las otras funcionaron, la obtención de Drive falló esa vez. La publicación queda sin cambios. Vuelve a subir el archivo (nuevo id) y reintenta. Reintentar la misma URL no ayudará.
- Luego verifica con
getScheduledPostsque cadavideoThumbnailUrlde la publicación comience ahora constatic.metricool.com, y elimina las copias de Drive. - YouTube requiere un título y
madeForKids. TikTok quiere un título corto. autoPublish: truepermite que Metricool lo publique automáticamente.
Cuándo programar (regla predeterminada, ajústala al gusto)
Empieza el día después de hoy. Una publicación por día. Si un día ya tiene contenido, pasa al siguiente día libre.
día = mañana
para cada publicación en orden:
mientras el día ya tenga una publicación programada: día += 1
programa a <YOUR_POST_TIME> hora local en ese día
día += 1
<YOUR_POST_TIME>en<YOUR_TIMEZONE>es la hora de publicación predeterminada.- Siempre llama a
getScheduledPostsprimero, cubriendo desde mañana hasta mañana + (número de publicaciones + 14 días), para que puedas ver los espacios. Saltarse esta verificación puede colocar una publicación en un espacio ya ocupado. - Un día cuenta como ocupado si cualquier cosa está programada ese día, incluidos los borradores.
- No acumules varias publicaciones en un día y no dejes huecos: el objetivo es una ejecución diaria constante que comience de inmediato.
- Nunca pongas una etiqueta de prueba en el texto del pie de foto. Sin 'BORRADOR DE PRUEBA', sin 'seguro de eliminar'. El pie de foto es la copia final, siempre, incluso en una prueba; el usuario puede querer conservarlo.
Marca las publicaciones de prueba con
draft: true+autoPublish: false(los borradores son visualmente distintos en el planificador) y entrega elplannerUrlmás el id de la publicación para que se pueda eliminar con un clic.
YouTube de formato largo (el video principal, no un Short)
Recomendado: no envíes archivos grandes de formato largo a través de Metricool. Súbelos en YouTube Studio. Una exportación de ~1GB enviada a través de Metricool puede almacenarse truncada a mitad de la transferencia. Resolve coloca el índice MP4 (moov) al final del archivo, por lo que una copia truncada es ilegible, y YouTube informa 'procesamiento abandonado' después de que ya ha 'publicado'. Metricool puede no informar un error. Entrega al usuario el archivo, título, descripción y miniatura para pegarlos en Studio, renderizado en 4K (Studio no tiene problemas de tamaño). Todo lo siguiente se mantiene como referencia.
Si se usa Metricool para un archivo grande, verifica el archivo almacenado en su almacenamiento antes de publicarlo.
...
[truncado para la traducción]