使用浏览器需要先打开特定的网站,然后才能下载文件.如何用c#编程实现这一点
本文关键字:下载 文件 然后 何用 这一点 实现 编程 网站 浏览器 | 更新日期: 2023-09-27 18:29:52
要使用web浏览器下载文件,我必须使用VPN或连接到特定的WiFi网络。所以让我们假设,我连接到特定的WiFI。所以使用url下载文件的过程如下:
- 我需要在浏览器中打开特定的网站(让我们称之为www.abc.com/start)(我不需要输入任何凭据来加载,也不需要做任何事情)
- 然后我可以打开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?
我举了一个使用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);
}
}
}