2013-09-28 2 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 금지 된 오류가 발생합니다. 하지만 피들러가 달리는대로 해보려고하면 효과가 있습니다.HttpClient Post는 피들러가 실행 중일 때만 작동합니다.

왜 이런 일을하는지 잘 모르겠지만 누군가 도움을 줄 수 있습니까?

+0

HTTP/403 응답의 본문에는 무엇이 있습니까? – EricLaw

+0

또한 서버가 받아들이도록 주장하는 인코딩 중 하나를 사용하는 경우 코드가 실패하기 때문에 자신이'Accept-Encoding' 헤더를 직접 설정해서는 안됩니다. – EricLaw

답변

1

한 번 비슷한 문제가있었습니다. 문제는 피델 러가 - 교통편을 가로 챌 때 - 요청을 변경했다는 것입니다. 나는 우리의 경우 프록시 서버가이 요청 (ASP.net 요청 실패)을 "CONNECT www.20min.ch"와 같이 요청을 차단하고 Fiddler가 요청을 "CONNECT http://www.20min.ch"으로 변경하여 프록시 일했다). 어쩌면 Wireshark를 사용하여 Fiddler와 ASP.net의 요청을 비교하고 그 차이점을 찾아야 할 것입니다.

관련 문제