【问题标题】:How to validate youtube video ids?如何验证 youtube 视频 ID?
【发布时间】:2011-02-14 03:05:54
【问题描述】:

我想在访问 Youtube API 之前验证在我的一个网站的 URL 中提交的 youtube 视频 ID,但我不知道此类 ID 中允许的字符是什么。我看到网上有人猜测它可以包含数字和字符,但我还没有看到这些视频 id 的官方规范。

有吗?

【问题讨论】:

  • 我可以调用像yTPlayer.duration { duration, error -> if duration > 0 { this is valid id! } }这样的函数。

标签: validation api youtube


【解决方案1】:

我只是看看它是否是带有破折号的字母数字。您可能想查看 oEmbed,您可以查询 YouTube 以查看 ID 是否为有效视频。

【讨论】:

  • YouTube 视频 ID 中也允许使用连字符(破折号)。
【解决方案2】:

有关官方信息,请参阅this thread

你可以点击这个:http://gdata.youtube.com/feeds/api/videos/VIDEO_ID(页面现在返回:“不再可用”。)

并根据响应判断视频是否有效

您无法使用 RegEx 检查 ID 的有效性,因为并非所有字母数字值都是有效的 ID。

附言我很确定我在视频 ID 中看到了“破折号”

p.p.s. “下划线”也是一个有效字符:http://www.youtube.com/watch?v=nrGk0AuFd_9

[a-zA-Z0-9_-]{11} 是正则表达式 (source),但即使正则表达式有效,也不能保证视频会在那里

【讨论】:

【解决方案3】:

我以 Roman 推荐的相同方式解决了这个问题。在我的助手中:

确保在文件顶部包含您的要求:

require "net/http"
require "uri"

然后:

