2012-01-12 74 views
1

我的代码被卡住了。我只是想通过C#和httpweb请求访问Facebook主页。facebook使用HttpWebRequest的Web表单登录(c#)

我试图做的登录的东西有:

System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://www.facebook.com/login.php?login_attempt=1"); 
string s = "[email protected]&pass=YYYYY"; 

CookieContainer cookies = new System.Net.CookieContainer(); 

request.Method = "POST"; 
request.AllowAutoRedirect = false; 
request.MaximumAutomaticRedirections = 1; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"; 
request.KeepAlive = true; 
request.Timeout = 10000; 
request.CookieContainer = cookies; 
request.ContentLength = s.Length; 

byte[] bytes = Encoding.UTF8.GetBytes(s); 
request.ContentLength = bytes.Length; 

System.IO.Stream requestStream = request.GetRequestStream(); 
requestStream.Write(bytes, 0, bytes.Length); 
requestStream.Close(); 

Console.WriteLine("\n Cookies count is :{0}", cookies.Count); //0, obviously 
//get response and print it 

System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse(); 
System.IO.Stream response_stream = response.GetResponseStream(); 
System.IO.StreamReader sr = new System.IO.StreamReader(response_stream); 
string response_string = sr.ReadToEnd(); 

Console.WriteLine("\n Cookies count is :{0}", cookies.Count); 

确定。在这一点上发生了两两件事:

  1. 我有3周存储的cookie(cookies.count)从FB
  2. HTML回应说,我需要激活cookies在我的浏览器。

我的问题是:

  1. 上面是正确的代码?如果是这样,为什么我从FB获取cookie消息?
  2. 如果我现在想导航到我的FB主页,是否应该使用先前填充的Cookie存储创建另一个主页URL请求?

回答

0

如果你需要从Facebook阅读某些东西,也许最好使用Facebook的API来做到这一点。有一个项目Facebook c# SDK on codeplex,它可以得心应手。

+0

谢谢您的回答。是的,我知道FB sdk,但它不是我想要的。编号喜欢建立一个应用程序,直接从网上检查信息。再次感谢。 – 2012-01-12 13:34:30

1

现在解决了,谢谢。

问题是用于执行登录POST表单的格式错误的字符串。确保包含原始Web表单中的确切参数+值。

;)

0
public class FacebookOAuth 
{ 
    private string _loginUrl = "https://www.facebook.com/login.php?login_attempt=1"; 
    private string _redirectUrl = "https://www.facebook.com/connect/login_success.html"; 
    private string _authorizeUrl = "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}"; 
    private string _tokenUrl = "https://graph.facebook.com/oauth/access_token?code={0}&client_id={1}&redirect_uri={2}"; 
    private CookieContainer _cookieContainer = new CookieContainer(); 
    private string _httpsRefUrl = "https://facebook.com"; 


    public string Authenticate(UserInfo user) 
    { 
     // get post data 
     var postData = GetPostData(user, _loginUrl); 
     // authentificate   
     var content = GetContant(_loginUrl, postData); 
     return content; 
    } 

    private string GetPostData(UserInfo user, string loginUrl) 
    { 
     // get content from login form 
     var content = GetContant(loginUrl); 
     return GetPostDataFromContent(content, user); 
    } 

    private string GetPostDataFromContent(string content, UserInfo user) 
    { 
     var dictOfPostData = new Dictionary<string, string>(); 
     if (!string.IsNullOrEmpty(content)) 
     { 
      var doc = XDocument.Parse(content); 
      var inputs = doc.Descendants(XName.Get("input")); 
      foreach (var item in inputs) 
      { 
       var attrbuteName = item.Attributes(XName.Get("name")).FirstOrDefault(); 
       var attrbuteValue = item.Attributes(XName.Get("value")).FirstOrDefault(); 
       if (attrbuteName != null) 
       { 
        switch (attrbuteName.Value) 
        { 
         case "lsd": 
         case "default_persistent": 
         case "timezone": 
         case "lgnrnd": 
         case "lgnjs": 
         case "locale": 
          dictOfPostData.Add(attrbuteName.Value, attrbuteValue.Value); 
          break; 
         case "email": 
          dictOfPostData.Add(attrbuteName.Value, user.Login); 
          break; 
         case "pass": 
          dictOfPostData.Add(attrbuteName.Value, user.Password); 
          break; 

        } 
       } 
      } 
     } 
     return string.Join("&", dictOfPostData.Select(pair => string.Format("{0}={1}", pair.Key, pair.Value))); ; 
    } 
    /// <summary> 
    /// <see cref="GetContant(string, string, Func&lt;HttpWebResponse, string&gt;)"/> 
    /// </summary> 
    /// <param name="url"></param> 
    /// <returns></returns> 
    public string GetContant(string url) 
    { 
     return GetContant(url, string.Empty, null); 
    } 

