Trascrizione YouTube in Ruby: Net::HTTP e Zero Gems

Il riflesso Ruby è bundle add something prima di scrivere una riga di codice. Resistete per cinque minuti: recuperare una trascrizione YouTube in Ruby non ha bisogno di niente al di fuori della libreria standard, perché l'API è un GET HTTPS che restituisce JSON, e net/http più json sono seduti in ogni installazione Ruby dal sempre. Alla fine di questo articolo avrai uno script che prende qualsiasi URL YouTube e stampa il titolo e la trascrizione del video, con un'istruzione case che copre ogni errore che l'API restituisce — e un Gemfile vuoto.
Sì, l'interfaccia di Net::HTTP è così goffa come la sua reputazione. È ancora solo venti righe.
Lo script
require "net/http"
require "json"
require "uri"
uri = URI("https://youtube2text.org/api/transcribe")
uri.query = URI.encode_www_form(
url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
)
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("YT2TEXT_KEY")
res = Net::HTTP.start(uri.hostname, uri.port,
use_ssl: true, read_timeout: 60) do |http|
http.request(req)
end
data = JSON.parse(res.body)
if res.is_a?(Net::HTTPSuccess)
transcript = data["result"]
puts transcript["title"]
puts "#{transcript['contentSize']} chars, truncated: #{transcript['truncated']}"
puts transcript["content"][0, 400]
else
err = data["error"]
case err["code"]
when "RATE_LIMIT_EXCEEDED"
puts "Rate limited. Retry in #{err['retryAfterSeconds']}s."
when "TRANSCRIPT_UNAVAILABLE"
puts "No captions on this video. Skip it."
when "VIDEO_NOT_FOUND", "INVALID_URL"
puts "Bad video reference: #{err['message']}"
else
abort "#{err['code']}: #{err['message']}"
end
end
Il parametro url è indulgente — URL watch completi, link corti youtu.be, shorts, o un ID video nudo di 11 caratteri funzionano tutti. Aggiungi maxChars: 20000 a encode_www_form se la trascrizione è diretta a un prompt LLM e preferisci non pagare per i token di un podcast di tre ore; 150000 è il valore predefinito e il massimo.
Se la tua codebase ha già Faraday o httparty, va bene, usali — la richiesta è gli stessi tre ingredienti: l'endpoint, una stringa di query e un'intestazione. A proposito, req["Authorization"] = "Bearer #{key}" funziona identicamente a x-api-key se i bearer token si adattano meglio alla tua configurazione.
Una chiave in un comando
curl https://youtube2text.org/api/demo-key
Quello restituisce {"success":true,"apiKey":"yt_..."} senza account, senza email, nulla. L'avvertenza: è una chiave condivisa per tutti gli utenti anonimi, limitata a 5 video al mese per IP. Fantastico per verificare che lo script funzioni, sbagliato per qualsiasi cosa distribuisci.
Che cos'è effettivamente la trascrizione
Vale la pena essere chiari di occhi qui: il testo proviene dai tracciamenti didascalici di YouTube. Le didascalie caricate manualmente leggono bellamente; quelle generate automaticamente occasionalmente manomettono il gergo e i nomi dei prodotti, e non c'è nulla che nessuna API possa fare riguardo a quello a monte. I tracciamenti inglesi sono preferiti, con fallback al primo linguaggio disponibile. E un video con didascalie disabilitate restituisce TRANSCRIPT_UNAVAILABLE — il ramo case sopra lo tratta come uno skip, non un ritentativo, perché riprovare un video che non ha didascalie è un modo molto paziente di non realizzare nulla.
Dove i Rubyist portano questo
Il modello che vedo di più è l'elaborazione batch: fai il loop sopra gli ID video di un canale, recupera ogni trascrizione, alimentali a qualcosa a valle. Gli studenti trasformano video di lezione in note di studio; se il valle è Claude, la trascrizioni gratuite in Claude procedura connette i due senza colla personalizzata. Lo stesso endpoint da PHP è quasi identico riga per riga — confronto qui se il tuo team gestisce entrambi.
Quando la chiave demo condivisa si esaurisce, accedi con Google su youtube2text.org/app/keys — nessun telefono, nessuna carta. Ottieni la tua chiave gratuita a 5 video al mese, con livelli a pagamento da $ 5,99 per 50 fino a $ 19,99 illimitati. Lo script non cambia; ENV["YT2TEXT_KEY"] lo fa.