以编程方式登录Instagram

我正在尝试使用网络请求登录Instagram。 我很难理解发生了什么。 得到:远程服务器返回错误:(403)禁止。 到目前为止我所拥有的:

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 = ""; 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(); } 

登录的问题是请求需要在标头处设置cookie,并且容器没有设置它,因为当您从未知的资源管理器访问时,每次登录都会发生更改。 这是你可以做的:

 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(); 

仅供参考,这不会解决您的问题,但您需要学习将您的Stream和其他实现IDisposable对象放入using块:

 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 = ""; 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(); }