使用WebClient或WebRequest登录网站并访问数据

本文关键字:访问 数据 网站 登录 WebClient WebRequest 使用 | 更新日期: 2023-09-27 18:19:02

我正在尝试使用WebClient/WebRequest访问网站上的受限数据。在那个网站上没有官方的API,所以我要做的就是简单地填写HTML表单并将值发布到服务器,所以我登录了。

我尝试了这个和这个,但是它看起来不像即将到来的请求登录。

后一个例子更有吸引力,因为我显然更喜欢WebClient,但遗留的WebRequest也可以。

无论如何,在第一个例子中,我认为它确实登录了,但是访问私有数据的即将到来的请求返回一个带有消息"这是仅成员内容"的页面。

如何使WebClient永久登录?

使用WebClient或WebRequest登录网站并访问数据

更新:

请看下面我的评论


这是我所做的,它是有效的(credit)。

先添加这个类:

namespace System.Net
{
  using System.Collections.Specialized;
  using System.Linq;
  using System.Text;
  public class CookieAwareWebClient : WebClient
  {
    public void Login(string loginPageAddress, NameValueCollection loginData)
    {
      CookieContainer container;
      var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      var query = string.Join("&", 
        loginData.Cast<string>().Select(key => $"{key}={loginData[key]}"));
      var buffer = Encoding.ASCII.GetBytes(query);
      request.ContentLength = buffer.Length;
      var requestStream = request.GetRequestStream();
      requestStream.Write(buffer, 0, buffer.Length);
      requestStream.Close();
      container = request.CookieContainer = new CookieContainer();
      var response = request.GetResponse();
      response.Close();
      CookieContainer = container;
    }
    public CookieAwareWebClient(CookieContainer container)
    {
      CookieContainer = container;
    }
    public CookieAwareWebClient()
      : this(new CookieContainer())
    { }
    public CookieContainer CookieContainer { get; private set; }
    protected override WebRequest GetWebRequest(Uri address)
    {
      var request = (HttpWebRequest)base.GetWebRequest(address);
      request.CookieContainer = CookieContainer;
      return request;
    }
  }
}

用法:

public static void Main()
{
  var loginAddress = "www.mywebsite.com/login";
  var loginData = new NameValueCollection
    {
      { "username", "shimmy" },
      { "password", "mypassword" }
    };
  var client = new CookieAwareWebClient();
  client.Login(loginAddress, loginData);
}

HTTP是无状态的因此,您无法永久登录WebClient。HTTP中不存在会话的概念。服务器端技术,如ASP。NET通过使用cookie或在每个请求中来回发送的查询字符串参数的会话概念模拟有状态行为。话虽如此,也可以从WebClient模拟浏览器的功能。如果您可以访问该网站,请使用正确的凭据连接到该网站,并使用Fiddler捕获流量。然后,确保WebClient发送正确的cookie、请求头、查询字符串等与浏览器完全相同。