Войдите на веб-сайт через C#
-
06-09-2019 - |
Вопрос
Я относительно новичок в использовании C #, и у меня есть приложение, которое считывает части исходного кода с веб-сайта.Это все работает;но проблема в том, что для доступа к этому исходному коду на странице, о которой идет речь, требуется, чтобы пользователь вошел в систему.Для чего моей программе нужен способ первоначальной регистрации пользователя на веб-сайте - после того, как это будет сделано, я смогу получить доступ к исходному коду и прочитать его.
Веб-сайт, на который необходимо войти, - это:mmoinn.com/index.do?PageModule=UsersLogin
Я весь день искал информацию о том, как это сделать, и пробовал примеры, но безуспешно.
Заранее благодарю
Нет правильного решения
Другие советы
Вы можете продолжать использовать WebClient для публикации (вместо GET, который является HTTP - глагол в настоящее время вы используете с DownloadString ), но я думаю, вам будет проще работать с (немного) низкоуровневыми классами WebRequest и WebResponse.
Это состоит из двух частей: первая заключается в публикации формы входа в систему, вторая - в восстановлении заголовка "Set-cookie" и отправке его обратно на сервер в виде "Cookie" вместе с вашим запросом GET.С этого момента сервер будет использовать этот файл cookie для вашей идентификации (предполагая, что он использует аутентификацию на основе файлов cookie, в чем я совершенно уверен, поскольку эта страница возвращает заголовок Set-cookie, который включает "PHPSESSID").
Публикация в форме входа в систему
Записи в форме легко имитировать, это всего лишь пример форматирования данных вашей записи следующим образом:
field1=value1&field2=value2
Используя WebRequest и код, который я адаптировал из Скотт Хансельман, вот как вы могли бы РАЗМЕСТИТЬ данные формы в своей форме входа в систему:
string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
string formParams = string.Format("email_address={0}&password={1}", "your email", "your password");
string cookieHeader;
WebRequest req = WebRequest.Create(formUrl);
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];
Вот пример того, что вы должны увидеть в заголовке Set-cookie для вашей формы входа в систему:
PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=-
Получение страницы за формой входа в систему
Теперь вы можете выполнить запрос GET на страницу, для входа на которую вам необходимо авторизоваться.
string pageSource;
string getUrl = "the url of the page behind the login";
WebRequest getRequest = WebRequest.Create(getUrl);
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
Редактировать:
Если вам нужно просмотреть результаты первого сообщения, вы можете восстановить HTML-код, с которым оно было возвращено:
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
Разместите это прямо под cookieHeader = resp.Headers["Set-cookie"];
а затем проверьте строку, хранящуюся в pageSource.
Вы можете немного упростить ситуацию, создав класс, производный от WebClient, переопределив его метод GetWebRequest и установив для него объект CookieContainer.Если вы всегда устанавливаете один и тот же экземпляр CookieContainer, то управление файлами cookie будет осуществляться автоматически за вас.
Но единственный способ получить доступ к HttpWebRequest до его отправки - это наследовать от WebClient и переопределить этот метод.
public class CookieAwareWebClient : WebClient
{
private CookieContainer cookie = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = cookie;
}
return request;
}
}
var client = new CookieAwareWebClient();
client.BaseAddress = @"https://www.site.com/any/base/url/";
var loginData = new NameValueCollection();
loginData.Add("login", "YourLogin");
loginData.Add("password", "YourPassword");
client.UploadValues("login.php", "POST", loginData);
//Now you are logged in and can request pages
string htmlSource = client.DownloadString("index.php");
Мэтью Бриндли, ваш код работал очень хорошо для некоторого веб-сайта, который мне был нужен (с логином), но мне нужно было изменить на HttpWebRequest
и HttpWebResponse
в противном случае я получу 404 Плохой запрос с удаленного сервера.Также я хотел бы поделиться своим обходным решением, использующим ваш код, и заключается в том, что я попробовал его для входа в веб-сайт на базе moodle, но на твоем этапе это не сработало " .Получение страницы за формой входа в систему" потому что , когда успешно Размещение логин, заголовок 'Set-Cookie'
ничего не вернул, несмотря на то, что это делают другие веб-сайты.
Поэтому я думаю, что здесь нам нужно сохранить файлы cookie для следующих запросов, поэтому я добавил это.
К "Публикация в форме входа в систему" кодовый блок :
var cookies = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookies;
И К тому же "Получение страницы за формой входа в систему" :
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(resp.Cookies);
getRequest.Headers.Add("Cookie", cookieHeader);
Делая это, позволяет мне Войдите в систему и получите исходный код "страницы входа в систему" (moodle на основе веб-сайта). Я знаю, что это расплывчатое использование CookieContainer
и HTTPCookies, потому что мы можем сначала спросить, сохранен ли ранее установленный набор файлов cookie перед отправкой запроса на сервер.В любом случае, это работает без проблем, но вот хорошая информация, о которой стоит почитать WebRequest
и WebResponse
с примерами проектов и учебным пособием:
Извлечение HTTP-содержимого в .NET
Как использовать HttpWebRequest и HttpWebResponse в .NET
Иногда это может помочь отключить AllowAutoRedirect
и настройка обоих логинов POST
и страница GET
запрашивает тот же пользовательский агент.
request.UserAgent = userAgent;
request.AllowAutoRedirect = false;