Используя C# и ASP.NET, я хочу программно заполнить некоторые значения (4 текстовых поля) на веб-странице (форме), а затем выполнить POST эти значения. Как мне это сделать?
Обновлено: Уточнение: существует служба (www.stopforumspam.com), где вы можете указать IP-адрес, имя пользователя и адрес электронной почты на их странице добавления. Я хочу иметь возможность создать ссылку / кнопку на странице моего сайта, которая будет заполнять эти значения и отправлять информацию без необходимости копировать / вставлять их и нажимать кнопку отправки.
Дополнительные пояснения: как автоматизированные спам-боты заполняют формы и нажимают кнопку отправки, если они были написаны на C#?
@BobKaufman Простой поиск по запросу "Watin" в поисковой системе найдет его, вероятно, быстрее, чем спросить человека, написавшего комментарий 12 лет назад ...





Код будет выглядеть примерно так:
WebRequest req = WebRequest.Create("http://mysite/myform.aspx");
string postData = "item1=11111&item2=22222&Item3=33333";
byte[] send = Encoding.Default.GetBytes(postData);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = send.Length;
Stream sout = req.GetRequestStream();
sout.Write(send, 0, send.Length);
sout.Flush();
sout.Close();
WebResponse res = req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string returnvalue = sr.ReadToEnd();
Не могли бы вы объяснить, как собрать возвращенные данные из запроса?
В приведенном выше примере возвращаемое значение содержит данные, возвращенные из запроса.
в вашем коде возвращаемое значение - строка. Что, если вы хотите, чтобы ваш пользователь просматривал обычную страницу?
@jlp Вы имеете в виду, что хотите просто показать страницу пользователю, чтобы он мог ее просмотреть? В таком случае вы бы этого не делали, а вместо этого использовали бы элемент управления «Браузер» или оболочку URL-адреса. Возврат является строкой, потому что вы получаете обратно все, что сервер отправляет обратно, а это строка, обычно HTML. Вы можете загрузить этот HTML-код в элемент управления браузера, если действительно захотите.
Когда я размещаю фактическую форму на другом веб-сайте, запрос проходит и веб-сайт перенаправляет (302) в ответ на следующий URL-адрес. Но при использовании выше он дает Forbidden (403). Что могло быть не так? Как я могу получить 302 в WebResponse?
Просмотрите источник страницы и используйте класс WebRequest для публикации. Не надо гонять IE. Просто выясните, что IE отправляет на сервер, и воспроизведите это. Использование такого инструмента, как Fiddler, сделает это еще проще.
Вы можете использовать метод UploadValues в WebClient - все, что для этого требуется, - это передать URL-адрес и NameValueCollection. Это самый простой подход, который я нашел, и в документации MS есть хороший пример:
http://msdn.microsoft.com/en-us/library/9w7b4fz7.aspx
Вот простая версия с некоторой обработкой ошибок:
var webClient = new WebClient();
Debug.Info("PostingForm: " + url);
try
{
byte [] responseArray = webClient.UploadValues(url, nameValueCollection);
return new Response(responseArray, (int) HttpStatusCode.OK);
}
catch (WebException e)
{
var response = (HttpWebResponse)e.Response;
byte[] responseBytes = IOUtil.StreamToBytes(response.GetResponseStream());
return new Response(responseBytes, (int) response.StatusCode);
}
Класс Response - это простая оболочка для тела ответа и кода состояния.
У меня была ситуация, когда мне нужно было программно публиковать свободный текст из текстового поля html, и у меня были проблемы, когда я получал <br /> в моем списке параметров, который я создавал.
Мое решение заключалось в замене тегов br на символы перевода строки и htmlencoding на всякий случай.
Regex.Replace( HttpUtility.HtmlDecode( test ), "(<br.*?>)", "\r\n" ,RegexOptions.IgnoreCase);
Где вы кодируете строку:
Encoding.Default.GetBytes(postData);
Вместо этого используйте Ascii для API Google:
Encoding.ASCII.GetBytes(postData);
это делает ваш запрос таким же и эквивалентным запросу "curl --data" ... "[url]"
Вы можете отправить сообщение / получить запрос разными способами. Помочь могут разные типы библиотек. Я обнаружил, что это сбивает с толку, чтобы выбрать, какой из них я должен использовать, и какие среди них различия.
После переполнения стека серфинга это лучший ответ, который я нашел. эта ветка объясняет все
Взгляните на Ватин