Validation 如何验证youtube视频ID?

Validation 如何验证youtube视频ID?,validation,api,youtube,Validation,Api,Youtube,在访问youtube API之前,我想验证我的一个网站的URL中的youtube视频id,但我不知道这样一个id中允许的字符是什么。我在网上看到人们猜测它可以包含数字和字符,但我还没有看到这些视频id的官方规范 有吗 我只是想看看它是否是字母数字加破折号。您可能希望查看oEmbed,您可以查询YouTube以查看ID是否为有效视频 有关官方信息,请参见 你可以点击:(页面现在返回:“不再可用”。) 并根据响应确定视频是否有效 您无法使用正则表达式检查ID的有效性,因为并非所有字母数字值都是有效的

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


有吗

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

有关官方信息,请参见

你可以点击:(页面现在返回:“不再可用”。)

并根据响应确定视频是否有效

您无法使用正则表达式检查ID的有效性,因为并非所有字母数字值都是有效的ID

p、 我敢肯定我在视频ID中看到了“破折号”

p、 请注意,“下划线”也是一个有效字符:


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

我用罗曼推荐的方法解决了这个问题。在我的助手中:

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

require "net/http"
require "uri"
然后:

确保“#{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

如果您正在寻找一个更快、更具可扩展性的解决方案,我会说,如果youtube在将来更改其ID,使用带有一些日志记录/回退的REGEX,以主动预防错误

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

/^[A-Za-z0-9_-]{11}$/
在PHP中有一个更详细的示例:

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

下面是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');

使用YouTube API的v3,我通过调用:

GET https://www.googleapis.com/youtube/v3/videos?part=id&id=Tr5WcGSDqDg&key={YOUR_API_KEY}
这将返回类似于:

{
“种类”:“youtube#videoListResponse”,
“etag”:“dc9DtKVuP\U z\U ZIF9BZmHcN8kvWQ/P2cGwKgbH6EYZAGxiKCZSH8R1KY\”,
“页面信息”:{
"总成绩":1,,
“结果每页”:1
},
“项目”:[{
“种类”:“youtube视频”,
“etag”:“dc9DtKVuP\U z\U ZIF9BZmHcN8kvWQ/Rgd0\U ApwigPcJHVX1Z2SIQ5FJtU\”,
“id”:“Tr5WcGSDqDg”
}]
}
所以你可以做一个检查:

if(json.hasOwnProperty('pageInfo')&&json.pageInfo.totalResults==1){
如果(项目[0]。种类=='youtube#视频'){
//有效视频ID
}
}
简单使用此代码:

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


 }

}

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


下面是我结合其他答案和其他地方的信息得出的一个答案:

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视频链接或播放列表中的视频链接,不包括频道链接

注意:它不确定它是否是活动视频,也不检查它是否存在。这些函数仅起到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'

下面是一个简单的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'));

如果您想检查url是否是活动的,下面是ruby中的一个示例:这似乎不再有效。返回200 OK。请进一步查看我的答案,其中包含APIv3的解决方案。此答案中包含的url不再有效。请参阅本页或类似问题的更多选项。。。YouTube视频ID中也允许使用连字符(破折号)。这是必要的,因为api的第2版不再工作。我一直在到处寻找这个,谢谢。没问题,很高兴我能帮助:)不再支持,这是旧的v2 api。v3现在是标准版本。这不应该是
A-Z
而不是
A-Z
。在大多数正则表达式中可以使用[-\w]。这只是一个随机猜测。此外,OP还没有声明他正在使用javaI可以调用一些函数,比如
yTPlayer.duration{duration,error->if duration>0{这是有效的id!}
+1这个[url]技巧非常适合我的需要(检查videoId是否为live/available)!(虽然OP听起来只是想通过基本的输入验证来调用Youtube API?)
$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'
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'));