代码工作正常但我仍然无法登录 IRCTC 网站

Code Works Fine But I am still not able to login into IRCTC Website

一切正常,但我们点击 submitData() 按钮,我将显示登录页面而不是 我的主页

所以首先我导航登录页面它会设置 cookie,然后存储在 cookie 容器代码中的 cookie 是

CookieContainer cookieJar = new CookieContainer();
public Form1()
{
    String captcha;
    InitializeComponent();
}

private void BUTTON_LOGIN_Click(object sender, EventArgs e)
{
    //Get captcha           
    var request = (HttpWebRequest)HttpWebRequest.Create("https://www.irctc.co.in/eticketing/loginHome.jsf");
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
    request.KeepAlive = true;
    request.CookieContainer = cookieJar;
    request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";

    var response = request.GetResponse();
    using (var stream = response.GetResponseStream())
    {

    }

    // need array, different storage for every cookies
    //
    foreach (Cookie c in cookieJar.GetCookies(response.ResponseUri))
    {
        request.CookieContainer.Add(c);
        MessageBox.Show("Cookie['" + c.Name + "']: " + c.Value);
    }
}

然后我使用 cookie 请求验证码

private void pictureBox1_Click(object sender, EventArgs e)  // This Event Refresh thr captcha
{
    //Get captch       

    var request =(HttpWebRequest)HttpWebRequest.Create("https://www.irctc.co.in/eticketing/captchaImage");
    request.Accept = "image/webp,image/*,*/*;q=0.8";
    WebHeaderCollection myWebHeaderCollection = request.Headers;
    myWebHeaderCollection.Add("Accept-Language", "en-US;q=0.8");
    myWebHeaderCollection.Add("Upgrade-Insecure-Requests", "1");
    request.KeepAlive = true;

    Uri target = new Uri("https://www.irctc.co.in");
    cookieJar.Add(new Cookie("language", "en_IN") { Domain = target.Host });

    request.CookieContainer = cookieJar;

    request.Referer = "https://www.irctc.co.in/eticketing/loginHome.jsf";
    request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";


    var response = request.GetResponse();
    using (var stream = response.GetResponseStream())
    {

        pictureBox1.Image = Bitmap.FromStream(stream);
    }

    // need array, different storage for every cookies
    //
    foreach (Cookie c in cookieJar.GetCookies(response.ResponseUri))
    {
        request.CookieContainer.Add(c);
        MessageBox.Show("Cookie['" + c.Name + "']: " + c.Value);
    }
}


private void button1_Click(object sender, EventArgs e)
{
    submitData();
}

private void displayHtml(String html)
{
    webBrowser1.Navigate("about:blank");
    while (webBrowser1.Document == null || webBrowser1.Document.Body == null)
        Application.DoEvents();
    webBrowser1.Document.OpenNew(true).Write(html);
}

最后,我在将验证码填入文本框后提交了数据,这是错误这是再次重定向我的登录页面,这是怎么回事。

private void submitData()
{
    try
    {
        String user = "myusername";
        String pass = "mypassword";
        String submit = "Submit";
        String captcha=richTextBox1.Text.ToString() ;

        ASCIIEncoding encoding = new ASCIIEncoding();
       // MessageBox.Show(captcha);
        string postData = "j_username=" + user + "&j_password=" + pass + "&j_captcha=" + captcha + "&submit=" + submit + "&tneg=" ;
        byte[] data = Encoding.UTF8.GetBytes(postData);

        Uri target = new Uri("https://www.irctc.co.in");



        cookieJar.Add(new Cookie("language", "en_IN"){ Domain = target.Host });
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.irctc.co.in/eticketing/home");
        request.CookieContainer = cookieJar;

        WebHeaderCollection myWebHeaderCollection = request.Headers;
        myWebHeaderCollection.Add("Accept-Language", "en-US;q=0.8");
        myWebHeaderCollection.Add("Upgrade-Insecure-Requests", "1");

        request.Method = "POST";
        request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
        request.ContentType = "application/x-www-form-urlencode";
        request.Referer = "https://www.irctc.co.in/eticketing/loginHome.jsf";
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
        request.ServicePoint.Expect100Continue = false;

   //     var bytes = Encoding.UTF8.GetBytes("action=login&from=http%3A%2F%2Fwww.dofus.com%2Ffr&login=user123&password=password1232F&remember=1");
     //   request.ContentLength = bytes.Length;

        request.ContentLength = data.Length;
        request.KeepAlive = true;
//      request.AutomaticDecompression = DecompressionMethods.GZip;
  //    request.AutomaticDecompression = DecompressionMethods.Deflate;

 //     request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
      // request.SendChunked = true;
     //   request.TransferEncoding = "gzip, deflate, br";
        request.Host = "www.irctc.co.in";

       //request.Headers.Add
        Stream stream = request.GetRequestStream();
        stream.Write(data, 0, data.Length);
        stream.Close();

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        stream = response.GetResponseStream();

        foreach (Cookie c in cookieJar.GetCookies(request.RequestUri))
        {

            MessageBox.Show("Cookie['" + c.Name + "']: " + c.Value);
        }
        StreamReader sr = new StreamReader(stream);
       //richTextBox1.Text = sr.ReadToEnd();
        String myhtml = sr.ReadToEnd().ToString();

        displayHtml(myhtml);

        sr.Close();
        stream.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error : " + ex.Message);
    }
}

方法submitData()中

request.ContentType = "application/x-www-form-urlencode"

这里打错了,你漏了一个'd'

应该是这样的:-

request.ContentType = "application/x-www-form-urlencoded"

ContentType 是 "application/x-www-form-urlencoded"。

如果服务器无法理解表单数据类型(在这种情况下 "application/x-www-form-urlencode" 对服务器来说是未知的),那么它将拒绝请求并将用户重定向到您提到的登录页面。

您还可以查看 Form ContentType in HTML Forms(w3.org) 了解更多信息。

希望这对您有所帮助:)