def validate_id(youtube_id)
  uri = URI.parse("http://gdata.youtube.com/feeds/api/videos/#{ youtube_id }")
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Get.new(uri.request_uri)
  response = http.request(request)
  %Q{ #{response.code} }
end

确保“#{response.code}”中的括号之间没有空格

最后,将其与所需的响应进行比较:

def youtube_data(youtube_id) 
  if validate_id(youtube_id) == "200"
    #video is good code
  else %Q{ Video is no longer valid }
  end
end

【讨论】:

    【解决方案4】:

    如果您正在寻找一种更快、更具可扩展性的解决方案,我建议您使用带有一些日志记录/回退功能的 REGEX,以便在 youtube 将来更改其 ID 时主动发生错误。

    我使用 YouTube API 已经有一段时间了,现在处理数百万个视频 ,遍历它们,我发现这是最理想的:

    /^[A-Za-z0-9_-]{11}$/
    

    一个更详细的例子用PHP说:

    public static function validId($id) {
        return preg_match('/^[a-zA-Z0-9_-]{11}$/', $id) > 0;
    }
    

    【讨论】:

    • 不应该是A-Z 而不是A-z
    • 可以在大多数正则表达式中使用 [-\w]。
    【解决方案5】:

    这是 Roman 方法在 PHP 中的简单实现:

    function validYoutube($id){
        $id = trim($id);
        if (strlen($id) === 11){
            $file = @file_get_contents('http://gdata.youtube.com/feeds/api/videos/'.$id);
            return !!$file;
        }
        return false;
    }
    

    这里是测试:

    echo validYoutube('Nv7U6_WhqvQ');
    echo validYoutube('Nv7U6_Whqvf');
    echo validYoutube('Nv7U6_Whqzz');
    

    【讨论】:

    • 不再支持,这是旧的 v2 api。 v3 现在是标准。
    【解决方案6】:

    使用 v3 的 YouTube API 我通过调用实现了这一点:

    GET https://www.googleapis.com/youtube/v3/videos?part=id&id=Tr5WcGSDqDg&key={YOUR_API_KEY}
    

    这会返回类似:

    {
      "kind": "youtube#videoListResponse",
      "etag": "\"dc9DtKVuP_z_ZIF9BZmHcN8kvWQ/P2cGwKgbH6EYZAGxiKCZSH8R1KY\"",
      "pageInfo": {
        "totalResults": 1,
        "resultsPerPage": 1
      },
      "items": [{
        "kind": "youtube#video",
        "etag": "\"dc9DtKVuP_z_ZIF9BZmHcN8kvWQ/Rgd0_ApwigPcJHVX1Z2SIQ5FJtU\"",
        "id": "Tr5WcGSDqDg"
      }]
    }
    

    所以你可以做一个检查:

    if(json.hasOwnProperty('pageInfo') && json.pageInfo.totalResults === 1) {
       if(items[0].kind==='youtube#video') {
          //valid video ID
       }
    }
    

    【讨论】:

    • 这现在是必要的,因为 api 的 v2 不再工作。我一直在到处找这个,谢谢。
    • 没问题,很高兴我能帮上忙 :)
    【解决方案7】:

    简单使用此代码:

     public class HelloWorld{
    
       public static void main(String []args){
    
         String expression = "^.*((youtu.be"+ "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
    
         String video_url = "https://www.youtube.com/watch?v=as3tGTN2u98";
    
         if (video_url.matches(expression)) {
          System.out.println("It's valid");
         }
    
    
     }
    
    }
    

    【讨论】:

    • 这只是一个随机猜测。 OP也没有说他正在使用java
    【解决方案8】:

    我认为这适用于检查视频是否存在。如上所述,可以使用 REGEX 进行其他验证。 (使用 PHP 实现)

    public function verifyVideoID($videoID) {
        parse_str(file_get_contents("http://youtube.com/get_video_info?el=detailpage&video_id=".$videoID), $info);
        if (isset($info['errorcode'])) {
            $response = ['response' => false];
            return response()->json($response);
        } else {
            $response = ['response' => true];
            return response()->json($response);
        }
    }
    

    【讨论】:

      【解决方案9】:

      这是我通过结合此处和其他地方的其他答案的信息得出的一个:

      function validId($id) {
          return preg_match('/^[a-zA-Z0-9_-]{11}$/', $id) > 0;
      }
      
      function isvalYtube($url) {
          $purl = str_ireplace('www.', '', parse_url($url, PHP_URL_HOST));    
          if (!strpos($url, 'youtu.be/') && ($purl != 'youtu.be')) {
              if (strpos($url, 'watch') && ($purl = 'youtube.com')) {
                      parse_str(parse_url($url, PHP_URL_QUERY), $id);             
                      if (!empty($id['v'])) { return(validId($id['v']) ? true : false); } else { return false; }                 
              }     
          } else {        
              if (!empty(basename($url))) { return(validId(basename($url)) ? true : false); } else { return false; }    
          }  
      }
      
      echo isvalYtube($url) ? 'valid link' : 'invalid link';
      

      第一个函数检查我们是否在处理有效的 Youtube 视频 ID。

      第二个函数只是检查它是否是有效的 youtube 视频链接或来自 PLAYLIST LINK 的视频,不包括频道链接。

      注意:它不会确定它是否是活动视频,也不会检查它是否存在。这些函数仅充当 Youtube 视频链接语法检查器,应被视为此类检查器。

      用法示例:

      $url = 'http://www.youtube.com/watch?v=o_QBk4VwnIA';
      echo isvalYtube($url) ? 'valid link' : 'invalid link';
      //returns 'valid link'
      
      $url = 'http://youtu.be/o_QBk4VwnIA';
      echo isvalYtube($url) ? 'valid link' : 'invalid link';
      //returns 'valid link'
      
      $url = 'http://www.youtube.com/watch?v=o_QBk4VwnIA&feature=youtu.be';
      echo isvalYtube($url) ? 'valid link' : 'invalid link';
      //returns 'valid link'
      
      $url = 'https://www.youtube.com/watch?v=Sq3eLdixvCc&list=OLAK5uy_nvaYLo9AG_rZyqkXzYlkJfLjBuZS84bIU';
      echo isvalYtube($url) ? 'valid link' : 'invalid link';
      //returns 'valid link'
      
      $url = 'https://www.youtube.com/channel/UCMPQY9gW0hQ9e_-IdQUKEAw';
      echo isvalYtube($url) ? 'valid link' : 'invalid link';
      //returns 'invalid link'
      

      【讨论】:

        【解决方案10】:

        这是一个简单的 JavaScript 实现:

        async function validVideoId(id) {
          const url = "http://img.youtube.com/vi/" + id + "/mqdefault.jpg";
          const { status } = await fetch(url);
          if (status === 404) return false;
          return true;
        }
        
        console.log(validVideoId('60ItHLz5WEA'));
        

        【讨论】:

        • +1 这个 [url] 技巧非常适合我的需求(检查 videoId 是否实时/可用)! (虽然 OP 听起来他们只是想要基本的输入验证然后调用 Youtube API?)
        猜你喜欢
        • 2012-08-06
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 2023-03-17
        • 1970-01-01
        • 2012-07-13
        • 2012-05-16
        相关资源
        最近更新 更多