Ruby 中的 YouTube 转录文本:Net::HTTP 和零 Gems

Ruby 反射是在写一行代码前 bundle add something。抵抗它五分钟:在 Ruby 中获取 YouTube 转录文本需要标准库之外的什么,因为 API 是一个返回 JSON 的 HTTPS GET,net/http 加 json 在每个 Ruby 安装中已经坐了永远。到本文末尾,你会有一个脚本,需要任何 YouTube URL 并打印视频标题和转录文本,带一个 case 语句覆盖 API 返回的每个错误——和一个空 Gemfile。
是的,Net::HTTP 的接口与其声誉一样笨拙。它仍然只有二十行。
脚本
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
url 参数是宽恕的——完整监看 URL、youtu.be 短链接、shorts,或裸露 11 字符视频 id 都有效。添加 maxChars: 20000 到 encode_www_form 如果转录文本进入 LLM 提示并且你宁愿不为三小时播客的令牌付费;150000 是默认和最大值。
如果你的代码库已经有 Faraday 或 httparty,好的,使用它们——请求是相同的三个成分:端点、查询字符串和一个标头。说到这,req["Authorization"] = "Bearer #{key}" 与 x-api-key 相同工作,如果承载令牌更好地适应你的设置。
一个命令中的密钥
curl https://youtube2text.org/api/demo-key
那返回 {"success":true,"apiKey":"yt_..."} 没账户、没电子邮件、什么都没有。陷阱:它是所有匿名用户的一个共享密钥,每个 IP 限制 5 个视频/月。对验证脚本有效很好,对你部署的任何东西都是错的。
转录文本实际上是什么
值得这里清醒:文本来自 YouTube 的字幕轨道。手动上传的字幕读起来很美;自动生成的偶尔会破坏术语和产品名称,没有任何 API 可以在上游做什么。英文轨道优先,回退到第一个可用语言。禁用字幕的视频返回 TRANSCRIPT_UNAVAILABLE——上面的 case 分支将其视为跳过,不重试,因为重试没有字幕的视频是一个很耐心的方式来完成什么都没做。
Rubyist 在哪里拿去这个
我看到的最常见的模式是批处理:循环频道的视频 id、获取每个转录文本、馈送到下游的东西。学生将讲座视频变成研究笔记;如果下游是 Claude,Claude 中的免费转录文本演练连接两者,没有自定义胶水。来自 PHP 的相同端点几乎逐行相同——比较这里如果你的团队同时运行两者。
当共享演示密钥干涸时,在 youtube2text.org/app/keys 用 Google 登录——无电话、无卡。你每月得到自己的免费密钥 5 个视频,从 50 个 5.99 美元到 19.99 美元无限的付费层。脚本不改变;ENV["YT2TEXT_KEY"] 改变。