2013-09-28 7 views
3
public async Task<LoginResult> Login(string username, string password) 
    { 
     cookies = new CookieContainer(); 
     handler = new HttpClientHandler() 
     { 
      CookieContainer = cookies, 
      UseCookies = true, 
      AllowAutoRedirect = true, 
      UseProxy = true, 
      Proxy = null 
     }; 
     ThreadActivity.Account = username; 
     ThreadActivity.Status = "Logging in..."; 
     LoginResult result = new LoginResult(); 
     try 
     { 
      cookies = new CookieContainer(); 
      client = new HttpClient(handler); 
      client.DefaultRequestHeaders.Connection.Add("keep-alive"); 
      client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { MaxAge = TimeSpan.Zero }; 
      client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
      client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip,deflate,sdch"); 
      client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.8"); 
      client.DefaultRequestHeaders.Add("Accept-Charset", "ISO-8859-1"); 
      client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36"); 

      HttpResponseMessage hr = await client.GetAsync("https://instagram.com/accounts/login/#"); 
      if (!hr.IsSuccessStatusCode) 
       throw new Exception("Couldn't load instagram page; " + hr.ReasonPhrase); 
      string source = await hr.Content.ReadAsStringAsync(); 
      //Get login token 
      string token = ParseFormNameText(source, "csrfmiddlewaretoken"); 
      //Login 
      HttpContent content = new FormUrlEncodedContent(new[] 
      { 
        new KeyValuePair<string,string>("csrfmiddlewaretoken", token), 
        new KeyValuePair<string, string>("username", username), 
        new KeyValuePair<string, string>("password", password) 
      }); 
      client.DefaultRequestHeaders.Referrer = new Uri("https://instagram.com/accounts/login/"); 
      hr = await client.PostAsync("https://instagram.com/accounts/login/", content); 
      if (!hr.IsSuccessStatusCode) 
       throw new Exception("Couldn't submit login; " + hr.ReasonPhrase); 
      source = await hr.Content.ReadAsStringAsync(); 
      if (source.Contains("Please enter a correct username and password")) 
       throw new Exception("Couldn't login; invalid username/password."); 
      //Logged in, login to webstagram now 
      hr = await client.GetAsync("https://instagram.com/oauth/authorize/?client_id=9d836570317f4c18bca0db6d2ac38e29&redirect_uri=http://web.stagram.com/&response_type=code&scope=likes+comments+relationships"); 
      if (!hr.IsSuccessStatusCode) 
       throw new Exception("Couldn't load webstagram login; " + hr.ReasonPhrase); 
      source = await hr.Content.ReadAsStringAsync(); 
      if (!source.Contains(">LOG OUT</a>")) 
       throw new Exception("Couldn't load webstagram; failed to login."); 
      RaiseEvent("Logged in!", this); 
     } 
     catch (Exception ex) 
     { 
      RaiseEvent(ex.Message, this); 
      result.ErrorMessage = ex.Message; 
     } 
     finally 
     { 
      result.Success = string.IsNullOrEmpty(result.ErrorMessage); 
     } 
     return result; 
    } 

Это мой метод входа в систему, однако когда он действительно пытается отправить логин, я получаю 403 запрещенную ошибку. Но когда я пытаюсь сделать это с запуском Fiddler, он работает.HttpClient Post работает только в том случае, когда работает скрипач

Я не совсем понимаю, почему это так, может быть, кто-то может помочь?

+0

Что находится в теле вашего ответа HTTP/403? – EricLaw

+0

Кроме того, вы не должны сами устанавливать заголовок «Accept-Encoding», так как ваш код не будет работать, если сервер использует одно из кодировок, которые вы утверждаете для принятия. – EricLaw

ответ

1

У меня была аналогичная проблема. Проблема заключалась в том, что Fiddler - при перехвате трафика - изменил запрос. Я думаю, что в нашем случае прокси-сервер был настроен так, чтобы блокировать такие запросы (запрос ASP.net, не удалось) «CONNECT www.20min.ch», а Fiddler сменил запрос на «CONNECT http://www.20min.ch», которому было разрешено передавать прокси (работал). Возможно, вам нужно использовать Wireshark для сравнения запроса от Fiddler и ASP.net и искать разницу между ними.

Смежные вопросы