如何验证YouTube视频ID?

47

在访问Youtube API之前,我希望能够验证在网址中提交的Youtube视频ID,但我不知道这种ID中允许使用哪些字符。我看到网上有人猜测它可能包含数字和字符,但我还没有看到这些视频ID的官方规范。

是否存在这样的规范?


我可以调用一些函数,例如 yTPlayer.duration { duration, error -> if duration > 0 { this is valid id! } } - 蘇哲聖
10个回答

61

参见此帖子以获取官方信息。

您可以访问以下网址:http://gdata.youtube.com/feeds/api/videos/VIDEO_ID(该页面现在显示“不再可用”。)

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

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

附注:我很确定我看到了视频ID中的连字符。

另外,“下划线”也是有效的字符: http://www.youtube.com/watch?v=nrGk0AuFd_9

正则表达式为[a-zA-Z0-9_-]{11} (来源),但即使正则表达式有效,也不能保证视频存在。


如果您想检查URL是否可用,这里有一个Ruby示例:http://www.igvita.com/2006/09/07/validating-url-in-ruby-on-rails/ - borisrorsvort
3
似乎这个方法不再有效。访问http://gdata.youtube.com/feeds/api/videos/NOT_A_VIDEO_ID会返回200 OK状态码。 - nornagon
请看我下面的答案,其中包含了 API V3 的解决方案。 - richwol
7
此答案中包含的网址已失效。请在此页面或类似问题的链接中查看更多选项...https://dev59.com/jYjca4cB1Zd3GeqP3uxR#31100389 - Harry B

17

使用YouTube API的v3版本,我通过调用以下代码实现:

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

3
由于 API 的第二个版本已经无法使用,现在这是必要的。我已经到处寻找这个,谢谢你。 - Adam

12

如果您正在寻找更快速和可扩展的解决方案,我会建议使用 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;
}

3
应该是"A-Z"而不是"A-z"。 - Peter.O
2
在大多数正则表达式中,可以只使用[-\w]。 - Dewi Morgan

6

这里是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] 技巧非常适合我的需求(检查 videoId 是否可用/正在直播)!(不过楼主似乎只是想要基本输入验证,然后调用 Youtube API?) - Adam Smooch

6

我用和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

1

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


1
YouTube视频ID中也允许使用连字符(破折号)。 - Sam Dutton

0

这是一个简单的 PHP 实现 Roman 方法的示例:

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');

1
不再受支持,这是旧的v2 API。v3现在是标准。 - FlavorScape

0

我认为这可以用来检查视频是否存在。其他的验证可以使用上述提到的正则表达式完成。(使用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);
    }
}

0

这是我从其他答案和其他地方汇总信息后想出来的一个:

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'

-2

使用这段代码即可:

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


 }

}

2
这只是一个随意的猜测。此外,OP并未说明他是否正在使用Java。 - lokusking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接