Transcription YouTube en PHP : cURL sur hébergement partagé bon marché

J'ai testé cela sur l'hébergement partagé le moins cher que j'ai pu trouver : PHP 8.1, pas de Composer, pas d'accès shell, fichiers téléchargés sur FTP comme c'était 2009. Ça fonctionne, parce que récupérer une transcription YouTube en PHP a besoin de exactement deux choses que chaque hôte a expédié pendant vingt ans — l'extension curl et json_decode. À la fin de cet article, vous aurez un seul fichier qui prend une URL YouTube et imprime le titre et la transcription, avec des branches sensées pour chaque erreur que l'API peut retourner.
Cet angle d'hébergement partagé compte plus qu'il ne le semble. Les bibliothèques de gratteurs récupèrent les sous-titres directement de YouTube, et les IP d'hébergement partagé sont parmi les premières plages que YouTube bloque — vous partagez une IP avec des centaines d'autres sites, certains d'eux mal comportés. Le gâchis complet est documenté dans pourquoi les gratteurs de transcription se font bloquer. Appeler une API hébergée évite tout cela : votre hôte ne parle qu'à youtube2text.org.
Le 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";
}
}
Réglez YT2TEXT_KEY dans le panneau de contrôle de votre hôte, ou codez-le en dur si vous devez — gardez juste le fichier hors de votre repo si vous le faites. Le paramètre url accepte n'importe quel format d'URL YouTube ou un identifiant vidéo nu de 11 caractères, et il y a un paramètre optionnel maxChars (par défaut et max 150000) pour plafonner la sortie.
La garde json_decode n'est pas optionnelle
Cette vérification $data === null gagne son salaire sur l'hébergement partagé spécifiquement. Quand un proxy de l'hôte expire ou qu'une règle mod_security se déclenche, vous obtenez une page d'erreur HTML, pas du JSON — et sans la garde votre script fatal à un accès de tableau trois lignes plus tard avec un message inutile. Vérifiez le décodage avant de toucher la forme.
Obtenir une clé sans compte
$demo = json_decode(
file_get_contents("https://youtube2text.org/api/demo-key"),
true
);
echo $demo["apiKey"]; // yt_...
Honnête note fine : la clé démo est partagée entre tous ceux qui la demandent et permet 5 vidéos par mois par IP. Sur hébergement partagé, cette IP est aussi partagée avec vos voisins serveur, donc traitez la clé démo comme un test de cinq minutes, pas un plan.
Aussi à savoir : les transcriptions proviennent des pistes de sous-titres de YouTube, manuelles ou auto-générées. L'anglais est préféré, première langue disponible sinon — et une vidéo avec sous-titres désactivés retourne TRANSCRIPT_UNAVAILABLE, de manière permanente. Construisez votre boucle pour ignorer celles-ci.
Où les gens PHP le prennent
La demande la plus courante que je reçois des développeurs PHP est de la forme WordPress : tirer une transcription, la donner à un LLM, publier un brouillon. Ce pipeline entier est couvert dans transformer une vidéo YouTube en article de blog, et la variante podcast dans générer des notes de spectacle à partir de YouTube.
Quand la clé démo ne suffit plus, connectez-vous avec Google sur youtube2text.org/app/keys — pas de carte et pas de numéro de téléphone, une clé gratuite de 5 vidéos par mois qui vous appartient, et les plans payants de $5.99. Le script ci-dessus reste byte-for-byte identique.