2017-07-17 2 views
0

J'utilise webrequests pour obtenir des données vidéo hors de YouTube en utilisant l'URL http://youtube.com/get_video_info?video_id={ID HERE}YouTube Video Info retour des résultats différents avec le navigateur et WebRequest C#

Lorsque je visite l'URL avec un navigateur, il télécharge le fichier de réponse et toutes les données nécessaires sont présentes. Cependant, lorsque j'utilise un HttpWebRequest pour télécharger la réponse avec un UserAgent approprié, beaucoup de données sont manquantes. Les données qui ne sont pas présentes concernent principalement les informations sur les paramètres régionaux, les informations sur la version du navigateur (que je pensais contenir la bonne chaîne UserAgent, mais je ne pense pas) et les identifiants associés aux événements créés à partir de la requête.

Ma question est la suivante: Pourquoi cette donnée est-elle présente dans la version que mon navigateur télécharge par rapport à la demande Web? Comment puis-je voir ce que mon navigateur envoie qui le différencie de la demande que je suis en train de créer?

Voilà comment je demande actuellement les données en C#:

 var url = string.Format("http://youtube.com/get_video_info?video_id={0}", videoId); 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     request.UserAgent = userAgent; 
     var response = request.GetResponse(); 

     string contents; 
     using (var sr = new StreamReader(response.GetResponseStream())) 
      contents = sr.ReadToEnd(); 
+0

Vous pouvez afficher les requêtes/réponses de votre navigateur et de l'application à l'aide d'un outil comme [Fiddler] (http: //www.telerik.com/fiddler). – Poosh

Répondre

1

standard WebRequest et demande de navigateur envoyer des en-têtes différents. Vous devez préparer correctement votre WebRequest (configuration des en-têtes et cookies corrects) pour effectuer la même requête HTTP.

Pour voir la différence, téléchargez Fiddler et ouvrez la même URL dans le navigateur, puis dans Visual Studio et comparez les deux demandes en mode texte brut. Vous remarquerez que WebRequest manque beaucoup d'en-têtes.

0

Votre navigateur envoie généralement une requête plus longue à get_video_info qui inclut les paramètres régionaux et un type d'identificateur de session appelé sts.

Pour obtenir sts Je recherche la config json sur la montre ou la page d'intégration, puis recherche une propriété appelée "sts". Vous pouvez utiliser cette regex pour le trouver: paramètre

var sts = Regex.Match(html, @"""sts""\s*:\s*(\d+)").Groups[1].Value; 

Les paramètres régionaux/langue est passé en utilisant la requête appelée hl.

Et puis il y a deux autres paramètres el et ps, je n'ai aucune idée de ce qu'ils font mais d'une manière ou d'une autre ils influencent la réponse. Je les ai juste mis aux valeurs prédéfinies.

Enfin, la chaîne de requête ressemble aime ça:

"https://www.youtube.com/get_video_info?video_id={videoId}&sts={sts}&el=info&ps=default&hl={language}" 

Extrait d'ici: https://github.com/Tyrrrz/YoutubeExplode/blob/f24c5b0040ffdded6922fc1b853c3d7155812f0b/YoutubeExplode/YoutubeClient.cs#L200