You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Ruby中无需搜索免费获取YouTube频道最新视频用于Discord通知

替代YouTube Search接口获取频道最新视频的方案

嘿,刚好我对YouTube API的配额问题很熟悉,这就给你一个完美的替代方案,完全不用依赖Search接口,配额消耗直接降到几乎可以忽略的程度!

核心思路:利用频道的「上传播放列表」

每个YouTube频道都有一个专属的「上传播放列表」,里面按上传时间倒序排列了该频道所有公开视频。我们只需要获取这个播放列表的ID,再调用PlaylistItems.list接口就能拿到最新视频——这个接口每次请求只消耗1单位配额,比Search接口的100单位划算太多,完全适配你每分钟请求的个人项目需求。

具体步骤

  1. 获取频道的上传播放列表ID
    调用Channels.list接口(part参数设为contentDetails),就能从返回结果里拿到contentDetails.relatedPlaylists.uploads,这就是目标频道的上传播放列表ID。

  2. 获取最新上传的视频
    用上面拿到的播放列表ID调用PlaylistItems.list,参数设part=snippetmaxResults=1,就能直接获取最新的那一条视频数据,配额消耗仅1单位。

  3. 缓存视频ID避免重复通知
    每次请求后把最新视频的ID存下来(比如本地文件、简单数据库),下次请求时对比ID,只有当ID变化时才触发Discord通知,避免重复推送。

修改后的Ruby代码实现

require "yt"
require "fileutils"

# 配置你的API密钥
Yt.configure do |config|
  config.api_key = 'your_api_key_here'
end

# 目标频道ID
CHANNEL_ID = 'UCQjhFO_CA5e1-Ymopbfmx5Q'
# 本地缓存文件,用来记录上次通知的视频ID
CACHE_FILE = "latest_video_cache.txt"

# 获取频道的上传播放列表ID
def get_uploads_playlist(channel_id)
  channel = Yt::Channel.new(id: channel_id)
  channel.content_details.related_playlists.uploads
end

# 从上传播放列表获取最新视频ID
def get_latest_video(playlist_id)
  playlist_items = Yt::PlaylistItem.list(playlist_id: playlist_id, part: 'snippet', max_results: 1)
  playlist_items.first&.snippet&.resource_id&.video_id
end

# 读取缓存的视频ID
def read_cached_id
  File.read(CACHE_FILE).strip if File.exist?(CACHE_FILE)
end

# 更新缓存的视频ID
def update_cached_id(video_id)
  File.write(CACHE_FILE, video_id)
end

# 主执行逻辑
uploads_playlist_id = get_uploads_playlist(CHANNEL_ID)
latest_video_id = get_latest_video(uploads_playlist_id)
cached_id = read_cached_id

if latest_video_id && latest_video_id != cached_id
  # 这里替换成你的Discord通知逻辑,比如发送Webhook请求
  puts "检测到新视频!视频ID:#{latest_video_id}"
  update_cached_id(latest_video_id)
else
  puts "暂无新视频更新"
end

额外说明

  • 配额消耗计算:每分钟请求1次,每天仅消耗1440单位,而YouTube免费提供的日配额是10000单位,完全足够个人项目使用,不用担心付费问题。
  • API权限:确保你在Google Cloud控制台里已经启用了「YouTube Data API v3」,并且API密钥有该接口的访问权限。
  • 缓存优化:如果你的项目部署在服务器上,用本地文件缓存就足够简单;如果需要更可靠的存储,也可以换成Redis这类轻量数据库。

内容的提问来源于stack exchange,提问作者SydneyfunnelAllinOne

火山引擎 最新活动