HomeBlogTranscribePlansAPI Keys

YouTube-Transkript in PHP: cURL auf billiger gemeinsamer Webhosting

PHP-Skript auf gemeinsamer Webhosting, das ein YouTube-Transkript via cURL abruft

Ich testete das auf dem billigsten gemeinsamen Host, den ich finden konnte: PHP 8.1, keine Composer, kein Shell-Zugriff, Dateien über FTP hochgeladen, wie es 2009 ist. Es funktioniert, weil ein YouTube-Transkript in PHP genau zwei Dinge braucht, die jeder Host seit zwanzig Jahren versendet — die curl-Erweiterung und json_decode. Am Ende dieses Beitrags hast du eine einzelne Datei, die eine YouTube-URL nimmt und den Titel und das Transkript druckt, mit sanften Branches für jeden Fehler, den die API zurückgeben kann.

Dieser Gemeinsam-Hosting-Winkel zählt mehr, als es klingt. Scraper-Bibliotheken holen Untertitel direkt von YouTube, und Gemeinsam-Hosting-IPs sind unter den ersten Bereichen, die YouTube blockiert — du teilst eine IP mit hunderten anderen Websites, einige von ihnen schlecht verhalten. Das komplette Durcheinander ist dokumentiert in warum Transkript-Scraper blockiert werden. Einen gehosteten API anrufen umgeht das alles: dein Host spricht nur jemals zu youtube2text.org.

Das Skript

<?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";
    }
}

Setze YT2TEXT_KEY in das Kontrollpanel deines Hosts, oder hardcode es, wenn du musst — behalte einfach die Datei aus deinem Repo, wenn du es tust. Der url-Parameter nimmt jedes YouTube-URL-Format oder eine nackte 11-stellige Video-ID, und es gibt einen optionalen maxChars-Parameter (Standard und Maximum 150000) zum Begrenzen der Ausgabe.

Der json_decode-Wächter ist nicht optional

Diese $data === null Überprüfung verdient es speziell auf gemeinsamer Webhosting. Wenn ein Host-Proxy-Timeout ausfällt oder eine mod_security-Regel feuert, bekommst du eine HTML-Fehlerseite, nicht JSON — und ohne den Wächter fällt dein Skript drei Zeilen später mit einer nutzlosen Nachricht auf einem Array-Zugriff fatal. Überprüfe die Dekodierung vor dem Berühren der Form.

Einen Schlüssel ohne Konto abrufen

$demo = json_decode(
    file_get_contents("https://youtube2text.org/api/demo-key"),
    true
);
echo $demo["apiKey"]; // yt_...

Ehrliches Kleingedrucktes: Der Demo-Schlüssel wird unter jedem geteilt, der ihn anfordert und erlaubt 5 Videos pro Monat pro IP. Auf gemeinsamer Webhosting wird diese IP auch mit deinen Server-Nachbarn geteilt, daher behandle den Demo-Schlüssel als einen Fünf-Minuten-Test, nicht einen Plan.

Auch wissenswert: Transkripte stammen von YouTubes Untertitelspuren, manuell oder automatisch generiert. Englisch ist bevorzugt, erste verfügbare Sprache sonst — und ein Video mit deaktivierten Untertiteln gibt TRANSCRIPT_UNAVAILABLE zurück, permanent. Baue deine Schleife zum Überspringen dieser.

Wohin PHP Leute das nehmen

Die häufigste Anfrage, die ich von PHP-Entwicklern bekomme, ist WordPress-Form: einen Transkript abrufen, an ein LLM übergeben, einen Entwurf veröffentlichen. Diese ganze Pipeline ist covered in eine YouTube-Video in einen Blog-Beitrag verwandeln, und die Podcast-Variante in Show-Notizen von YouTube generieren.

Wenn der Demo-Schlüssel nicht mehr genug ist, melde dich mit Google bei youtube2text.org/app/keys an — keine Karte und keine Telefonnummer, ein kostenlos 5-Videos-pro-Monat-Schlüssel dein eigener, und bezahlte Stufen ab $5,99. Das obige Skript bleibt Byte-für-Byte identisch.