使用浏览器需要先打开特定的网站,然后才能下载文件.如何用c#编程实现这一点

本文关键字:下载 文件 然后 何用 这一点 实现 编程 网站 浏览器 | 更新日期: 2023-09-27 18:29:52

要使用web浏览器下载文件,我必须使用VPN或连接到特定的WiFi网络。所以让我们假设,我连接到特定的WiFI。所以使用url下载文件的过程如下:

  1. 我需要在浏览器中打开特定的网站(让我们称之为www.abc.com/start)(我不需要输入任何凭据来加载,也不需要做任何事情)
  2. 然后我可以打开www.abc.com/prictureA并下载它。如果我不打开www.abc.com/start并直接转到www.abc.com/prectureA,我会得到信息-未经验证

一旦我在浏览器www.abc.com/start中打开,我就可以无限次地打开www.abc.com/prictureB www.abc.com/prectureC等等(可能是1或2个小时?)。

如果我使用这个:

WebClient webClient = new WebClient();
webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.33 Safari/537.36");
Uri remoteFileUrlStart = new Uri("www.abc.com/start");
webClient.DownloadFileAsync(remoteFileUrlStart, "test.jpg");

我收到test.jpg说未通过身份验证。如何在下载www.abc.com/start之前先用程序打开www.abc.com/sstart?

使用浏览器需要先打开特定的网站,然后才能下载文件.如何用c#编程实现这一点

我举了一个使用cookie的例子:

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create("www.abc.com/start");
wr.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.33 Safari/537.36";
HttpWebResponse authresponse = (HttpWebResponse)wr.GetResponse();
HttpWebRequest wr2 = (HttpWebRequest)WebRequest.Create("www.abc.com/prictureA");
foreach (Cookie c in authresponse.Cookies)
    wr2.CookieContainer.Add(new Cookie(c.Name, c.Value, c.Path, c.Domain));
HttpWebResponse imageresponse = (HttpWebResponse)wr2.GetResponse();
using (Stream str = imageresponse.GetResponseStream())
{
    byte[] buffer = new byte[str.Length];
    str.Read(buffer, 0, buffer.Length);
    //save image
    File.WriteAllBytes("prictureA.jpg", buffer);
}

我在评论中使用了使用cookie的建议。我的解决方案是将WebClient与HttpWebRequest创建的cookie一起使用。WebClient不支持本机cookie,所以我使用了WebClientEx类(来自使用WebClient类的CookieContainer)

public class WebClientEx : WebClient
{
    public WebClientEx(CookieContainer container)
    {
        this.container = container;
    }
    public CookieContainer CookieContainer
    {
        get { return container; }
        set { container = value; }
    }
    private CookieContainer container = new CookieContainer();
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest r = base.GetWebRequest(address);
        var request = r as HttpWebRequest;
        if (request != null)
        {
            request.CookieContainer = container;
        }
        return r;
    }
    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
    {
        WebResponse response = base.GetWebResponse(request, result);
        ReadCookies(response);
        return response;
    }
    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        ReadCookies(response);
        return response;
    }
    private void ReadCookies(WebResponse r)
    {
        var response = r as HttpWebResponse;
        if (response != null)
        {
            CookieCollection cookies = response.Cookies;
            container.Add(cookies);
        }
    }
}