YouTube Transkriptio PHP:ssä: cURL halpalla jaetulla isännöinnillä

Testasin tätä halvimmalla jaetulla isännöinnillä, jonka löysin: PHP 8.1, ei Composeria, ei shell-pääsyä, tiedostot ladatut FTP:n kautta kuin se olisi 2009. Se toimii, koska YouTube-transkription hankkiminen PHP:ssä tarvitsee täsmälleen kaksi asiaa, joita jokaisella isännöinnillä on toimitettu kaksikymmentä vuotta — curl-laajennos ja json_decode. Tämän viestin loppuun mennessä sinulla on yksi tiedosto, joka ottaa YouTube-URL:n ja tulostaa otsikon ja transkription, joilla on järkevät haarat jokaista virhettä, jonka API voi palauttaa.
Jaetun isännöinnin kulma on tärkeämpi kuin se kuulostaa. Kaavija-kirjastot hakevat kuvatekstejä YouTubesta suoraan, ja jaetun isännöinnin IP-alueet ovat ensimmäisten joukossa, joita YouTube estää — jaat IP:ta satojen muiden sivustojen kanssa, joista jotkin käyttäytyvät huonosti. Koko sotkua käsitellään kohdassa miksi transkriptio kaavijat estetään. Isännöidyn API:n kutsu välttää kaiken: isännöinti puhuu vain youtube2text.org:n kanssa.
Skripti
<?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";
}
}
Aseta YT2TEXT_KEY isännöinnin ohjauspaneelissa tai kovakoodaa se, jos sinun täytyy — pitää vain tiedoston pois reposta, jos teet. url-parametri hyväksyy minkä tahansa YouTube URL -muodon tai paljaiden 11-merkkisen video-tunnuksen ja siellä on valinnainen maxChars-parametri (oletusarvo ja maksimi 150000) tuotoksen rajoittamiseksi.
json_decode-vartio ei ole valinnainen
Tuo $data === null tarkistus ansaitsee säästönsä jaetulla isännöinnillä erityisesti. Kun isännöinnin välityspalvelin aikakatkeaa tai mod_security-sääntö ampuu, saat HTML virhe-sivua, ei JSON:ia — ja ilman vartiota skriptisi silmät puuttuvalla taulukkoon kolme riviä myöhemmin hyödyttömällä viestillä. Tarkista dekoodaus ennen muodon koskemista.
Avaimen hankkiminen ilman tiliä
$demo = json_decode(
file_get_contents("https://youtube2text.org/api/demo-key"),
true
);
echo $demo["apiKey"]; // yt_...
Rehellinen pienäläinen: demonäppäin on jaettu kaikkien, jotka pyytävät sitä, ja sallii 5 videota kuukaudessa per IP. Jaetulla isännöinnillä tuo IP on myös jaettu palvelimen naapureiden kanssa, joten käsittele demonäppäin viiden minuutin testinä, ei suunnitelmana.
Myös arvoista tietää: transkriptiot tulevat YouTuben kuvateksti-raiteista, manuaalisesti tai automaattisesti luodut. Englanti on ensisijainen, ensimmäinen saatavilla oleva kieli muuten — ja video, jolla kuvatekstit ovat poistettu käytöstä, palauttaa TRANSCRIPT_UNAVAILABLE pysyvästi. Rakenna silmukka ohittamaan ne.
Missä PHP-kansa vie tätä
Yleisin pyyntö, jonka saan PHP-kehittäjiltä, on WordPress-muotoinen: vedä transkriptio, anna se LLM:lle, julkaise luonnos. Koko putki on katettu kohdassa YouTube-videon muuttaminen blogipostiksi, ja podcast-muunnelma kohdassa näytettävien muistiinpanojen luominen YouTubesta.
Kun demonäppäin lopettaa riittävyyden, kirjaudu Googlella youtube2text.org/app/keys — ei korttia, ei puhelinnumeroa, omasi ilmainen 5-videota-kuukausia avain ja maksulliset tasot 5,99 dollarista. Edellä oleva skripti pysyy tavun tavussa samanlaisena.