如何在Ruby中无需搜索免费获取YouTube频道最新视频用于Discord通知
替代YouTube Search接口获取频道最新视频的方案
嘿,刚好我对YouTube API的配额问题很熟悉,这就给你一个完美的替代方案,完全不用依赖Search接口,配额消耗直接降到几乎可以忽略的程度!
核心思路:利用频道的「上传播放列表」
每个YouTube频道都有一个专属的「上传播放列表」,里面按上传时间倒序排列了该频道所有公开视频。我们只需要获取这个播放列表的ID,再调用PlaylistItems.list接口就能拿到最新视频——这个接口每次请求只消耗1单位配额,比Search接口的100单位划算太多,完全适配你每分钟请求的个人项目需求。
具体步骤
获取频道的上传播放列表ID
调用Channels.list接口(part参数设为contentDetails),就能从返回结果里拿到contentDetails.relatedPlaylists.uploads,这就是目标频道的上传播放列表ID。获取最新上传的视频
用上面拿到的播放列表ID调用PlaylistItems.list,参数设part=snippet、maxResults=1,就能直接获取最新的那一条视频数据,配额消耗仅1单位。缓存视频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




