Я пытаюсь войти на сайт, используя 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");