HtmlAgilityPack Post Войти - PullRequest
       6

HtmlAgilityPack Post Войти

17 голосов
/ 30 июня 2011

Я пытаюсь войти на сайт с помощью HtmlAgilityPack (site: http://html -agility-pack.net ).

Теперь я не могу точно понять, как это сделать.

Я пытался установить значения формы HTML через

m_HtmlDoc.DocumentNode.SelectSingleNode("//input[@name='EMAIL']").SetAttributeValue("value", "myemail.com");

Затем я отправляю форму с

m_HtmlWeb.Load("http://example.com/", "POST");

Это не работает, хотя. Это не вход в систему или что-нибудь. У кого-нибудь есть еще какие-то идеи?

Спасибо

Ответы [ 3 ]

19 голосов
/ 30 июня 2011

Пакет HTML Agility Pack используется для анализа HTML - его нельзя использовать для отправки форм. Ваша первая строка кода изменяет проанализированные узлы в памяти. Вторая строка не отправляет страницу на сервер - она ​​снова загружает DOM, но использует метод POST вместо GET по умолчанию.

Не похоже, что вам нужно вообще анализировать страницу, поскольку вы уже знаете имя элемента управления. Используйте класс HttpWebRequest для отправки запроса на сервер со строкой email=acb#example.com в запросе.

Вот пример, который я написал, когда мне нужно что-то подобное:

/// <summary>
/// Append a url parameter to a string builder, url-encodes the value
/// </summary>
/// <param name="sb"></param>
/// <param name="name"></param>
/// <param name="value"></param>
protected void AppendParameter(StringBuilder sb, string name, string value)
{
    string encodedValue = HttpUtility.UrlEncode(value);
    sb.AppendFormat("{0}={1}&", name, encodedValue);
}

private void SendDataToService()
{
    StringBuilder sb = new StringBuilder();
    AppendParameter(sb, "email", "hello@example.com");

    byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());

    string url = "http://example.com/"; //or: check where the form goes

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    //request.Credentials = CredentialCache.DefaultNetworkCredentials; // ??

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(byteArray, 0, byteArray.Length);
    }

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

    // do something with response
}
4 голосов
/ 08 марта 2016

Если вы хотите сделать это с помощью Html Agility Pack.Вот код.

CookieCollection Cookies = new CookieCollection();
            var web = new HtmlWeb();
            web.OverrideEncoding = Encoding.Default;
            web.UseCookies = true;
            web.PreRequest += (request) =>
            {
                if (request.Method == "POST")
                {
                    string payload = request.Address.Query;
                    byte[] buff = Encoding.UTF8.GetBytes(payload.ToCharArray());
                    request.ContentLength = buff.Length;
                    request.ContentType = "application/x-www-form-urlencoded";
                    System.IO.Stream reqStream = request.GetRequestStream();
                    reqStream.Write(buff, 0, buff.Length);
                }

                request.CookieContainer.Add(Cookies);

                return true;
            };

            web.PostResponse += (request, response) =>
            {
                if (request.CookieContainer.Count > 0 || response.Cookies.Count > 0)
                {
                    Cookies.Add(response.Cookies);
                }
            };

            string baseUrl = "Your Website URL";
            string urlToHit = baseUrl + "?QueryString with Login Credentials";
            HtmlDocument doc = web.Load(urlToHit, "POST");
0 голосов
/ 24 мая 2017

Я потратил несколько часов на эту тему и на самом деле нашел очень простое решение.

У меня есть:

.net core 1.1.2

HttmlAgilityPack 1.4.9.5

login urlLogin: "www.url.com/login".

url для urlData: "www.url.com/data/3" => чтобы получить это, вы должны быть подключены.

Вот что я сделал, и это просто сработало:

HttpClient hc = new HttpClient();

HttpResponseMessage resultLogin = await hc.PostAsync(urlLogin, new StringContent("login=myUserName&password=myPaswordValue", Encoding.UTF8, "application/x-www-form-urlencoded"));

HttpResponseMessage resultPlaylist = await hc.GetAsync(urlData);

Stream stream = await resultPlaylist.Content.ReadAsStreamAsync();

HtmlDocument doc = new HtmlDocument();

doc.Load(stream);

string webContent = doc.DocumentNode.InnerHtml;  => it works

Я думаю, что сначала нужно войти в свой HttpClient, затем вы можете отправить запрос, который хотите.

Наслаждайтесь

...