HomeBlogTranscribePlansAPI Keys

Transkrypcja YouTube w Ruby: Net::HTTP i Zero Gems

Skrypt Ruby parsujący odpowiedź transkrypcji YouTube za pomocą biblioteki standardowej

Odruch Ruby to bundle add something przed napisaniem linii kodu. Opór tego przez pięć minut: pobieranie transkrypcji YouTube w Ruby potrzebuje nic spoza biblioteki standardowej, ponieważ API to jedno HTTPS GET zwracające JSON, a net/http plus json siedzi w każdej instalacji Ruby od zawsze. Na koniec tego postu będziesz mieć skrypt, który przyjmuje każdy adres URL YouTube i wydrukuje tytuł wideo i transkrypcję, z instrukcją case obejmującą każdy błąd API zwraca — i pusty Gemfile.

Tak, interfejs Net::HTTP jest tak nieręczny, jak jego reputacja. To wciąż tylko dwadzieścia linii.

Skrypt

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

Parametr url jest tolerancyjny — pełne adresy URL, youtu.be krótkie linki, shorts, lub gołe 11-znakowe id wszystkie działają. Dodaj maxChars: 20000 do encode_www_form, jeśli transkrypcja zmierza do promptu LLM i wolisz nie płacić za trzygodzinny podcast warte tokenów; 150000 to domyślna i maksymalna.

Jeśli Twoja baza kodu ma już Faraday lub httparty, dobrze, używaj ich — żądanie to te same trzy składniki: punkt końcowy, łańcuch zapytania i jeden nagłówek. Mówiąc o którym, req["Authorization"] = "Bearer #{key}" działa identycznie do x-api-key, jeśli tokeny nośnika lepiej pasują do Twojej konfiguracji.

Klucz w jednym poleceniu

curl https://youtube2text.org/api/demo-key

To zwraca {"success":true,"apiKey":"yt_..."} bez konta, bez e-maila, nic. Haczyk: to jeden wspólny klucz dla wszystkich anonimowych użytkowników, ograniczony do 5 filmów na miesiąc na IP. Świetnie do weryfikacji działania skryptu, źle do czegokolwiek, co wdrażasz.

Czym naprawdę jest transkrypcja

Warte bycia czystookiejącej tutaj: tekst pochodzi z pasów napisów YouTube. Ręcznie przesłane napisy czytają pięknie; autogenerowane czasami zniekształcają żargon i nazwy produktów, i nie ma nic, co każdy API może zrobić na temat tego upstream. Ścieżki angielskie są preferowane, z rezerwą do pierwszego dostępnego języka. I film z wyłączonymi napisami zwraca TRANSCRIPT_UNAVAILABLE — gałąź case powyżej traktuje to jako pominięcie, nie ponowną próbę, ponieważ ponowna próba wideo, które nie ma napisów, to pacjentny sposób na osiągnięcie nic.

Gdzie Rubyists idą z tym

Wzorzec, który widzę najbardziej, to przetwarzanie wsadowe: pętla nad id wideo kanału, pobierz każdą transkrypcję, podaj do czegoś dalej. Studenci zamieniają filmy wykładów w notatki badawcze; jeśli downstream to Claude, bezpłatne transkrypcje w Claude spacer łączy dwa bez niestandardowego kleju. Ten sam punkt końcowy z PHP jest prawie identyczną linię — porównanie tutaj, jeśli Twój zespół uruchamia oba.

Gdy wspólny klucz demo wyschnie, zaloguj się za pomocą Google na youtube2text.org/app/keys — brak telefonu, brak karty. Otrzymujesz własny bezpłatny klucz na 5 filmów na miesiąc, z płatnymi poziomami od 5,99 USD za 50 do 19,99 USD bez limitu. Skrypt się nie zmienia; ENV["YT2TEXT_KEY"] to.