我想在访问Youtube API之前验证在我的某个网站的网址中插入的YouTube视频ID,但我不知道在这样的ID中允许的字符是什么。我看到网上的人猜测它可以包含数字和字符,但我还没有看到这些视频ID的官方规范。
有吗?
答案 0 :(得分:57)
有关官方信息,请参阅this thread。
你可以点击:http://gdata.youtube.com/feeds/api/videos/VIDEO_ID (页面现在返回:“不再可用”。)
并根据回复确定视频是否有效
您无法使用RegEx检查ID的有效性,因为并非所有字母数字值都是有效的ID。
P.S。我很确定我在视频ID的
中看到了“破折号”p.p.s。 “下划线”也是一个有效的角色:http://www.youtube.com/watch?v=nrGk0AuFd_9
[a-zA-Z0-9 _-] {11}是正则表达式(source),但即使正则表达式有效,也无法保证视频会在那里
答案 1 :(得分:12)
使用YouTube API的v3,我通过致电:
实现了这一目标cabal install SparkSetup
返回类似于:
的内容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"
}]
}
答案 2 :(得分:7)
如果您正在寻找更快速,更具可扩展性的解决方案,我会说如果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;
}
答案 3 :(得分:6)
我用罗马推荐的方式解决了这个问题。在我的帮手中:
请务必在文件顶部包含您的要求:
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 :(得分:2)
这是一个简单的 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'));
答案 5 :(得分:1)
我只是想看看它是否是带有可能破折号的字母数字。您可能需要查看oEmbed,您可以查询YouTube以查看该ID是否为有效视频。
答案 6 :(得分: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');
答案 7 :(得分:0)
我认为这可用于检查视频是否存在。如上所述,可以使用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);
}
}
答案 8 :(得分: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 VIDEO LINK或PLAYLIST LINK中的VIDEO(不包括频道链接)。
注意:它不会确定它是否是活动视频,也不会检查它是否存在。这些功能仅充当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'
答案 9 :(得分:-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");
}
}
}