YouTube Transcript i PHP: cURL på billig delt hosting

Jeg testet dette på den billigste delte verts jeg kunne finne: PHP 8.1, ingen Composer, ingen shell-tilgang, filer lastet opp over FTP som det er 2009. Det fungerer, fordi å hente en YouTube-transkripsjon i PHP trenger nøyaktig to ting hver vert har sendt i tjue år — curl-utvidelsen og json_decode. På slutten av denne posten får du en enkelt fil som tar en YouTube-URL og skriver ut tittelen og transkripsjonen, med fornuftige grener for hver feil APIen kan returnere.
Den delte vertsvinkel betyr mer enn den høres ut. Skraper-biblioteker henter tekst fra YouTube direkte, og delt vertsbeslag IP-er er blant de første områdene YouTube blokkerer — du deler en IP med hundrevis av andre nettsider, noen av dem dårlig oppført. Det fulle rotet er dokumentert i hvorfor transkripsjon skrapere blir blokkert. Å kalle en hostet API omgår det hele: verts din snakker bare til youtube2text.org.
Skriptet
<?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";
}
}
Sett YT2TEXT_KEY i verts kontrollpanel, eller hardkode det hvis du må — hold bare filen ute av repo hvis du gjør det. url-parameteren tar noen YouTube URL-format eller en bare 11-tegn video-id, og det er en valgfri maxChars-parameter (standard og maks 150000) for å begrense utdata.
json_decode-vaktpostenen er ikke valgfritt
Sjekken $data === null tjener den på delt hosting spesifikt. Når verts proxy-timeout eller en mod_security regel fyrer, får du en HTML feil-side, ikke JSON — og uten vaktposten faller skriptet ditt ned på en array-tilgang tre linjer senere med en ubrukelig melding. Sjekk dekoden før du berører formen.
Få en nøkkel uten en konto
$demo = json_decode(
file_get_contents("https://youtube2text.org/api/demo-key"),
true
);
echo $demo["apiKey"]; // yt_...
Ærlig grunnlov: demo-nøkkelen deles blant alle som forespør den og tillater 5 videoer per måned per IP. På delt hosting er den IP-en også delt med server-naboene, så behandle demo-nøkkelen som en fem-minutters test, ikke en plan.
Også verdt å vite: transkripsjoner kommer fra YouTubes undertekstspor, manuell eller auto-generert. Engelsk foretrukket, første tilgjengelige språk ellers — og en video med tekst deaktivert returnerer TRANSCRIPT_UNAVAILABLE, permanent. Bygg løkken din for å hoppe disse.
Hvor PHP folk tar det
Den mest vanlige forespørselen jeg får fra PHP-utviklere er WordPress-formet: trekk en transkripsjon, hånd det til en LLM, publiser et utkast. Den hele rørledningen dekkes i gjøre en YouTube-video til en blogg-post, og podcast-varianten i generere show-noter fra YouTube.
Når demo-nøkkelen slutter å være nok, logg inn med Google på youtube2text.org/app/keys — intet kort og intet telefon-nummer, en gratis 5-videoer-en-måned nøkkel av din selv, og betalte nivåer fra $5.99. Skriptet ovenfor forblir byte-for-byte identisk.