You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

使用步骤

  1. 打开目标Google Sheet,点击「扩展程序」→「Apps脚本」
  2. 替换原有脚本为上述代码,保存并完成权限授权
  3. 在Sheet单元格中输入公式=checkVideoPlayable(A1)(A1为视频链接所在单元格),下拉即可批量检测

注意事项

  • 部分服务器会限制请求频率,批量检测时可在请求间添加Utilities.sleep(1000)延迟1秒,避免被拦截
  • 魔数验证仅覆盖常见格式,若你的视频格式特殊,可自行添加对应文件头标识
  • 缓存有效期设为6小时,如需重新检测,可清除缓存或等待缓存过期

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:41:02