Подтвердить что ты не робот

Использование WebClient или WebRequest для входа на веб-сайт и доступа к данным

Я пытаюсь получить доступ к данным с ограниченным доступом на веб-сайте, используя WebClient/WebRequest. На этом веб-сайте нет официального API, поэтому я пытаюсь просто заполнить форму HTML и опубликовать значения на сервере, поэтому я вошел в систему.

Я попробовал этот и этот, но это не похоже на то, что входящие запросы регистрируются в.

Последний пример гораздо более привлекателен, так как я предпочитаю WebClient, но унаследовано WebRequest.

Во всяком случае, в первом примере я думаю, что он сделал вход, но предстоящие запросы, которые обращаются к личным данным, возвращают страницу с сообщением "Это только содержимое только для участников".

Как сделать WebClient постоянным вошедшим в систему?

4b9b3361

Ответ 1

Вот что я сделал и это работает (кредит).

Добавьте этот класс первым:

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);
}

Ответ 2

HTTP является апатридом. Таким образом, вы не можете войти в систему WebClient. Концепция сеанса не существует в HTTP. Технологии на стороне сервера, такие как ASP.NET, моделируют поведение с учетом состояния через концепцию сеанса с использованием файла cookie или параметра строки запроса, который отправляется туда и обратно в каждом запросе. Сказав это, можно эмулировать, что браузер делает с WebClient. Если у вас есть доступ к веб-сайту, подключитесь к нему, используя правильные учетные данные и захватите трафик с помощью Fiddler. Затем убедитесь, что WebClient отправляет правильные файлы cookie, запрашивает заголовки, строки запросов и т.д. Точно так же, как браузер.