通过 C# 登录网站 [英] Logging into website via C#
问题描述
我已经尝试了所有可以在网络上找到的有关如何实现此功能以登录此站点的方法.这是最近的一次失败.
//我已经尝试了多个不同的 URL 这一个//和 http://www.movable.com/login 不会抛出错误字符串 url = "http://portal.movable.com/";字符串用户名 = "<我的用户名>";字符串密码 = "<我的密码>";string authTok = @"+HOt3NTkkIAHkMSMvzQisEquhun9xvIG1mHzIEh6CAo=";字符串 postData = "utf8=✓" + "&authenticity_token=" + authTok +"&user[登录]=" + 用户名 +"&user[password]=" + 密码 + "&user[offset]=-5";var 容器 = 新的 CookieContainer();var buffer = Encoding.UTF8.GetBytes(postData);var request = (HttpWebRequest)HttpWebRequest.Create(url);request.CookieContainer = 容器;request.UserAgent = "Mozilla/5.0";request.Method = "POST";request.KeepAlive = true;request.AllowAutoRedirect = true;request.CookieContainer = 容器;request.ContentLength = buffer.Length;request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";使用 (var requestStream = request.GetRequestStream())requestStream.Write(buffer, 0, buffer.Length);使用 (var response = request.GetResponse()){使用 (var reader = new StreamReader(response.GetResponseStream())){var 结果 = reader.ReadToEnd();//这是请求后读取页面源码MessageBox.Show(result);}}
这里还有来自该站点的相关数据(我知道示例中的令牌不同,我将它们设置为相同但不起作用)
<form accept-charset="UTF-8" action="/signin" class="new_user" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"/><input name="authenticity_token" type="hidden" value="hHfoUnIbi+6RB51x1cqXqAYHkjz9mCi7nc86gMdiMOo="/></div><p class="notice">退出成功.</p><h2>登录您的帐户</h2><label for="user_login">登录</label><input id="user_login" name="user[login]" size="30" type="text"/><label for="user_password">密码</label><input id="user_password" name="user[password]" size="30" type="password"/><input id="user_offset" name="user[offset]" type="hidden"/><label for="user_remember_me"><input name="user[remember_me]" type="hidden" value="0"/><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1"/>在这台电脑上记住我.标签><button class="login" name="button" type="submit">登录</button><a href="/users/password/new" class="forgotPassword">忘记密码?</a></表单>
试试这个:
var cookieJar = new CookieContainer();CookieAwareWebClient 客户端 = 新的 CookieAwareWebClient(cookieJar);//网站设置了一些登录所需的cookie,并且'authenticity_token'总是不同的string response = client.DownloadString("http://portal.movable.com/signin");//解析 'authenticity_token' 并且 cookie 由 cookieContainer 自动处理string token = Regex.Match(response, "authenticity_token.+?value="(.+?)"").Groups[1].Value;字符串 postData =string.Format("utf8=%E2%9C%93&authenticity_token={0}&user%5Blogin%5D=USERNAME&user%5Bpassword%5D=PASSWORD&user%5Boffset%5D=5.5&user%5Bremember_me%5D=0&button=", token);//WebClient.UploadValues相当于Http url-encode类型的postclient.Method = "POST";response = client.UploadString("http://portal.movable.com/signin", postData);//我得到无效的用户/密码,但我确信它可以正常使用普通用户/密码}
使用的额外类:
公共类 CookieAwareWebClient : WebClient{公共字符串方法;公共 CookieContainer CookieContainer { 获取;放;}公共乌里乌里{得到;放;}公共 CookieAwareWebClient():这个(新的CookieContainer()){}公共 CookieAwareWebClient(CookieContainer cookies){this.CookieContainer = cookie;}受保护的覆盖 WebRequest GetWebRequest(Uri 地址){WebRequest 请求 = base.GetWebRequest(address);如果(请求是 HttpWebRequest){(请求为 HttpWebRequest).CookieContainer = this.CookieContainer;(请求为 HttpWebRequest).ServicePoint.Expect100Continue = false;(请求为 HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0";(请求为HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";(请求为 HttpWebRequest).Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5");(请求为 HttpWebRequest).Referer = "http://portal.movable.com/signin";(请求为 HttpWebRequest).KeepAlive = true;(请求为 HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate |解压方法.GZip;如果(方法==POST"){(请求为 HttpWebRequest).ContentType = "application/x-www-form-urlencoded";}}HttpWebRequest httpRequest = (HttpWebRequest)request;httpRequest.AutomaticDecompression = DecompressionMethods.GZip |减压方法.放气;返回 httpRequest;}受保护的覆盖 WebResponse GetWebResponse(WebRequest 请求){WebResponse 响应 = base.GetWebResponse(request);String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];如果(setCookieHeader != null){//如果需要的话,做一些事情来解析cookie.尝试{如果(setCookieHeader != null){cookie cookie = new cookie();//创建cookiethis.CookieContainer.Add(cookie);}}捕获(异常){}}返回响应;}}
收到回复
<头><title>MOVband 门户</title><link href="/assets/application-f9d3794ad4639d96cd50c115ad241438.css" media="all" rel="stylesheet" type="text/css"/><!--[如果是 IE 9]><script src="/assets/modernizr-9b693978fbc3fcd01874b01875a736bf.js" type="text/javascript"></script><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]--><!--[如果 IE 7]><link href="/assets/ie7-ca67da697ba8da1de77889ceedc4db1a.css" media="all" rel="stylesheet" type="text/css"/><![endif]--><script src="/assets/application-b1fcaae48e75e2455cf45e1d75983267.js" type="text/javascript"></script><meta content="authenticity_token" name="csrf-param"/><meta content="aC33zdBSSAz63dVjOgYXR/L6skV/QxxHe4XqX3UYCek=" name="csrf-token"/>头部><body id="登录"><标题><div class="容器"><a href="http://movable.com"><img alt="Movablelogo" class="logo" src="/assets/movableLogo-3429bb636ded1af0a80951c7d4386770.png"/></a>
</标题><section class="main"><div class="容器"><div id="loginWindow" class="cf"><img alt="Movbandlogologin" class="movbandlogo" src="/assets/MOVbandLogologin-3cacbbe2b9bb05b16a3ca521acf81fc6.png"/><div class="cf"><div id="welcomeMessage"><h1>欢迎</h1><img alt="Movbanddevice" class="device" src="/assets/MOVbandDevice-acbb62593330775ac09dced40e28e8e2.png"/><p>刚拿到你的 MOVband 吗?通过我们快速的产品注册和设置,我们将让您立即搬家.<a href="/join">加入></a></p>
<form accept-charset="UTF-8" action="/signin" class="new_user" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"/><input name="authenticity_token" type="hidden" value="aC33zdBSSAz63dVjOgYXR/L6skV/QxxHe4XqX3UYCek="/></div><p class="alert">电子邮件或密码无效.</p><h2>登录您的帐户</h2><label for="user_login">登录</label><input id="user_login" name="user[login]" size="30" type="text" value="USERNAME"/><label for="user_password">密码</label><input id="user_password" name="user[password]" size="30" type="password"/><input id="user_offset" name="user[offset]" type="hidden" value="5.5"/><label for="user_remember_me"><input name="user[remember_me]" type="hidden" value="0"/><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1"/>在这台电脑上记住我.标签><button class="login" name="button" type="submit">登录</button><a href="/users/password/new" class="forgotPassword">忘记密码?</a></表单>