HomeBlogTranscribePlansAPI Keys

Transkrypcja YouTube w PHP: cURL na Tanich Hostingach Wspólnych

Skrypt PHP na wspólnym hostingu pobierający transkrypcję YouTube via cURL

Testowałem to na najtańszym wspólnym hoście, jaki mogę znaleźć: PHP 8.1, brak Composera, brak dostępu shell, pliki przesyłane przez FTP, jakby to był 2009. Działa, ponieważ pobieranie transkrypcji YouTube w PHP potrzebuje dokładnie dwie rzeczy każdy host wysyłał przez dwadzieścia lat — rozszerzenie curl i json_decode. Na koniec tego postu będziesz mieć jeden plik, który przyjmuje adres URL YouTube i wydrukuje tytuł i transkrypcję, z rozsądnymi gałęziami dla każdego błędu API mogą wrócić.

Ten wspólny-hosting kąt oznacza więcej, niż to brzmi. Biblioteki scraperow pobierają napisy bezpośrednio z YouTube, i wspólne IP hostingu są wśród pierwszych zakresów YouTube blokady — dzielisz IP ze setkami innych witryn, niektóre z nich źle się zachowują. Cały bałagan jest udokumentowany w dlaczego scraperzy transkrypcji zostają blokowani. Wywoływanie hostowanego API zmienia się z tym całkowicie: Twój host rozmawia tylko z youtube2text.org.

Skrypt

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

Ustawić YT2TEXT_KEY w panelu sterowania Twojego hosta, lub zakoduj na stałe, jeśli musisz — trzymaj plik spoza repozytorium, jeśli to zrobisz. Parametr url przyjmuje format URL YouTube lub gołe 11-znakowe id wideo, i jest opcjonalny parametr maxChars (domyślnie i maksimum 150000) do ograniczania wyjścia.

Ochrona json_decode nie jest opcjonalna

To $data === null sprawdzenie zarabia swoje utrzymanie na wspólnym hostingu specjalnie. Gdy proxy hosta się przekraczają lub reguła mod_security pali, otrzymujesz stronę błędu HTML, nie JSON — a bez ochrony Twój skrypt fatals na dostępie tablicy trzy linie później z bezużyteczną wiadomością. Sprawdź dekodowanie przed dotknięciem kształtu.

Uzyskiwanie klucza bez konta

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

Szczera drukowana małą czcionką: klucz demo jest wspólny dla wszystkich, którzy go proszą i pozwala 5 filmów na miesiąc na IP. Na wspólnym hostingu to IP jest również dzielone z sąsiadami Twojego serwera, więc traktuj klucz demo jako pięciominutowy test, nie plan.

Również warte wiedzenia: transkrypcje pochodzą z pasów napisów YouTube, ręczny lub autogenerowany. Angielski jest preferowany, pierwszy dostępny język w innym razie — i film z wyłączonymi napisami zwraca TRANSCRIPT_UNAVAILABLE, trwale. Zbuduj pętlę, aby pominąć te.

Gdzie idą personel PHP

Najczęstsze żądanie, które otrzymuję od programistów PHP, jest kształtem WordPress: pobierz transkrypcję, przekaż to do LLM, publikuj projekt. Cały ten rurociąg jest pokryty w zamienianie wideo YouTube w post na blogu, i wariant podcastu w generowanie notatek pokazu z YouTube.

Gdy klucz demo przestaje być wystarczający, zaloguj się za pomocą Google na youtube2text.org/app/keys — brak karty i brak numeru telefonu, bezpłatny klucz 5-filmów-miesiąc Twoim, i płatne poziomy od 5,99 USD. Skrypt powyżej pozostaje byte-for-byte identyczny.