facebook使用HttpWebRequest登录Web表单(c#)

时间:2012-01-12 12:14:19

标签: c# facebook httpwebrequest

我的代码卡住了。我只是想通过c#和httpweb请求访问facebook home。

我正在尝试使用以下命令登录:

System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://www.facebook.com/login.php?login_attempt=1");
string s = "email=XXXXX@mymail.com&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)
  2. 来自FB的HTML回复说我需要在浏览器中激活cookie。
  3. 我的问题是:

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

3 个答案:

答案 0 :(得分:1)

现在解决了,谢谢。

问题是用于执行登录POST表单的格式错误的字符串。请务必在原始网络表格中包含准确的参数+值。

答案 1 :(得分:0)

如果你需要从Facebook上阅读一些内容,也许最好使用facebook api来做到这一点。有一个项目Facebook c# SDK on codeplex,它可以很方便。

答案 2 :(得分: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; }

    }
相关问题