自动从密码保护的网站下载文件

3
我需要帮助处理一个工作项目。目前,我们每个月都需要手动登录供应商的网站,下载两个Excel文件,然后将这些文件加载到SQL中。现在,我们想要自动化这个过程。我可以完成将文件加载到SQL中的步骤,但我不确定如何自动登录网站,输入我的用户信息并收集文件。我主要处理SQL,并且几乎没有.NET经验,因此非常感谢任何代码示例。
确认一下,登录表单位于aspx页面上。只是一个基本的表单,其中包含用户名和密码字段、忘记密码链接和登录按钮。

用户登录是通过页面上的表单,还是浏览器对话框请求用户名和密码? - Mikael Svenson
2
有很多不同的方法可以为网站设置密码保护(HTTP基本认证,登录页面设置cookie等)。您的网站使用哪种机制? - dtb
1个回答

4

您可以使用WebClient或HttpWebRequest。

使用HttpWebRequest登录页面

如何在C#中登录网页并检索其内容?

HttpWebRequest示例:

    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://sso.bhmobile.ba/sso/login"); 
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"; 
    req.Method = "POST";
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    req.Headers.Add("Accept-Language: en-us,en;q=0.5");
    req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    req.KeepAlive = true;
    req.Headers.Add("Keep-Alive: 300");
    req.Referer ="http://sso.bhmobile.ba/sso/login";

    req.ContentType = "application/x-www-form-urlencoded"; 

    String Username = "username";
    String PassWord = "Password";

    StreamWriter sw = new StreamWriter(req.GetRequestStream());
    sw.Write("application=portal&url=http%3A%2F%2Fwww.bhmobile.ba%2Fportal%2Fredirect%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Ftype%3Dssologin%26url%3D%2Fportal%2Fshow%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Fidc%3D1023278&realm=sso&userid=" + Username + "&password=" + password + "&x=16&y=11");
    sw.Close();

    HttpWebResponse response = (HttpWebResponse)req.GetResponse();


    StreamReader reader = new StreamReader(response.GetResponseStream());
    string tmp = reader.ReadToEnd();

    foreach (Cookie cook in response.Cookies)
    {
        tmp += "\n" + cook.Name + ": " + cook.Value;
    }


    Response.Write(tmp);
    Response.End();

Webclient示例:

WebClient wc = new WebClient();
wc.Credentials = new NetworkCredential("username", "password");
string url = "http://foo.com";                  
try
{
        using (Stream stream = wc.OpenRead(new Uri(url)))
        {
                using (StreamReader reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
             }
        }
}
catch (WebException e)
{
        //Error handeling
}

1
好的回答,除了我会删除“Accept-Encoding: gzip,deflate”头部,因为你还需要解压缩流来处理这种情况。并使用类似Fiddler的工具来嗅探您应该如何发送实际请求。 - Mikael Svenson
谢谢 - 看起来WebClient是我需要的。我会进一步调查这个。 - Andrew
@Mikael Svenson:说得好!没错,Fiddler非常好用,应该始终使用它来检查用WebClient或HttpWebRequest模仿浏览器请求时需要发送的标头、表单字段和隐藏字段。+1 - Bruce Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接