Вход в HtmlAgilityPack

c# html-agility-pack login

Вопрос

Я пытаюсь войти на сайт, используя HtmlAgilityPack (сайт: http://html-agility-pack.net ).

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

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

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

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

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

Однако это не работает. Это не вход или что-то еще. Есть ли у кого-нибудь еще какое-то другое понимание?

спасибо

Принятый ответ

Пакет 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
}

Популярные ответы

Если вы хотите сделать это с помощью 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");


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow