С# - HttpWebRequest POST (Войти в Facebook)
Я пытаюсь войти в 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);
}
Что я здесь делаю неправильно? Любая помощь будет оценена, большое спасибо!:)
изменить:
Я узнал, как это сделать вскоре после того, как я разместил.
Facebook отправляет куки файлы каждый раз, когда вы посещаете его, чтобы узнать, есть ли у вас файлы cookie, что я сделал, это отправить запрос на страницу входа в Facebook для получения файлов cookie, а затем отправить другой с данными POST. Он работал таким образом, и я успешно вошел в систему.
Спасибо, в любом случае!:)
Ответы
Ответ 1
Я рад, что вы нашли свой ответ, я могу войти в facebook с помощью HttpWebRequest
тоже, как вы сказали. Здесь приемлемое обходное решение:
Первый запрос: Получить файлы cookie.
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;
Второй запрос: ОТПРАВИТЬ данные формы и восстановить файлы cookie с первого запроса.
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
, может быть, причина в том, что Cookies, возвращенные из Facebook, имеют атрибут HttpOnly (true), и он не может быть доступен на стороне клиента script.
Ответ 2
Иногда проще использовать веб-браузер, и вы можете запустить этот браузер, скрытый в фоновом режиме. Позже вы можете получить внутренний 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
{
}
}
}
Ответ 3
он отлично работает, остается проблемой, когда я пытаюсь подключиться к нескольким учетным записям, запускается исключение (тайм-аут), я понял, что facebook запретил подключения последовательных запросов, поэтому я пытался выйти из системы каждый раз, когда я хочу изменить пользователя, но я потерпел неудачу. здесь моя треска для выхода:
public void Logout()
{
loginResult = PostRequest.HttpPost(
"https://www.facebook.com/logout.php",
"fb_dtsg=AQAsBT0t&ref=mb&h=Affnf_e5MVZXT6Gj",
cookieContainer);
}
после этого ответ, который я получаю, состоит в том, что пользователь все еще подключен
Ответ 4
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");
Ответ 5
Вы пытаетесь передать параметр входа на страницу входа в facebook? Если да, facebook не позволяет это делать каким-либо образом...