it-swarm.com.de

Wie validiere ich YouTube-Video-IDs?

Ich möchte YouTube-Video-IDs überprüfen, die in der URL zu einer meiner Websites enthalten sind, bevor ich auf die Youtube-API zugreife. Ich weiß jedoch nicht, welche Zeichen in einer solchen ID zulässig sind. Ich sehe Leute im Netz, die vermuten, dass es Zahlen und Zeichen enthalten kann, aber ich habe noch keine offizielle Spezifikation dieser Video-IDs gesehen.

Ist dort eines?

38
Tom

Siehe diesen Thread für offizielle Informationen.

sie können dies treffen: http://gdata.youtube.com/feeds/api/videos/VIDEO_ID (Die Seite wird jetzt zurückgegeben: "Nicht mehr verfügbar".)

und anhand der Antwort ermitteln, ob das Video gültig ist

Es gibt keine Möglichkeit, die Gültigkeit der ID mit RegEx zu überprüfen, da nicht alle alphanumerischen Werte gültige IDs sind.

p.s. Ich bin mir ziemlich sicher, dass ich in Video-IDs "Striche" gesehen habe

p.p.s. "Unterstrich" ist auch ein gültiges Zeichen: http://www.youtube.com/watch?v=nrGk0AuFd_9

[a-zA-Z0-9 _-] {11} ist der Regex ( source ). Es kann jedoch nicht garantiert werden, dass das Video auch dann vorhanden ist, wenn Regex gültig ist

57
roman m

Mit v3 der YouTube-API habe ich dies erreicht, indem ich aufgerufen habe:

GET https://www.googleapis.com/youtube/v3/videos?part=id&id=Tr5WcGSDqDg&key={YOUR_API_KEY}

Dies gibt so etwas zurück:

{
  "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"
  }]
}

So können Sie einfach einen Check machen:

if(json.hasOwnProperty('pageInfo') && json.pageInfo.totalResults === 1) {
   if(items[0].kind==='youtube#video') {
      //valid video ID
   }
}
12
richwol

Wenn Sie nach einer schnelleren und skalierbareren Lösung suchen, würde ich sagen, dass Sie REGEX mit etwas Protokollierung/Fallback verwenden sollten, um Fehler proaktiv zu machen, wenn YouTube seine ID in der Zukunft ändert.

Ich arbeite seit einiger Zeit mit der YouTube-API und beschäftige mich mit Millionen von Videos . Wenn ich sie durchschleife, fand ich das am besten geeignet:

/^[A-Za-z0-9_-]{11}$/

Ein ausführlicheres Beispiel sagen wir in PHP:

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

Ich habe dieses Problem auf die gleiche Weise gelöst, die Roman empfohlen hat. In meinem Helfer:

Stellen Sie sicher, dass Sie Ihre Anforderungen oben in der Datei angeben:

require "net/http"
require "uri"

Dann:

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

Stellen Sie sicher, dass sich zwischen den Klammern in "# {response.code}" kein Leerzeichen befindet.

Vergleichen Sie es schließlich mit der gewünschten Antwort:

def youtube_data(youtube_id) 
  if validate_id(youtube_id) == "200"
    #video is good code
  else %Q{ Video is no longer valid }
  end
end
6
Sorry-Im-a-N00b

Ich schaue nur, ob es alphanumerisch ist und möglicherweise einen Bindestrich enthält. Vielleicht möchten Sie in oEmbed nachschauen. Sie können YouTube abfragen, ob die ID ein gültiges Video ist oder nicht. 

1
NeuroScr

Ich denke, das funktioniert, um zu überprüfen, ob das Video existiert oder nicht. Andere Validierungen können wie oben erwähnt mit REGEX durchgeführt werden. (Implementiert mit 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

Hier ist eine einfache Implementierung des Ansatzes von Roman in 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;
}

Und hier sind die Tests:

echo validYoutube('Nv7U6_WhqvQ');
echo validYoutube('Nv7U6_Whqvf');
echo validYoutube('Nv7U6_Whqzz');
0
Salvador Dali