C # - HttpWebRequest POST (Войти в Facebook) - PullRequest
19 голосов
/ 08 декабря 2011

Я пытаюсь войти в Facebook в моей программе и проанализировать некоторую информацию оттуда (например, имя, изображение профиля и т. Д.).

Я перенаправляюсь обратно на главную страницу Facebook каждый раз, когда выполняюкод ниже.

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

Что я здесь не так делаю?Любая помощь будет оценена, большое спасибо!:)

edit: я узнал, как это сделать вскоре после публикации.

Facebook отправляет cookie-файл каждый раз, когда вы посещаете его, чтобы узнать, включены ли у вас cookie-файлы.запросите страницу входа в Facebook, чтобы получить куки, затем отправьте еще один с данными POST.Это сработало, и я успешно вошел в систему.

В любом случае, спасибо!:)

Ответы [ 3 ]

34 голосов
/ 17 декабря 2011

Я рад, что вы нашли свой ответ, я мог бы войти в Facebook, используя HttpWebRequest, как вы и сказали. Вот приемлемый способ:

Первый запрос : Получить куки.

 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;

Второй запрос : ПОСТАВЬТЕ данные формы и восстановите куки-файлы с первого запроса ..

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

Это один из многих способов, который работает с HttpWebRequest, также, если вы предпочитаете использовать WebBrowser, он работает приемлемо, используя следующее:

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

Я только что понял, что он не работает с InternetSetCookie, возможно, причина в том, что файлы cookie, возвращаемые из Facebook, имеют атрибут «HttpOnly» (true) и не могут быть доступны клиентскому скрипту .

4 голосов
/ 08 декабря 2011

Иногда проще использовать веб-браузер, и вы можете запустить этот браузер, скрытый в фоновом режиме. Позже вы можете получить внутренний HTML или, возможно, загрузить изображение. Все, что вам нужно сделать. Вот пример использования форм Windows.

Создайте новое приложение выигрышных форм, добавьте кнопку и вставьте этот код внутрь. не добавляйте ничего, что должно работать ...

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
        {

        }
    }
}
0 голосов
/ 02 апреля 2013
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");
...