2012-07-21 78 views
0

我有一些代码,我登录到Facebook和它尽可能正常工作为返回我看到您登录。 之后的页面,但我想我的请求我登录后的实际配置文件,而不仅仅是我的新闻提要。 所以我必须将我的电子邮件和密码发送到登录页面,然后请求我的个人资料。 如何在请求我的个人资料时保持登录数据?入门POST变量后,页面的源代码已被送往

这里是我有什么

public static string logIn() 
    { 
     //get the cookies before you try to log in 
     CookieCollection cookies = new CookieCollection(); 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.facebook.com"); 
     request.CookieContainer = new CookieContainer(); 
     request.CookieContainer.Add(cookies); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     cookies = response.Cookies; 
     response.Close(); 

     //logging in 
     HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create("https://www.facebook.com/login.php?login_attempt=1"); 
     getRequest.CookieContainer = new CookieContainer(); 
     getRequest.CookieContainer.Add(cookies); 
     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"; 

     //sending the email/password 
     byte[] byteArray = Encoding.ASCII.GetBytes("[email protected]&pass=mypassword"); 
     getRequest.ContentLength = byteArray.Length; 
     Stream newStream = getRequest.GetRequestStream(); 
     newStream.Write(byteArray, 0, byteArray.Length); 
     newStream.Close(); 

     //returns the source of the page after logging in 
     HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse(); 
     StreamReader sr = new StreamReader(getResponse.GetResponseStream()); 
     string source = sr.ReadToEnd(); 
     cookies.Add(getResponse.Cookies); 

     //tries to get my profile source 
     //everything works fine until here 
     getRequest = (HttpWebRequest)WebRequest.Create("http://www.facebook.com/myprofile"); 
     getRequest.CookieContainer = new CookieContainer(); 
     getRequest.CookieContainer.Add(cookies); 
     getRequest.Method = WebRequestMethods.Http.Get; 
     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"; 

     getResponse = (HttpWebResponse)getRequest.GetResponse(); 
     sr = new StreamReader(getResponse.GetResponseStream()); 
     source = sr.ReadToEnd(); 
     getResponse.Close(); 
     return source; 
    } 

我试着这样做的几种方法,我得到它回到我的个人资料,但它返回它,就好像我不是在和你登录实际上无法查看我的个人资料(因为它设置为私密) 所以我需要我的登录信息以某种方式包含在请求我的个人资料时。

+0

有实特定的API来做到这一点的正确方法。你不应该试图通过网络界面来做到这一点。看看https://github.com/facebook-csharp-sdk/facebook-csharp-sdk.github.com – craig1231 2012-07-21 22:38:22

回答

0

你必须在一开始启动CookieCollection,并用它为所有请求。 CookieCollection每当您执行请求时都使用新的cookie进行更新,因此使用cookies.Add()也会将其搞乱。 但我现在工作的很好。

0

这让我难住了一段时间,当我做类似的东西。你需要确保你设置适当的饼干为您的要求你登录后,试着将它们应用到你的最后一个请求之前添加新的cookie来CookieCollection对象。

//^previous code^
HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse(); 
StreamReader sr = new StreamReader(getResponse.GetResponseStream()); 
string source = sr.ReadToEnd(); 

Uri facebookPage = new Uri("http://www.facebook.com"); // .GetCookies() only accepts a Uri 
cookies.Add(request.CookieContainer.GetCookies(facebookPage)); 

getResponse.Close(); // Always make sure you close your responses 

// V requesting your profile code V 
+0

我尝试了这种方式,没有运气。 我还有另一种方法,我也试图添加从登录时得到的cookie,当做最后的请求,但也没有运气。 我用这个更新了第一篇文章。 – Frobot 2012-07-22 03:15:24

+0

对不起,长时间回复。您是否尝试过使用[Fiddler](http://www.fiddler2.com/fiddler2/,“Fiddler”)?这是一个网络调试工具,在这种情况下非常有用。它可以显示您的程序正在发送/接收的标题信息,最重要的是cookie。我发现最好的选择是用你的网页浏览器登录/浏览器,看看你的浏览器正在发送什么,然后试着用你的程序复制它。我在回复中也改变了一件事,所以你可以试试。 – 2012-07-22 19:29:46

+0

我用提琴手搞砸了一些,它看起来像是在我的头上。我对这种东西了解不多。 但我敢肯定,我唯一的问题就是使用cookie。在尝试大量不同的方式之后,我仍然无法找到发送正确cookie的方法。 – Frobot 2012-07-22 20:49:31