web-dev-qa-db-ja.com

YouTubeビデオIDを検証する方法は?

Youtube APIにアクセスする前に、自分のサイトのいずれかのURLで送信されたyoutubeビデオIDを検証したいのですが、そのようなIDで許可されている文字がわかりません。数字や文字が含まれている可能性があると推測しているネット上の人々を見かけますが、これらのビデオIDの公式仕様はまだ見ていません。

ありますか?

40
Tom

公式情報は this thread を参照してください。

あなたはこれを打つことができます: http://gdata.youtube.com/feeds/api/videos/VIDEO_ID (ページは「もう利用できません」を返します。)

応答に基づいてビデオが有効かどうかを判断する

すべての英数字の値が有効なIDであるとは限らないため、RegExでIDの有効性を確認する方法はありません。

pS私はビデオIDに「ダッシュ」を見たと確信しています

p.p.s. 「アンダースコア」も有効な文字です: http://www.youtube.com/watch?v=nrGk0AuFd_9

[a-zA-Z0-9 _-] {11}は正規表現( source )ですが、正規表現が有効であっても動画がそこにある保証はありません

58
roman m

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
   }
}
14
richwol

より迅速でスケーラブルなソリューションを探している場合は、将来的に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;
}
7
acidjazz

この問題は、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
Sorry-Im-a-N00b

私はそれがダッシュの可能性のある英数字であるかどうかを確認するだけです。 oEmbedを調べたい場合は、YouTubeにクエリを送信して、IDが有効な動画かどうかを確認できます。

1
NeuroScr

これは、ビデオが存在するかどうかを確認するのに役立つと思います。上記のように、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);
    }
}
0
user9290149

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');
0
Salvador Dali