2013-02-16 173 views
6

我已經嘗試了一切,我可以在網上找到關於如何實現這個登錄到這個網站。這是最近的失敗。通過C#登錄到網站

// I have tried with multiple different URLS this one 
// and http://www.movable.com/login do not throw errors 
string url = "http://portal.movable.com/"; 
string username = "<myusername>"; 
string password = "<mypassword>"; 
string authTok = @"+HOt3NTkkIAHkMSMvzQisEquhun9xvIG1mHzIEh6CAo="; 
string postData = "utf8=✓" + "&authenticity_token=" + authTok + 
     "&user[login]=" + username + 
     "&user[password]=" + password + "&user[offset]=-5"; 

var container = new CookieContainer(); 
var buffer = Encoding.UTF8.GetBytes(postData); 

var request = (HttpWebRequest)HttpWebRequest.Create(url); 
request.CookieContainer = container; 
request.UserAgent = "Mozilla/5.0"; 
request.Method = "POST"; 
request.KeepAlive = true; 
request.AllowAutoRedirect = true; 
request.CookieContainer = container; 
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"; 

using (var requestStream = request.GetRequestStream()) 
    requestStream.Write(buffer, 0, buffer.Length); 

using (var response = request.GetResponse()) 
{ 

     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      var result = reader.ReadToEnd(); 
      //this is to read the page source after the request 
      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="&#x2713;" /><input name="authenticity_token" type="hidden" value="hHfoUnIbi+6RB51x1cqXqAYHkjz9mCi7nc86gMdiMOo=" /></div> 

    <p class="notice">Signed out successfully.</p> 

    <h2>login to your account</h2> 

    <label for="user_login">Login</label> 
    <input id="user_login" name="user[login]" size="30" type="text" /> 
    <label for="user_password">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" /> 
    Remember me on this computer. 
    </label> 
    <button class="login" name="button" type="submit">Login</button> 
    <a href="https://stackoverflow.com/users/password/new" class="forgotPassword">Forgot password?</a> 
    </form> </div> 
+0

示例HTML表單顯示錶單發佈到/ signin。嘗試將您的網址更改爲http://portal.movable.com/signin。 – Rich 2013-02-16 03:39:46

+0

我嘗試過這個,它會拋出一個錯誤 – 2013-02-16 03:40:15

+0

實際上它在過去拋出一個錯誤,現在它只是像我所有其他人一樣返回到登錄頁面 – 2013-02-16 03:41:07

回答

11

試試這個方法:

 var cookieJar = new CookieContainer(); 
     CookieAwareWebClient client = new CookieAwareWebClient(cookieJar); 

     // the website sets some cookie that is needed for login, and as well the 'authenticity_token' is always different 
     string response = client.DownloadString("http://portal.movable.com/signin"); 

     // parse the 'authenticity_token' and cookie is auto handled by the cookieContainer 
     string token = Regex.Match(response, "authenticity_token.+?value=\"(.+?)\"").Groups[1].Value; 
     string 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 is equivalent of Http url-encode type post 
     client.Method = "POST"; 
     response = client.UploadString("http://portal.movable.com/signin", postData); 


     //i am getting invalid user/pass, but i am sure it will work fine with normal user/password 

    } 

上等使用:

public class CookieAwareWebClient : WebClient 
{ 
    public string Method; 
    public CookieContainer CookieContainer { get; set; } 
    public Uri Uri { get; set; } 

    public CookieAwareWebClient() 
     : this(new CookieContainer()) 
    { 
    } 

