在访问Youtube API之前,我希望能够验证在网址中提交的Youtube视频ID,但我不知道这种ID中允许使用哪些字符。我看到网上有人猜测它可能包含数字和字符,但我还没有看到这些视频ID的官方规范。
是否存在这样的规范?
在访问Youtube API之前,我希望能够验证在网址中提交的Youtube视频ID,但我不知道这种ID中允许使用哪些字符。我看到网上有人猜测它可能包含数字和字符,但我还没有看到这些视频ID的官方规范。
是否存在这样的规范?
参见此帖子以获取官方信息。
您可以访问以下网址: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} (来源),但即使正则表达式有效,也不能保证视频存在。
使用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
}
}
如果您正在寻找更快速和可扩展的解决方案,我会建议使用 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;
}
这里是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'));
我用和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
我只是查看它是否为字母数字,可能带有破折号。您可能需要研究oEmbed,您可以查询YouTube以查看ID是否为有效视频。
这是一个简单的 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');
我认为这可以用来检查视频是否存在。其他的验证可以使用上述提到的正则表达式完成。(使用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);
}
}
这是我从其他答案和其他地方汇总信息后想出来的一个:
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'
使用这段代码即可:
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");
}
}
}
yTPlayer.duration { duration, error -> if duration > 0 { this is valid id! } }
。 - 蘇哲聖