2

我正在尝试编写一个 C# 程序来延长我在大学图书馆中的书籍的截止日期。我想要做的是以下内容: 1.)通过 WebRequest 和 POST 方法登录图书馆网站,在 C# 程序中输入用户名和密码 2.)获取包含加密密码和纯文本的“查看借阅书籍”站点的 url username 作为 GET 参数 3.) 下载命名页面的内容以在 C# 程序中显示给用户 4.) 如果用户在程序中按下相应的按钮,则向网站提交延期表格,以一次延期所有媒体。

现在我被困在 1 和 2 之间,我似乎能够连接到网站并输入用户数据,但我得到的 WebResponse 再次是登录页面(如果您在网站上手动登录,情况并非如此)。

这是我写的连接网站的方法:

// Login function, logs the user in, uses passed user number & password
    public static Boolean userLogin(String unr, String pass)
    {
        // Login
        // Cookie needed for maintaining php session
        CookieContainer cContainer = new CookieContainer();
        Console.WriteLine(unr+","+pass);
        String postUrl = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
        String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
        String cookieHeader;
        WebRequest wreq = WebRequest.Create(postUrl);
        wreq.ContentType = "application/x-www-form-urlencoded";
        wreq.Method = "POST";
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);
        wreq.ContentLength = bytes.Length;
        using (Stream os = wreq.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        WebResponse resp = wreq.GetResponse();
        cookieHeader = resp.Headers["Set-cookie"];

        //Authentication trial
        String PageSource;
        String getUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
        WebRequest getReq = WebRequest.Create(getUrl);
        getReq.Headers.Add("Cookie",cookieHeader);
        WebResponse getResp = getReq.GetResponse();
        using (StreamReader sr = new StreamReader(getResp.GetResponseStream()))
        {
            PageSource = sr.ReadToEnd();
        }
        Console.Write(PageSource);
        return true;
    }

你能看出我的错误吗?我在控制台上获得了源代码和参数(用户名、密码)输出,但输出又是登录页面。我只想查看 php 页面,但我无权访问任何内部系统数据,我只有 HTML 页面。

任何建议将不胜感激!

编辑:

我重新考虑了整个事情,并按照 fiddler 的记录完全重建了 HTTP 请求标头。这部分函数现在看起来像这样:

 // Login
        // Cookie needed for maintaining php session
        CookieContainer cContainer = new CookieContainer();
        HttpCookie cookie = new HttpCookie("cookie", "PSC_4='xxxxxxx'; DB='n'");
        CookieCollection cookieCol = new CookieCollection();
        cookieCol.Add(cookieCol);
        cContainer.Add(cookieCol);
        Console.WriteLine(unr+","+pass);
        String postUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
        String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
        String cookieHeader;
        HttpWebRequest wreq = (HttpWebRequest) WebRequest.Create(postUrl);
        wreq.Referer = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
        wreq.KeepAlive = true;
        wreq.ContentLength = 119;
        wreq.Host = "universitylibrary.com";
        wreq.ContentType = "application/x-www-form-urlencoded";
        wreq.Method = "POST";
        wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0";
        wreq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        wreq.SendChunked = true;
        wreq.TransferEncoding = "gzip, deflate";
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);
        wreq.ContentLength = bytes.Length;
        using (Stream os = wreq.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        cookieHeader = "";
        try
        {
            HttpWebResponse resp = (HttpWebResponse) wreq.GetResponse();
            cookieHeader = resp.Headers["Set-cookie"];
        }
        catch (WebException ex)
        {
            Console.WriteLine(ex.Status);
            Console.WriteLine(ex.Response);
        }

整个事情仍然不起作用,与以前相同的问题。HttpWebRequest 是否有可能无法处理 https 或者 https 工作时缺少其他东西?(HTTP 和 HTTPS 似乎在语法上相同,并且端口正确设置为 443,真正的区别似乎在于附加的 SSL/TLS 层,也许我需要在某处添加它?)

4

2 回答 2

1

当您返回登录页面时,可能意味着您尚未通过正确的身份验证。这可能有几个原因,但归根结底是因为您没有正确反映网站上手动登录的 HTTP 通信。

我通常做的是使用诸如 Fiddler 之类的监视器从手动登录中捕获完整的请求/响应模式,然后我可以随后将其镜像到我的代码中。

于 2013-10-10T21:12:10.847 回答
-1

例如,您可以在检查登录数据后修改您的登录页面,并使唯一的输出为“SuccessfullySignIn”。如果这是您收到的数据, $if (getReq == "SuccessfullySignIn") { //Do something } 并尝试在您的网页中使用重定向功能

于 2013-10-10T20:55:12.063 回答