    public CookieAwareWebClient(CookieContainer cookies) 
    { 
     this.CookieContainer = cookies; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = base.GetWebRequest(address); 
     if (request is HttpWebRequest) 
     { 
      (request as HttpWebRequest).CookieContainer = this.CookieContainer; 
      (request as HttpWebRequest).ServicePoint.Expect100Continue = false; 
      (request as HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"; 
      (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      (request as HttpWebRequest).Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5"); 
      (request as HttpWebRequest).Referer = "http://portal.movable.com/signin"; 
      (request as HttpWebRequest).KeepAlive = true; 
      (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | 
                   DecompressionMethods.GZip; 
      if (Method == "POST") 
      { 
       (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded"; 
      } 

     } 
     HttpWebRequest httpRequest = (HttpWebRequest)request; 
     httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     return httpRequest; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     WebResponse response = base.GetWebResponse(request); 
     String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie]; 

     if (setCookieHeader != null) 
     { 
      //do something if needed to parse out the cookie. 
      try 
      { 
       if (setCookieHeader != null) 
       { 
        Cookie cookie = new Cookie(); //create cookie 
        this.CookieContainer.Add(cookie); 
       } 
      } 
      catch (Exception) 
      { 

      } 
     } 
     return response; 

    } 
} 

收到的響應

<!DOCTYPE html> 
<html> 
<head> 
    <title>MOVband Portal</title> 
    <link href="/assets/application-f9d3794ad4639d96cd50c115ad241438.css" media="all" rel="stylesheet" type="text/css" /> 
    <!--[if lt IE 9]> 
    <script src="/assets/modernizr-9b693978fbc3fcd01874b01875a736bf.js" type="text/javascript"></script> 
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 
    <!--[if 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" /> 
</head> 
<body id="login"> 
    <header> 
    <div class="container"> 
     <a href="http://movable.com"> 
     <img alt="Movablelogo" class="logo" src="/assets/movableLogo-3429bb636ded1af0a80951c7d4386770.png" /> 
</a> </div> 
    </header> 

    <section class="main"> 
    <div class="container"> 
     <div id="loginWindow" class="cf"> 
    <img alt="Movbandlogologin" class="movbandlogo" src="/assets/MOVbandLogologin-3cacbbe2b9bb05b16a3ca521acf81fc6.png" /> 
    <div class="cf"> 
    <div id="welcomeMessage"> 
     <h1>Welcome</h1> 

     <img alt="Movbanddevice" class="device" src="/assets/MOVbandDevice-acbb62593330775ac09dced40e28e8e2.png" /> 
     <p> 
     Just got your MOVband? We'll have you moving in no time with our quick product registration and setup. 
     <a href="/join">Join &gt;</a> 
     </p> 
    </div> 
    <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="&#x2713;" /><input name="authenticity_token" type="hidden" value="aC33zdBSSAz63dVjOgYXR/L6skV/QxxHe4XqX3UYCek=" /></div> 

     <p class="alert">Invalid email or password.</p> 

     <h2>login to your account</h2> 

     <label for="user_login">Login</label> 
     <input id="user_login" name="user[login]" size="30" type="text" value="USERNAME" /> 
     <label for="user_password">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" /> 
     Remember me on this computer. 
</label> 
     <button class="login" name="button" type="submit">Login</button> 
     <a href="https://stackoverflow.com/users/password/new" class="forgotPassword">Forgot password?</a> 
</form> </div> 
</div> 

    </div> 
    </section> 

    <footer> 
    <div class="container"> 
     <div class="social_icons"> 
     <a href="https://www.facebook.com/getMOVband" class="fb_link" target="_blank"></a> 
     <a href="https://twitter.com/getmovband" class="tw_link" target="_blank"></a> 
     <a href="http://www.youtube.com/getmovband" class="yt_link" target="_blank"></a> 
     <a href="http://www.linkedin.com/company/2355960" class="li_link" target="_blank"></a> 
     </div> 
    </div> 
    </footer> 
</body> 
</html> 
+0

是!這工作完美!在3個句子或更少的句子中,你能指出我做錯了什麼? – 2013-02-16 05:23:09

+0

(一切都不是一個可以接受的答案哈哈) – 2013-02-16 05:23:39

+1

'//網站設置了一些登錄所需的cookie,並且'authenticity_token'總是不同的',所以在你發送POST請求之前,需要GET請求設置默認的cookie! – 2013-02-16 05:24:31