2010-04-30 183 views
34

我想在訪問Youtube API之前驗證YouTube視頻ID在我的網站之一中的網址,但我不知道允許的字符在這樣的ID中是什麼。我看到網上有人猜測它可以包含數字和字符,但我還沒有看到這些視頻ID的官方說明。如何驗證YouTube視頻ID?

有沒有?

回答

51

查看this thread官方信息。

,你可以打這個:http://gdata.youtube.com/feeds/api/videos/VIDEO_ID

,並確定是否基於響應的視頻有效

有沒有辦法可以檢查與正則表達式的ID的有效性,因爲不是所有的字母數字值有效的ID。

p.s.我很確定我看到視頻ID的「破折號」

p.p.s. 「下劃線」是一個有效的性格也:http://www.youtube.com/watch?v=nrGk0AuFd_9

[A-ZA-Z0-9 _-] {11}是正則表達式(source),但不保證該視頻將在那裏即使正則表達式是有效

+0

如果你要檢查網址是否存在,這裏的一個例子在紅寶石:http://www.igvita.com/2006/09/07/validating-url-in-ruby-on-rails/ – borisrorsvort 2012-01-06 10:16:58

+1

這不再出現上班。 http://gdata.youtube.com/feeds/api/videos/NOT_A_VIDEO_ID返回200 OK。 – nornagon 2015-06-02 22:59:13

+0

進一步查看我的回答,其中涵蓋了API的V3解決方案 – richwol 2015-08-17 13:40:14

1

我只是看看它是否是字母數字和可能的短劃線。您可能希望查看oEmbed,您可以查詢YouTube以查看該ID是否爲有效視頻。

+1

連字符(破折號)也允許在YouTube影片ID。 – 2015-08-02 11:04:40

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 
6

如果您正在尋找更快,更具可擴展性的解決方案,我會說如果將來有更改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

不應該是' AZ'而不是'Az'。 – 2015-09-16 19:40:31

0

這裏是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; 
} 

這裏是測試:

echo validYoutube('Nv7U6_WhqvQ'); 
echo validYoutube('Nv7U6_Whqvf'); 
echo validYoutube('Nv7U6_Whqzz'); 
+1

不再支持,這是舊的v2 api。 v3現在是標準。 – FlavorScape 2015-08-12 03:49:59

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.totalResults===1) { 
    if(items[0].kind==='youtube#video') { 
     //valid video ID 
    } 
} 
+2

由於api的v2不再有效,現在這是必要的。謝謝你,我一直在尋找這個地方。 – Adam 2015-08-08 01:09:26

+0

沒問題,很高興我可以幫助:) – richwol 2015-08-17 13:40:49

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


} 

} 
+1

這只是一個隨機猜測。 OP還沒有說他在使用java – lokusking 2016-06-27 10:22:12