2012-12-24 4 views
3

웹 요청을 사용하여 Instagram에 로그인하려고합니다. 나는 무슨 일이 일어나고 있는지 이해할 시간이 없다. 받기 : 원격 서버가 오류를 반환했습니다 : (403) 금지되었습니다. 내가 지금까지 가지고 :instagram에 프로그래밍 방식으로 로그인

public static string csrf; 
    CookieContainer c1 = new CookieContainer(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string PostData = String.Format("csrfmiddlewaretoken={0}&username=ra123&password=ra12345678",getToken()); 

     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/"); 
     req.Method = "POST"; 
     req.ContentType = "application/x-www-form-urlencoded"; 
     req.KeepAlive = true; 
     req.AllowAutoRedirect = true;    
     req.CookieContainer = c1; 
     byte[] byteArray = Encoding.ASCII.GetBytes(PostData); 
     req.ContentLength = byteArray.Length; 
     Stream dataStream = req.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Flush(); 
     dataStream.Close(); 

      HttpWebResponse webResp = (HttpWebResponse)req.GetResponse(); 
      Stream datastream = webResp.GetResponseStream(); 
      StreamReader reader = new StreamReader(datastream); 
      string s = reader.ReadToEnd(); 
      MessageBox.Show(s); 
      if (s.Contains("ra123")) 
      { 

       MessageBox.Show("Loggedin"); 

      } 
      else 
      { 
       MessageBox.Show("Not"); 
      } 

    } 


    string getToken() 
    { 
     string p = "<input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"(.*)\"/>"; 
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/"); 
     req.Method = "GET"; 
     req.CookieContainer = c1; 

     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
     Stream data = resp.GetResponseStream(); 
     StreamReader sr = new StreamReader(data); 
     string src = sr.ReadToEnd(); 

     Match m = Regex.Match(src, p); 
     if (m.Success) 
     { 
      return (m.Groups[1].Value.ToString()); 
     } 
     return false.ToString(); 
    } 

답변

0

참고로,이 문제가 해결되지 않습니다,하지만 당신은 IDisposableusing에 블록을 구현하여 Stream 및 기타 개체 배치 배울 필요가 :

public static string csrf; 
CookieContainer c1 = new CookieContainer(); 

private void button1_Click(object sender, EventArgs e) 
{ 
    string PostData = String.Format("csrfmiddlewaretoken={0}&username=ra123&password=ra12345678", getToken()); 

    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/"); 
    req.Method = "POST"; 
    req.ContentType = "application/x-www-form-urlencoded"; 
    req.KeepAlive = true; 
    req.AllowAutoRedirect = true; 
    req.CookieContainer = c1; 
    byte[] byteArray = Encoding.ASCII.GetBytes(PostData); 
    req.ContentLength = byteArray.Length; 
    using (Stream dataStream = req.GetRequestStream()) 
    { 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Flush(); 
     dataStream.Close(); 
    } 

    string s; 
    using (HttpWebResponse webResp = (HttpWebResponse)req.GetResponse()) 
    { 
     using (Stream datastream = webResp.GetResponseStream()) 
     { 
      using (StreamReader reader = new StreamReader(datastream)) 
      { 
       s = reader.ReadToEnd(); 
      } 
     } 
    } 
    MessageBox.Show(s); 
    if (s.Contains("ra123")) 
    { 

     MessageBox.Show("Loggedin"); 

    } 
    else 
    { 
     MessageBox.Show("Not"); 
    } 

} 

string getToken() 
{ 
    string p = "<input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"(.*)\"/>"; 
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/"); 
    req.Method = "GET"; 
    req.CookieContainer = c1; 

    string src; 
    using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse()) 
    { 
     using (Stream data = resp.GetResponseStream()) 
     { 
      using (StreamReader sr = new StreamReader(data)) 
      { 
       src = sr.ReadToEnd(); 
      } 
     } 
    } 

    Match m = Regex.Match(src, p); 
    if (m.Success) 
    { 
     return (m.Groups[1].Value.ToString()); 
    } 
    return false.ToString(); 
} 
+0

어떻게 도움이 될까요? 나는 블록을 "사용하는 것"의 긍정적 인면을 의미합니다. 또한, 정말 고마워,하지만 지금은 내 문제를 해결할 필요가있다 : ( – user1815324

+0

그래서이 문제를 해결할 수 없다고 말한 이유가있다. –

+0

@JohnSaunders가 대답을하지 않는가? – bmargulies

1

을 로그인 문제는 요청에서 헤더에 쿠키를 설정해야하며 알 수없는 탐색기에서 액세스 할 때마다 로그인 할 때마다 변경되므로 컨테이너가 설정하지 않는다는 것입니다. 다음은 할 수있는 일입니다.

WebResponse Response; 
HttpWebRequest Request; 
Uri url = new Uri("http://thewebpage.com:port/login/"); 

CookieContainer cookieContainer = new CookieContainer(); 

Request = (HttpWebRequest)WebRequest.Create(url); 
Request.Method = "GET"; 
Request.CookieContainer = cookieContainer; 

// Get the first response to obtain the cookie where you will find the "csrfmiddlewaretoken" value 
Response = Request.GetResponse(); 

string Parametros = "csrfmiddlewaretoken=" + cookieContainer.GetCookies(url)["csrftoken"].Value + "&username=USER&password=PASSWORD&next="; // This whill set the correct url to access 

Request = (HttpWebRequest)WebRequest.Create(url); // it is important to use the same url used for the first request 
Request.Method = "POST"; 
Request.ContentType = "application/x-www-form-urlencoded"; 
Request.UserAgent = "Other"; 
// Place the cookie container to obtain the new cookies for further access 
Request.CookieContainer = cookieContainer; 
Request.Headers.Add("Cookie",Response.Headers.Get("Set-Cookie")); // This is the most important step, you have to place the cookies at the header (without this line you will get the 403 Forbidden exception             

byte[] byteArray = Encoding.UTF8.GetBytes(Parametros); 
Request.ContentLength = byteArray.Length; 

Stream dataStream = Request.GetRequestStream(); 
dataStream.Responseite(byteArray, 0, byteArray.Length); 
dataStream.Close(); 

Response = Request.GetResponse(); 
관련 문제