YouTube Transkription i PHP: cURL på billigt delat värdskap

Jag testade detta på det billigaste delade värdskapet jag kunde hitta: PHP 8.1, ingen Composer, ingen skalaccess, filer uppladdade via FTP som om det är 2009. Det fungerar, för att hämta en YouTube-transkription i PHP behövs exakt två saker som varje värdskap har skeppat i tjugo år — curl-tillägget och json_decode. I slutet av det här inlägget har du en enda fil som tar en YouTube URL och skriver ut titeln och transkriptionen, med sunda grenar för varje fel API:t kan returnera.
Den delade värdskapsvinkel spelar roll mer än det låter. Skrapa bibliotek hämtar bildtexter från YouTube direkt, och delade värdskaps-IP:ar är bland de första intervallen YouTube blockerar — du delar en IP med hundratals andra webbplatser, några av dem dåligt beter. Allt använt dokumenteras i varför transkriptionskrapare blockeras. Anrop till ett hosted API hoppar över allt det: ditt värdskap talar bara till 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";
}
}
Ställ in YT2TEXT_KEY i din värdskaps kontrollpanel, eller hårdkoda det om du måste — håll bara filen ur ditt arkiv om du gör det. Parametern url tar valfri YouTube URL-format eller ett enkelt 11-tecken video-id, och det finns en valfri maxChars-parameter (standard och max 150000) för att begränsa utmatningen.
json_decode-vaktens är inte valfri
Den $data === null-kontrollen tjänar sin vind på delat värdskap specifikt. När en värdskaps proxy timeout eller en mod_security-regel brandceller får du en HTML-felsida, inte JSON — och utan vakten kraschar ditt skript på en arrayåtkomst tre rader senare med ett värdelöst meddelande. Kontrollera avkodningen innan du rör formen.
Få en nyckel utan ett konto
$demo = json_decode(
file_get_contents("https://youtube2text.org/api/demo-key"),
true
);
echo $demo["apiKey"]; // yt_...
Ärlig småtryck: demo-nyckeln delas bland alla som begär den och tillåter 5 videor per månad per IP. På delat värdskap är den IP:n också delad med din servers grannar, så behandla demo-nyckeln som ett femminuterstest, inte en plan.
Också värt att veta: transkriptioner kommer från Youtubes bildtextsspår, manuella eller automatiskt genererade. Engelska föredras, först tillgängligt språk annars — och en video med inaktiverad bildtexter returnerar TRANSCRIPT_UNAVAILABLE, permanent. Bygga din slinga för att hoppa dessa.
Vart PHP-folk tar det här
Det vanligaste kravet jag får från PHP-utvecklare är WordPress-format: dra en transkription, hand den till en LLM, publicera ett utkast. Hela pipelinen täcks i omvandla en YouTube-video till ett blogginlägg, och podcastvarianten i genererar visningsanteckningar från YouTube.
När demo-nyckeln slutar räcka till, logga in med Google på youtube2text.org/app/keys — inget kort och inget telefonnummer, din egen gratis 5-videoer-a-månad-nyckel, och betalade nivåer från $5,99. Skriptet ovan stannar byte-för-byte identiskt.