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

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.