Je souhaite valider les identifiants de vidéos youtube sbumitted dans l'URL de l'un de mes sites avant d'accéder à l'API Youtube, mais je ne sais pas quels sont les caractères autorisés dans un tel identifiant. Je vois des internautes deviner qu'ils peuvent contenir des chiffres et des caractères, mais je n'ai pas encore vu les spécifications officielles de ces identifiants vidéo.
Est-ce qu'il y a un?
Voir ce fil pour les infos officielles.
vous pouvez cliquer sur ceci: http://gdata.youtube.com/feeds/api/videos/VIDEO_ID (La page retourne maintenant: "N'est plus disponible".)
et déterminer si la vidéo est valide en fonction de la réponse
Vous ne pouvez pas vérifier la validité de l'ID avec RegEx, car toutes les valeurs alphanumériques ne sont pas des ID valides.
p.s. Je suis presque sûr d'avoir vu des "tirets" dans les identifiants vidéo
p.p.s. "underscore" est un caractère valide également: http://www.youtube.com/watch?v=nrGk0AuFd_9
[a-zA-Z0-9 _-] {11} est l'expression régulière ( source ), mais rien ne garantit que la vidéo sera présente même si l'expression rationnelle est valide.
Avec la v3 de l'API YouTube, j'ai réalisé ceci en appelant:
GET https://www.googleapis.com/youtube/v3/videos?part=id&id=Tr5WcGSDqDg&key={YOUR_API_KEY}
Cela retourne quelque chose comme:
{
"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"
}]
}
Donc, vous pouvez juste faire un chèque:
if(json.hasOwnProperty('pageInfo') && json.pageInfo.totalResults === 1) {
if(items[0].kind==='youtube#video') {
//valid video ID
}
}
Si vous recherchez une solution plus rapide et plus évolutive, je vous conseillerais d’utiliser REGEX avec une certaine journalisation/solution de secours pour que les erreurs soient proactives si youtube change d’identifiant à l’avenir.
Cela fait un moment que je travaille avec l'API YouTube, qui traite de millions de vidéos , Les parcourant en boucle, je trouve que c'est l'idéal:
/^[A-Za-z0-9_-]{11}$/
Un exemple plus détaillé en PHP:
public static function validId($id) {
return preg_match('/^[a-zA-Z0-9_-]{11}$/', $id) > 0;
}
J'ai résolu ce problème de la même manière que Roman l'avait recommandé. Dans mon aide:
Assurez-vous d'inclure vos besoins en haut du fichier:
require "net/http"
require "uri"
Ensuite:
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
Assurez-vous qu'il n'y a pas d'espace entre les crochets dans "# {response.code}"
Enfin, comparez-le à la réponse souhaitée:
def youtube_data(youtube_id)
if validate_id(youtube_id) == "200"
#video is good code
else %Q{ Video is no longer valid }
end
end
Je regarde juste pour voir si c'est alphanumérique avec tiret possible ou pas. Vous voudrez peut-être examiner oEmbed, vous pouvez interroger YouTube pour savoir si l'ID est une vidéo valide ou non.
Je pense que cela fonctionne pour vérifier si la vidéo existe ou non. D'autres validations peuvent être effectuées à l'aide de REGEX, comme mentionné ci-dessus. (Implémenté en utilisant 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);
}
}
Voici une implémentation simple de l'approche de Roman en 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;
}
Et voici les tests:
echo validYoutube('Nv7U6_WhqvQ');
echo validYoutube('Nv7U6_Whqvf');
echo validYoutube('Nv7U6_Whqzz');