HtmlAgilityPack 게시물 로그인

c# html-agility-pack login

문제

HtmlAgilityPack (site : http://html-agility-pack.net )을 사용하여 사이트에 로그인하려고합니다.

자, 나는 이것에 대해 어떻게 생각하는지 정확히 알 수 없다.

를 통해 HTML 양식 값을 설정하려했습니다.

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

그런 다음 양식을 제출하십시오.

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

이것은 비록 작동하지 않습니다. 로그인하지 않았거나 아무것도 없습니다. 다른 사람이 다른 통찰력을 가지고 있습니까?

고맙습니다

수락 된 답변

HTML 민첩성 팩은 HTML구문 분석 하는 데 사용되며 서식을 전송할 때 사용할 수 없습니다. 첫 번째 코드 줄은 메모리의 구문 분석 된 노드를 변경합니다. 두 번째 줄은 페이지를 서버에 게시하지 않습니다. DOM을 다시로드하지만 기본 GET 대신 POST 메소드를 사용합니다.

컨트롤의 이름을 이미 알고 있기 때문에이 시점에서 페이지를 구문 분석해야하는 것처럼 보이지 않습니다. 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 민첩성 팩으로 이것을하고 싶다면. 여기에 코드가 있습니다.

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.