2017-02-22 22 views
1

У меня есть WebRequest в C#, который я пытаюсь использовать для извлечения данных из Instagram. WebRequest выбрасывает The remote server returned an error: (403) Forbidden., но команда cURL возвращает HTML. На практике мои данные формы POST будут длиннее и возвратят JSON.C# WebRequest, но не cURL Дает ошибку 403

C#

 String uri = "https://www.instagram.com/query/"; 
     var request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = "POST"; 

     string postData = "q=ig_user(1118028333)"; 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] byte1 = encoding.GetBytes(postData); 

     // Set the content type of the data being posted. 
     request.ContentType = "application/x-www-form-urlencoded"; 

     // Set the content length of the string being posted. 
     request.ContentLength = byte1.Length; 


     using (var dataStream = request.GetRequestStream()) 
     { 
      dataStream.Write(byte1, 0, byte1.Length); 
     } 

     try 
     { 
      var x = (HttpWebResponse)request.GetResponse(); 
     } 
     catch (WebException wex) 
     { 
      String wMessage = wex.Message; 
     } 

Выдает ошибку 403.

Curl (в Windows)

curl "https://www.instagram.com/query/" --data "q=ig_user(1118028333)" 

Возвращает HTML.

FireFox Тело запроса, метод = POST, без заголовков

q=ig_user(1118028333) 

Возвращает HTML

Почему бы WebRequest ошибка броска 403, но не завиток или FireFox? Что еще я могу сделать на C# для получения данных?

ответ

1

Почему WebRequest выбрасывает ошибку 403, но не cURL или FireFox?

Я думаю, вы сбиты с толку. Причина, по которой я так предполагаю, это потому, что я просто попытался сделать то же самое с Postman, и пока я получаю ответ HTML, я также получаю 403 код статуса ответа. Я думаю, вы, возможно, не обратили внимание на код ответа cUrl. Ниже

enter image description here

Что еще я могу сделать в C#, чтобы получить данные?

Обычно, я стараюсь использовать System.Net.Http.HttpClient класс, так что я могу проверить код статуса первого до того, как исключение, и я могу даже получить содержимое ответа (если таковые имеются), даже если код ответа больше чем 400 (ошибка ответа)

try 
{ 
    var client = new HttpClient(); 
    var response = await client.GetAsync(url); 

    if (response.IsSuccessStatusCode) 
    { 
     var json = await response.Content.ReadAsStringAsync(); 
    } 
    else 
    { 
     string content = null; 

     if (response.Content != null) 
     { 
      content = await response.Content.ReadAsStringAsync(); 
     } 
    } 

} 
catch (Exception ex){}