2012-07-21 19 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