Работа с капчей через HttpWebRequest и HttpWebResponse. продолжение)) - вопрос №320895

создал такой класс:

public class registeredPepsilightRu<br /> {<br /> public CookieCollection cookiePepsilight = new CookieCollection(); <br /><br /> public string getCaptcha()<br /> {<br />var wc = new WebClientWithCookies();<br /> Byte[] pageData = wc.DownloadData("http://pepsilight.ru/user/register");<br /> string pageHtml = Encoding.UTF8.GetString(pageData);<br /><br /><br /> string captchaUrl = "pepsilight.ru/" + Regex.Match(pageHtml, @"mycaptcha/image/[\d\w]{32}").ToString();<br /> wc.DownloadFile(captchaUrl, @"C:\Users\Андрей\Desktop\captcha.png");<br /><br /> return captchaUrl;<br /> }<br /><br /> public string postReg(string name, string email, string captcha, string seed)<br /> {<br /> //переход на страницу регистрации<br /> HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://pepsilight.ru/user/register");<br /> //myHttpWebRequest.Proxy = new WebProxy("127.0.0.1", 8888);<br /> myHttpWebRequest.Method = "POST";<br /> myHttpWebRequest.Referer = "pepsilight.ru/user/register";<br /> myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1); .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)";<br /> myHttpWebRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";<br /> myHttpWebRequest.Headers.Add("Accept-Language", "ru-RU");<br /><br /> // передаем куки, полученные в предыдущем запросе<br /> myHttpWebRequest.CookieContainer = new CookieContainer();<br /> myHttpWebRequest.CookieContainer.Add(cookiePepsilight);<br /><br /> myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";<br /><br /> // ставим False, чтобы при получении кода 302 не делать автоматический редирект<br /> myHttpWebRequest.AllowAutoRedirect = false;<br /><br /> // передаем параметры<br /> string seedName="";<br /> for (int i=37; i<seed.Length;i++)<br /> {<br /> seedName += seed[i];<br /> }<br /> string sQueryString = "name=" + name + "&mail=" + email + "&form_id=user_register&captcha_answer=" + captcha +<br /> "&seed=" + seedName +<br /> "&op=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F";<br /> <br /> byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);<br /> myHttpWebRequest.ContentLength = ByteArr.Length;<br /> myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);<br /><br /> // делаем запрос<br /> HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();<br /><br /> <br /><br /><br /> //получение страницы, после прохождения регистрации<br /> myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://pepsilight.ru/");<br /> //myHttpWebRequest.Proxy = new WebProxy("127.0.0.1", 8888);<br /> myHttpWebRequest.Referer = "pepsilight.ru/user/register";<br /> myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1); .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)";<br /> myHttpWebRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";<br /> myHttpWebRequest.Headers.Add("Accept-Language", "ru-RU");<br /><br /> myHttpWebRequest.CookieContainer = new CookieContainer();<br /> myHttpWebRequest.CookieContainer.Add(cookiePepsilight);<br /><br /> // выполняем запрос<br /> myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();<br /><br /> cookiePepsilight.Add(myHttpWebResponse.Cookies);<br /><br /> //// выводим результат в консоль<br /> //StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));<br /> ////получение строки с результирующей страницей<br /> //string mystr = myStreamReader.ReadToEnd();<br /><br /> StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));<br /> return myStreamReader.ReadToEnd();<br /> }<br /> }и вызываю так:public CookieCollection cookiesNorm = new CookieCollection();<br /> public Stream imgStream;<br /> registratorBlog.registeredPepsilightRu regPepsilightRu = new registratorBlog.registeredPepsilightRu();<br /><br /> protected void Page_Load(object sender, EventArgs e)<br /> { <br /> }<br /><br /> protected void Button1_Click(object sender, EventArgs e)<br /> {<br /> string username = tbLogin.Text;<br /> string password = tbPassword.Text;<br /> string mail = tbMail.Text;<br /> string captcha = tbCapcha.Text;<br /><br /> Label8.Text = regPepsilightRu.getCaptcha();<br /> <br /> imgCapcha.ImageUrl = "/CaptchaReadImage.aspx"; <br /> }<br /><br /> protected void Button2_Click(object sender, EventArgs e)<br /> {<br /> string username = tbLogin.Text;<br /> string password = tbPassword.Text;<br /> string mail = tbMail.Text;<br /> string captcha = tbCapcha.Text;<br /><br /> <br /> tbCapcha.Text = regPepsilightRu.postReg(username, mail, captcha, Label8.Text);<br /> } <br /> } но в итоге после регистрации не приходит письмо, т.е. не выполняется регистрация. в чем может быть проблема??
04.08.12
1 ответ

Лучший ответ по мнению автора

вообще то не возможно читать (((

правда я сам до сих пор не знаю как сюда вставлять форматированный код красиво и удобно

у меня в итоге все замечательно отрабатывает

http://shot.qip.ru/008z9U-2ZU0L5E2b/ 

но пришлось использовать вспомогательный класс собственной старой разработки

оказывается WebClient сильно ограниченн в возможностях

в частности он не позволяет запретить редирект, а в данном случае это критично

фрагменты своего класса я показывал когда иллюстрировал как сохранять куки

в данном случае я приведу фрагмент кода отвественный за отправку строки методом POST

http://shot.qip.ru/008z9U-1ZU0L5E2c/

думаю Вам было бы полезно посмотреть этот класс как пример выноса многократно повторяющихся действий из основного потока. в этом контексте это создание запросов, настройки параметров, получение ответа и так далее

если не выносить вспомогательные действия из основного кода, при работе в вебресурсами получается очень громоздкий и мало понятный код. за деревьми совсем не видно леса — в смысле что простые действия с вебресурсом теряются в других простых действиях по формированию запросов и получению ответов

если класс интересен — обращайтесь в чат, а то не получится нормально его тут опубликовать

05.08.12
Лучший ответ по мнению автора
Посмотреть всех экспертов из раздела Технологии > .Net/C#
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store