如何基于URL检测YouTube视频可播放性?解决302误判问题
检测YouTube视频可播放状态的可行方案
仅通过URL字符串本身无法直接判断视频是否可播放——YouTube的播放权限(地区限制、视频删除、私有设置等)由后端逻辑控制,URL中没有内置这类标识。针对你遇到的「不可播放视频返回302状态码」问题,可通过以下更可靠的方式检测:
1. 解析页面内容判断(低成本替代方案)
YouTube不可播放的视频通常会跳转到带有明确错误提示的页面,即使返回200状态码,页面内容也会包含特定关键词。可以修改原脚本,跟随跳转后解析页面文本:
function isVideoPlayable(url) { var url_trimmed = url.trim(); var cache = CacheService.getScriptCache(); var cachedResult = cache.get(url_trimmed); if (cachedResult !== null) { return cachedResult === "true"; } var options = { 'muteHttpExceptions': true, 'followRedirects': true // 跟随跳转获取最终页面 }; var response = UrlFetchApp.fetch(url_trimmed, options); var content = response.getContentText(); // 检测常见的不可播放提示关键词 var unavailableKeywords = [ "Video unavailable", "This video is no longer available", "This video has been removed", "Private video" ]; var isPlayable = !unavailableKeywords.some(keyword => content.includes(keyword)); cache.put(url_trimmed, isPlayable.toString(), 21600); return isPlayable; }
注意:这种方法依赖YouTube页面的文本内容,若官方更新页面文案,需同步调整关键词列表。
2. 使用YouTube Data API(最可靠方案)
通过官方API直接查询视频的状态信息,是准确性最高的方式:
- 先申请API密钥(Google Cloud控制台可免费获取,有每日调用配额)
- 提取URL中的视频ID(即
v=后的参数),调用videos.list接口获取视频状态 - 依据返回的
status字段判断可播放性:
function checkVideoViaAPI(videoId) { var apiKey = "你的API密钥"; var apiUrl = `https://www.googleapis.com/youtube/v3/videos?id=${videoId}&part=status,contentDetails&key=${apiKey}`; var response = UrlFetchApp.fetch(apiUrl); var data = JSON.parse(response.getContentText()); if (data.items.length === 0) { return false; // 视频不存在 } var videoStatus = data.items[0].status; // 基础判断:视频已处理完成、公开可见 var isPlayable = videoStatus.uploadStatus === "processed" && videoStatus.privacyStatus === "public"; // 可选:判断地区限制(需结合当前访问地区) var regionRestriction = data.items[0].contentDetails?.regionRestriction; if (regionRestriction?.blockedCountries?.includes("CN")) { isPlayable = false; } return isPlayable; }
优点:官方接口,结果准确稳定;缺点:有调用配额限制(免费配额足够处理上千条视频),需配置API密钥。
3. 关于原脚本的问题说明
原脚本设置followRedirects: false,获取的是跳转前的302状态码,但YouTube很多不可播放的视频会先返回302重定向到错误页面,因此仅靠状态码无法区分可播放/不可播放视频,必须结合跳转后的页面内容或官方API数据判断。
内容的提问来源于stack exchange,提问作者3ll3
相关产品推荐
相关产品推荐

