Google Sheets/Apps Script检测视频链接:失效链接返回200如何解决?
用Google Sheets/Apps Script批量检测视频链接可播放性
仅靠HTTP状态码200无法准确判断视频是否可播放——不少失效链接的服务器仍会返回200(比如返回错误页面、占位资源)。以下是几种更可靠的检测方法,结合Apps Script实现批量质检:
核心改进思路
- 检查响应的
Content-Type是否属于标准视频格式 - 发送Range请求获取视频前几字节,验证文件头标识(魔数)
- 模拟浏览器请求头,避免被服务器拦截非标准请求
改进后的Apps Script脚本
function checkVideoPlayable(url) { var urlTrimmed = url.trim(); if (!urlTrimmed) return "空链接"; // 缓存优化,减少重复请求 var cache = CacheService.getScriptCache(); var cachedResult = cache.get(urlTrimmed); if (cachedResult) return cachedResult; var result = "未知错误"; var baseOptions = { muteHttpExceptions: true, followRedirects: true, headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Accept": "video/*,*/*;q=0.8" } }; try { // 第一步:验证基础可访问性与资源类型 var response = UrlFetchApp.fetch(urlTrimmed, baseOptions); var statusCode = response.getResponseCode(); if (statusCode !== 200) { result = "不可访问(状态码:" + statusCode + ")"; cache.put(urlTrimmed, result, 21600); return result; } var contentType = response.getHeaders()["Content-Type"] || ""; var validVideoTypes = ["video/mp4", "video/mov", "video/avi", "video/webm", "video/quicktime", "video/mpeg"]; var isVideoType = validVideoTypes.some(type => contentType.includes(type)); if (!isVideoType) { result = "非视频资源(Content-Type:" + contentType + ")"; cache.put(urlTrimmed, result, 21600); return result; } // 第二步:验证视频文件有效性(通过Range请求获取文件头) var rangeOptions = {...baseOptions}; rangeOptions.headers["Range"] = "bytes=0-100"; // 请求前101字节 var rangeResponse = UrlFetchApp.fetch(urlTrimmed, rangeOptions); var rangeStatus = rangeResponse.getResponseCode(); // 206表示部分内容请求成功,说明服务器支持分段下载且文件存在 if (rangeStatus === 206) { var contentBytes = rangeResponse.getBlob().getBytes(); // 检查常见视频文件的魔数(文件头标识) var validMagicNumbers = [ [0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70], // MP4 [0x52, 0x49, 0x46, 0x46], // AVI/RMVB [0x1A, 0x45, 0xDF, 0xA3], // WebM [0x6D, 0x6F, 0x6F, 0x76] // MOV ]; var isValidMagicNumber = validMagicNumbers.some(magic => { for (var i = 0; i < magic.length; i++) { if (contentBytes[i] !== magic[i]) return false; } return true; }); result = isValidMagicNumber ? "可播放" : "无效视频文件"; } else { // 若服务器不支持Range请求,结合Content-Type判断为可播放 result = "可播放(服务器不支持分段验证)"; } } catch (e) { result = "请求失败:" + e.message; } cache.put(urlTrimmed, result, 21600); return result; }
使用步骤
- 打开目标Google Sheet,点击「扩展程序」→「Apps脚本」
- 替换原有脚本为上述代码,保存并完成权限授权
- 在Sheet单元格中输入公式
=checkVideoPlayable(A1)(A1为视频链接所在单元格),下拉即可批量检测
注意事项
- 部分服务器会限制请求频率,批量检测时可在请求间添加
Utilities.sleep(1000)延迟1秒,避免被拦截 - 魔数验证仅覆盖常见格式,若你的视频格式特殊,可自行添加对应文件头标识
- 缓存有效期设为6小时,如需重新检测,可清除缓存或等待缓存过期
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

