Transcripción de YouTube en PHP: cURL en Alojamiento Compartido Barato

Lo probé en el alojamiento compartido más barato que pude encontrar: PHP 8.1, sin Composer, sin acceso a shell, archivos subidos por FTP como si fuera 2009. Funciona, porque obtener una transcripción de YouTube en PHP necesita exactamente dos cosas que cada host ha enviado durante veinte años — la extensión curl y json_decode. Al final de este post tendrás un archivo único que toma una URL de YouTube e imprime el título y la transcripción, con ramas sensatas para cada error que la API puede devolver.
Ese ángulo de alojamiento compartido importa más de lo que suena. Las bibliotecas de raspado obtienen subtítulos de YouTube directamente, y los IPs de alojamiento compartido están entre los primeros rangos que YouTube bloquea — estás compartiendo una IP con cientos de otros sitios, algunos de ellos mal comportados. El lío completo está documentado en por qué los raspadores de transcripción se bloquean. Llamar a una API alojada evita todo eso: tu host solo habla con youtube2text.org.
El script
<?php
$videoUrl = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
$endpoint = "https://youtube2text.org/api/transcribe?url=" . urlencode($videoUrl);
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["x-api-key: " . getenv("YT2TEXT_KEY")],
CURLOPT_TIMEOUT => 60,
]);
$raw = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($raw === false) {
exit("Network error\n");
}
$data = json_decode($raw, true);
if ($data === null) {
exit("Response was not JSON (status $status)\n");
}
if ($status === 200) {
echo $data["result"]["title"], "\n";
echo $data["result"]["contentSize"], " characters\n";
echo substr($data["result"]["content"], 0, 500), "\n";
} else {
$err = $data["error"];
if ($err["code"] === "RATE_LIMIT_EXCEEDED") {
echo "Rate limited. Retry in ", $err["retryAfterSeconds"], " seconds.\n";
} elseif ($err["code"] === "TRANSCRIPT_UNAVAILABLE") {
echo "This video has no captions. Nothing to fetch.\n";
} else {
echo $err["code"], ": ", $err["message"], "\n";
}
}
Establece YT2TEXT_KEY en el panel de control de tu host, o codifícalo si debes — solo mantén el archivo fuera de tu repo si lo haces. El parámetro url toma cualquier formato de URL de YouTube o un id de video de 11 caracteres desnudo, y hay un parámetro maxChars opcional (predeterminado y máximo 150000) para limitar la salida.
La guardia json_decode no es opcional
Esa verificación $data === null gana su sueldo en alojamiento compartido específicamente. Cuando el proxy de un host agota el tiempo o dispara una regla mod_security, obtienes una página de error HTML, no JSON — y sin la guardia tu script fatals en un acceso de matriz tres líneas más tarde con un mensaje inútil. Comprueba la decodificación antes de tocar la forma.
Obtener una clave sin una cuenta
$demo = json_decode(
file_get_contents("https://youtube2text.org/api/demo-key"),
true
);
echo $demo["apiKey"]; // yt_...
Letra pequeña honesta: la clave demo se comparte entre todos los que la solicitan y permite 5 videos por mes por IP. En alojamiento compartido, esa IP también se comparte con tus vecinos del servidor, así que trata la clave demo como una prueba de cinco minutos, no un plan.
También vale la pena saber: las transcripciones provienen de las pistas de subtítulos de YouTube, manual o generadas automáticamente. Inglés es preferido, primer idioma disponible de otra manera — y un video con subtítulos desactivados devuelve TRANSCRIPT_UNAVAILABLE, permanentemente. Construye tu bucle para omitir esos.
A dónde la gente de PHP lleva esto
La solicitud más común que recibo de desarrolladores de PHP es de forma WordPress: obtén una transcripción, pásala a un LLM, publica un borrador. Ese pipeline completo está cubierto en convertir un video de YouTube en un post de blog, y la variante de podcast en generar notas de espectáculo de YouTube.
Cuando la clave demo deja de ser suficiente, inicia sesión con Google en youtube2text.org/app/keys — sin tarjeta y sin número de teléfono, una clave gratuita de 5 videos-al-mes que es tuya, y niveles pagados desde $5.99. El script anterior se mantiene idéntico byte por byte.