HomeBlogTranscribePlansAPI Keys

YouTube Transcript i PHP: cURL på billig delt hosting

PHP-skript på delt hosting som henter en YouTube-transkripsjon via cURL

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.