C # – HttpWebRequest POST (Iniciar sesión en Facebook)

Intento iniciar sesión en Facebook en mi progtwig y analizar algo de allí (como nombre, foto de perfil, etc.).

Me redireccionan a la página principal de Facebook cada vez que ejecuto el código a continuación.

string email = "email"; string pw = "pw"; string PostData = String.Format("email={0}&pass={1}", email, pw); CookieContainer cookieContainer = new CookieContainer(); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(""); req.CookieContainer = cookieContainer; req.Method = "POST"; req.ContentLength = PostData.Length; req.ContentType = "application/x-www-form-urlencoded"; req.AllowAutoRedirect = true; req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; ASCIIEncoding encoding = new ASCIIEncoding(); byte[] loginDataBytes = encoding.GetBytes(PostData); req.ContentLength = loginDataBytes.Length; Stream stream = req.GetRequestStream(); stream.Write(loginDataBytes, 0, loginDataBytes.Length); HttpWebResponse webResp = (HttpWebResponse)req.GetResponse(); Stream datastream = webResp.GetResponseStream(); StreamReader reader = new StreamReader(datastream); webBrowser1.DocumentText = reader.ReadToEnd(); foreach (Cookie cookies in webResp.Cookies) { MessageBox.Show(cookies.Name + " " + cookies.Value); } 

¿Qué estoy haciendo mal aquí? Cualquier ayuda sería apreciada, muchas gracias! 🙂

editar: descubrí cómo hacerlo poco después de publicar.

Facebook envía una cookie cada vez que la visitas para ver si tienes habilitadas las cookies, lo que hice fue enviar una solicitud a la página de inicio de sesión de Facebook para obtener las cookies y luego enviar otra con los datos POST. Funcionó de esta manera y me conecté con éxito.

¡Gracias de cualquier manera! 🙂

Me alegro de que haya encontrado su respuesta. También pude iniciar sesión en Facebook utilizando HttpWebRequest , tal como lo dijo. Aquí hay una solución aceptable:

Primera solicitud : obtener las cookies.

  CookieCollection cookies = new CookieCollection(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.facebook.com); request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); //Get the response from the server and save the cookies from the first request.. HttpWebResponse response = (HttpWebResponse)request.GetResponse(); cookies = response.Cookies; 

Segunda solicitud : PUBLICAR los datos del formulario y recuperar las cookies de la primera solicitud.

  string getUrl = "https://www.facebook.com/login.php?login_attempt=1"; string postData = String.Format("email={0}&pass={1}", "value1", "value2"); HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl); getRequest.CookieContainer = new CookieContainer(); getRequest.CookieContainer.Add(cookies); //recover cookies First request getRequest.Method = WebRequestMethods.Http.Post; getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; getRequest.AllowWriteStreamBuffering = true; getRequest.ProtocolVersion = HttpVersion.Version11; getRequest.AllowAutoRedirect = true; getRequest.ContentType = "application/x-www-form-urlencoded"; byte[] byteArray = Encoding.ASCII.GetBytes(postData); getRequest.ContentLength = byteArray.Length; Stream newStream = getRequest.GetRequestStream(); //open connection newStream.Write(byteArray, 0, byteArray.Length); // Send the data. newStream.Close(); HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse(); using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) { string sourceCode = sr.ReadToEnd(); } 

Esta es una de las muchas maneras que funciona con HttpWebRequest , también si usted prefiere usar WebBrowser, funciona aceptable usando lo siguiente:

 webBrowser1.Navigate("https://www.facebook.com/login.php?login_attempt=1", "",byteArray, "Content-Type: application/x-www-form-urlencoded"); 

Lo que acabo de darme cuenta es que no funciona con InternetSetCookie tal vez la razón sea porque las Cookies devueltas desde Facebook tienen el atributo “HttpOnly” (verdadero), y no puede ser accesible mediante el script del lado del cliente.

A veces es más fácil usar el navegador web y puedes ejecutar ese navegador oculto en segundo plano. Más tarde puede obtener el html interno o quizás descargar una imagen. Lo que sea que necesites hacer Aquí hay un ejemplo usando formularios de Windows.

Cree una nueva aplicación de formularios para ganar, agregue un botón y pegue ese código en su interior. no agregue nada más, debería funcionar …

 private void button1_Click(object sender, EventArgs e) { string email = "Your email"; string password = "your password"; // create a new browser WebBrowser w = new WebBrowser(); w.Dock = DockStyle.Fill; this.Controls.Add(w); // you may add the controll to your windows forms if you want to see what is going on // latter you may not chose to add the browser or you can even set it to invisible... // navigate to facebook w.Navigate(@"http://www.facebook.com/"); // wait a little for (int i = 0; i < 100; i++) { System.Threading.Thread.Sleep(10); System.Windows.Forms.Application.DoEvents(); } HtmlElement temp=null; // while we find an element by id named email while (temp == null) { temp = w.Document.GetElementById("email"); System.Threading.Thread.Sleep(10); System.Windows.Forms.Application.DoEvents(); } // once we find it place the value temp.SetAttribute("value", email); temp = null; // wiat till element with id pass exists while (temp == null) { temp = w.Document.GetElementById("pass"); System.Threading.Thread.Sleep(10); System.Windows.Forms.Application.DoEvents(); } // once it exist set it value equal to passowrd temp.SetAttribute("value", password); // if you already found the last fields the button should also be there... var inputs = w.Document.GetElementsByTagName("input"); int counter = 0; bool enableClick = false; // iterate through all the inputs in the document foreach (HtmlElement btn in inputs) { try { var att = btn.GetAttribute("tabindex"); var name = btn.GetAttribute("id"); if (enableClick)// button to submit always has a differnt id. it should be after password textbox { btn.InvokeMember("click"); counter++; } if (name.ToUpper().Contains("PASS") || att=="4") { enableClick = true; // button should be next to the password input } // try a max of 5 times if (counter > 5) break; } catch { } } } 
 webbrowser1.navigate("www.facebook.com"); webbrowser1.GetElementByiId("email").value="your mail ID"; webbrowser1.GetElementByiId("pass").value="password"; HtmlElement form = webBrowser1.Document.GetElementById("FormID"); if (form != null) form.InvokeMember("submit");