0

Facebook にログインするコードがいくつかあり、ログイン直後に表示されるページが返される限り問題なく動作します。ただし、ログイン後にニュース フィードだけでなく、実際のプロファイルを要求しようとしています。そのため、ログイン ページにメール アドレスとパスワードを送信してから、プロファイルをリクエストする必要がありました。プロファイルをリクエストしている間、ログイン データを保持するにはどうすればよいですか?

これが私が持っているものです

    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=myemail@yahoo.com&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;
    }

これを行ういくつかの方法を試し、プロファイルを返すようにしましたが、ログインしていないかのように返され、実際にプロファイルを表示できません (非公開に設定されているため)プロファイルを要求するときに、何らかの形でログイン情報が含まれるようにします。

4

2 に答える 2

0

最初に CookieCollection を開始し、それをすべてのリクエストに使用する必要があります。CookieCollection は、リクエストを行うたびに新しい Cookie で更新されるため、cookies.Add() を使用すると、それも台無しになります。しかし、私はそれがうまくいくようになりました。

于 2012-07-24T21:33:26.803 に答える
0

これは、私が似たようなものを作っていたとき、しばらく困惑しました。ログイン後、リクエストに適切な Cookie を設定していることを確認する必要がありますCookieCollection。最後のリクエストに適用する前に、新しい Cookie をオブジェクトに追加してみてください。

// ^ 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
于 2012-07-22T00:12:49.800 に答える