web-dev-qa-db-ja.com

HtmlAgilityPackログイン後

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

しかし、これは機能していません。ログインなどはしていません。他の誰かが他の洞察を持っていますか?

ありがとうございました

17
Styles

HTML Agility Packは、HTMLを解析するために使用されます-フォームの送信には使用できません。コードの最初の行は、メモリ内の解析されたノードを変更します。 2行目は、ページをサーバーに送信しません。DOMを再度ロードしますが、デフォルトのGETの代わりにPOSTメソッドを使用します。

コントロールの名前はすでにわかっているので、この時点ではページを解析する必要はまったくないようです。 HttpWebRequest クラスを使用して、リクエストに文字列email=acb#example.comを付けてPOSTリクエストをサーバーに送信します。

これは、似たようなものが必要なときに書いたサンプルです。

/// <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", "[email protected]");

    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
}
19
Kobi

Html AgilityPackを使用してこれを実行する場合。これがコードです。

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");
4
Ankit Arya

私はこのトピックについて数時間を費やし、実際には非常に単純な解決策を見つけました。

私が持っています :

.netコア1.1.2

HttmlAgilityPack 1.4.9.5

ログインurlLogin:「www.url.com/login」。

urlDataのurl: "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にログインする必要があると思います。その後、必要なリクエストを送信できます。

楽しい

0
Cem