Resultados en 3 días
Lo que generaron estos reels en Instagram entre el 28 y el 30 de junio. 100% del alcance vino de Reels.
Empieza aquí
4 pasos para dejar tu canal listo. Marca cada uno y te lleva al siguiente. Tus avances se guardan en este navegador.
-
1 Localiza la carpeta de tus videos Paso 1
Pega aquí la ruta de la carpeta donde están tus
.mp4finales (verticales, ya editados).Se guarda solo en tu navegador. -
2 Conecta tu Google Drive a Claude Paso 2
Conecta el conector de Google Drive en Claude (conectores / adjuntar) y prepara la carpeta:
- aCrea una carpeta en Google Drive (p. ej. "Reels").
- bHazla pública → Compartir → "Cualquiera con el enlace → Lector". Si está privada, Upload-Post no puede descargar los videos.
- cCopia el link de la carpeta y pégalo aquí abajo.
Déjala pública hasta que salga todo lo programado. -
3 Crea tu cuenta en Upload-Post Paso 3
Regístrate en Upload-Post, entra a API Keys y copia tu key. Pégala aquí.
Se guarda solo en tu navegador. -
4 Conecta tus redes Paso 4
Dentro de Upload-Post, conecta por OAuth cada red donde quieras publicar. Marca las que ya conectaste:
Instagram TikTok YouTube FacebookInstagram debe ser cuenta profesional/creador. -
5 Sube esta receta a Claude Code y observa la magia Paso 5
Descarga tu receta.md — ya lleva tu ruta, tu API key, tus redes y todo el proceso paso a paso. Ábrela en Claude Code (en la carpeta de tu proyecto) y escribe: "sigue la receta y publica". Claude subirá los videos a Drive, escribirá los copies y los programará en tus redes. ✨
Incluye tu configuración + la guía completa.
¡Listo! Ya tienes tu receta.
Ábrela en Claude Code y escribe "sigue la receta y publica".
El flujo, de principio a fin
Los videos viven en una carpeta pública de Drive; a Upload-Post le pasas una URL por video y él lo descarga y publica en las 4 redes.
El servidor corta la subida a los ~60 s. Un .mp4 de 30–80 MB desde una conexión casera no alcanza a subir en ese tiempo. Pasando una URL de Drive, la descarga la hace Upload-Post desde su servidor (rápido), sin límite de 60 s y con calidad original.
Requisitos previos
Configuración de una sola vez.
- 1Cuenta + API key de Upload-Post. Guárdala en
apikey.txt. Toda llamada llevaAuthorization: Apikey <KEY>. - 2Perfil + redes por OAuth. Crea un perfil (parámetro
user) y conecta IG, TikTok, YouTube y Facebook. Instagram debe ser cuenta profesional/creador. - 3Carpeta de Drive pública — "Cualquiera con el enlace → Lector". Si está privada, el server cae en el login de Google. Mantenla pública hasta que salga lo programado.
- 4rclone con un remoto Drive (
root_folder_id= tu carpeta). El token OAuth se auto-renueva. - 5Node.js (trae
fetch/FormData), ffmpeg/ffprobe y curl.
Verificar redes conectadas
curl -s -H "Authorization: Apikey $KEY" \
https://api.upload-post.com/api/uploadposts/users
# → profiles[].social_accounts con cada red, su handle y reauth_required
Preparar videos y subirlos a Drive
Vertical 9:16 (1080×1920), <3 min, mp4 H.264 + AAC con +faststart.
Medir un video
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height -show_entries format=duration \
-of default=noprint_wrappers=1 "video.mp4"
# ffprobe también funciona sobre una URL (lee por rangos HTTP)
Subir con rclone y obtener el File ID
export RCLONE_CONFIG="/ruta/rclone.conf"
rclone copyto "local/Cancion_FINAL.mp4" "gdrive:Cancion_FINAL.mp4" --drive-chunk-size 32M
# Mismo nombre = actualiza el archivo y conserva el mismo File ID (clave para reemplazos)
rclone lsf gdrive: --files-only --format "ip" # imprime <id>;<nombre>
Validar la URL (sin gastar cuota)
# URL directa: https://drive.google.com/uc?export=download&id=<FILE_ID>
curl -sL "https://drive.google.com/uc?export=download&id=<ID>" \
-o probe.bin -r 0-1048576 -w "%{content_type}\n"
# Debe dar video/mp4. Si da text/html → la carpeta NO es pública.
Copy, portada y publicación
El endpoint que lo hace todo, con sus campos.
El caption
Estilo limpio: Canción, de Artista: mensaje corto. 🎭
O con hashtags: gancho + emoji + 3 hashtags (artista, canción, género).
Portada sin frame negro
thumb_offset = el milisegundo de portada. Regla: duración×1000÷2 (cuadro intermedio). No aplica a TikTok.
Upload-Post usa tu title como título del video de YouTube, y YouTube rechaza títulos >100 (HTTP 400). Manda un youtube_title aparte (≤100); solo afecta a YouTube.
POST /api/upload
| Campo | Valor |
|---|---|
user | tu perfil |
platform[] | uno por red (repite el campo) |
video | URL de Drive (string, sin @) |
title | caption (IG/TikTok/FB) |
youtube_title | ≤100 para YouTube |
thumb_offset | ms de portada |
async_upload | true |
scheduled_date | ISO-8601 c/offset (omitir = ya) |
timezone | America/Mexico_City |
Script en Node (maneja acentos, emojis y comillas)
import fs from 'fs';
const KEY = fs.readFileSync('apikey.txt','utf8').trim();
const DRIVE = id => `https://drive.google.com/uc?export=download&id=${id}`;
async function schedule(v){ // {platforms, thumb_ms, caption, yt, id, date}
const fd = new FormData();
fd.append('user','mi_canal');
for(const p of v.platforms.split(';')) fd.append('platform[]', p);
fd.append('async_upload','true');
fd.append('thumb_offset', String(v.thumb_ms));
fd.append('title', v.caption);
fd.append('youtube_title', v.yt); // ≤100 chars
fd.append('video', DRIVE(v.id));
fd.append('scheduled_date', v.date);
fd.append('timezone','America/Mexico_City');
const r = await fetch('https://api.upload-post.com/api/upload',
{ method:'POST', headers:{ Authorization:`Apikey ${KEY}` }, body: fd });
return (await r.json()).request_id; // guárdalo en tu CSV
}
· Escribe los scripts como archivo, no con here-docs de bash (los emojis/apóstrofes rompen <<EOF). · Guarda el CSV tras cada envío para no perder request_id si hay timeout.
Calendario y cobertura
Cadencia fija, sin duplicados, todo a Shorts.
YouTube marca como Short automáticamente si el video es vertical (9:16) y dura menos de 3 min. No hay parámetro: es por formato + duración.
Verificar y detectar duplicados
Cadencia p. ej. 3/día a las 10:00, 17:00 y 22:00. La API guarda en UTC (10:00 −06:00 = 16:00Z). Cada programado trae su job_id (≠ request_id).
curl -s -H "Authorization: Apikey $KEY" "…/api/uploadposts/schedule?limit=100"
# .scheduled_posts[] → job_id, scheduled_date, title. Agrupa por canción:
# si aparece 2+ veces, sobran → DELETE de los duplicados.
Gestionar los programados
Cancelar, editar y reemplazar sin romper YouTube.
DELETE Cancelar
curl -X DELETE -H "Authorization: Apikey $KEY" \
"…/api/uploadposts/schedule/<job_id>"
PATCH Editar
curl -X PATCH "…/schedule/<job_id>" \
-H "Content-Type: application/json" \
-H "Authorization: Apikey $KEY" \
-d '{"title":"…","scheduled_date":"…"}'
Solo acepta title, caption, scheduled_date, timezone — no youtube_title. El título se aplica también a YouTube: si el caption pasa de 100, fallará al publicar. Usa PATCH solo para la fecha o captions ≤100.
Cancelar + recrear (vía segura)
- 1
DELETEel programado viejo. - 2
POSTde nuevo con misma fecha/portada + title largo + youtube_title corto. - 3Guarda el nuevo
request_id; verifica total y 0 duplicados.
Reemplazar un re-render
Al programar, Upload-Post descarga y cachea el video. Cambiar solo el archivo en Drive no actualiza el post.
- 1Sobrescribe en Drive (mismo nombre → mismo File ID).
- 2Confirma que la URL entrega el archivo nuevo (
Content-Lengthcambió). - 3Cancela el programado viejo y recréalo → descarga la versión nueva.
Reformatear en lote
Para cambiar el estilo de todas las captions: recorre GET /schedule. Si el cambio no toca YouTube o queda ≤100 → PATCH; si supera 100 → cancelar + recrear con youtube_title corto.
Guarda el CSV tras cada uno y agrega un guard ("si ya tiene la caption nueva, omite") para reejecutar sin duplicar tras un timeout.
Errores comunes y solución
| Síntoma | Causa | Solución |
|---|---|---|
content_type=text/html | Carpeta de Drive privada | Compartir "Cualquiera con el enlace → Lector" |
HTTP 400 YouTube title too long | Caption >100 como título YT | Mandar youtube_title ≤100 aparte |
| La subida corta a los 60 s | Subida lenta + límite del server | Usar URL de Drive |
| Salió el video viejo tras re-render | Se cacheó al programar | Cancelar + recrear |
| Misma canción publicada 2 veces | Duplicados en la cola | GET /schedule → DELETE sobrantes |
| Portada negra | Frame 0 negro | thumb_offset = dur×1000÷2 |
| bash: "unexpected EOF" | Apóstrofes/emojis en here-doc | Escribir el script como archivo |
Node no halla /tmp/x | Windows lo resuelve a C:\tmp | Usar rutas del directorio de trabajo |
Checklist de un lote
- 1Videos 1080×1920, <3 min, +faststart.
- 2
rclone copytoa Drive público. - 3File IDs + validar 1–2 URLs.
- 4
ffprobeduración →thumb_offset. - 5Caption +
youtube_title(≤100). - 6Cadencia +
scheduled_date. - 7
POST; guardarrequest_id. - 8
GET /schedule: 0 duplicados. - 9Drive público hasta el último programado.
Endpoints
| Método | Endpoint |
|---|---|
| POST | /api/upload |
| GET | /…/users |
| GET | /…/status?request_id= |
| GET | /…/history |
| GET | /…/schedule?limit=100 |
| PATCH | /…/schedule/<job_id> |
| DELETE | /…/schedule/<job_id> |
Base https://api.upload-post.com · header Authorization: Apikey <KEY>