    /// <summary> 
    /// <see cref="GetContant(string, string, Func&lt;HttpWebResponse, string&gt;)"/> 
    /// </summary> 
    /// <param name="url"></param> 
    /// <param name="postData"></param> 
    /// <returns></returns> 
    public string GetContant(string url, string postData) 
    { 
     return GetContant(url, postData, null); 
    } 

    /// <summary> 
    /// <see cref="GetContant(string, string, Func&lt;HttpWebResponse, string&gt;)"/> 
    /// </summary> 
    /// <param name="url"></param> 
    /// <param name="funcParseResponse"></param> 
    /// <returns></returns> 
    public string GetContant(string url, Func<HttpWebResponse, string> funcParseResponse) 
    { 
     return GetContant(url, string.Empty, funcParseResponse); 
    } 

    /// <summary> 
    /// Get content from web page or write post data 
    /// If post data empty call method=GET, else POST 
    /// </summary> 
    /// <param name="url">Start url</param> 
    /// <param name="postData">Post data, can be null</param> 
    /// <param name="funcParseResponse"></param> 
    /// <returns></returns> 
    public string GetContant(string url, string postData, Func<HttpWebResponse, string> funcParseResponse) 
    { 
     var content = string.Empty; 
     var encoding = Encoding.UTF8; 
     var webRequest = (HttpWebRequest)HttpWebRequest.Create(url); 

     if (!string.IsNullOrEmpty(postData)) 
     { 
      webRequest.Method = "POST"; 
     } 

     webRequest.Referer = _httpsRefUrl; 
     webRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0)"; 
     webRequest.Accept = "text/html, application/xhtml+xml, */*"; 
     webRequest.Headers.Add("Accept-Language", "ru"); 
     webRequest.ContentType = "application/x-www-form-urlencoded"; 
     webRequest.CookieContainer = _cookieContainer; 
     webRequest.KeepAlive = true; 
     webRequest.AllowAutoRedirect = false; 

     if (!string.IsNullOrEmpty(postData)) 
     { 
      // Write post data 
      var dataBytes = encoding.GetBytes(postData); 
      webRequest.ContentLength = dataBytes.Length; 
      webRequest.GetRequestStream().Write(dataBytes, 0, dataBytes.Length); 
     }; 

     // make request 
     using (var webResponse = (HttpWebResponse)webRequest.GetResponse()) 
     { 
      using (var stream = webResponse.GetResponseStream()) 
      { 
       var streamReader = new StreamReader(stream, encoding); 
       content = streamReader.ReadToEnd(); 
      } 
      var parseResult = funcParseResponse != null ? funcParseResponse.Invoke(webResponse) : string.Empty; 
      if (!string.IsNullOrEmpty(parseResult)) 
      { 
       return parseResult; 
      } 
      // If we have status 302 
      if (webResponse.StatusCode == HttpStatusCode.Found) 
      { 
       var redirectUrl = Convert.ToString(webResponse.Headers["Location"]); 
       // call handly 
       content = this.GetContant(redirectUrl, funcParseResponse); 
      } 
     } 
     return content; 
    } 
} 

public class UserInfo 
    { 
     public UserInfo(string login, String pwd) 
     { 
      Login = login; 
      Password = pwd; 
     } 
     public string Login { get; set; } 
     public string Password { get; set; } 

    }