Tagi na forum.

C# 1456 XML 282
SQL 1192 sieci 268
ASP.NET 785 IIS 262
Windows 726 C++ 255
web 608 Html 218
Visual Studio 515 Information Technology 193
SQL Server 425 MSDN 167

pokaż wszystkie tagi na forum

interakcja z formularzem strony www w warstwie kodu

adoss 2011-12-07 13:57:56
0
avatar
 
 

Witam, napotkałem kolejny problem przy budowie mojego robota parsującego dane z allegro.pl. Mianowicie odwiedzając stronę o charakterze erotycznym (np. http://allegro.pl/ShowItem2.php?item=1953089611) należy w formularzu potwierdzić że ma się ukończone 18lat. Znalazłem gdzieś w necie kod pozwalający zalogować się do poczty wp.pl oto on:

            {
                CookieContainer cookies = new CookieContainer();

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://profil.wp.pl/login.html");
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
                request.Method = "GET";
                request.CookieContainer = cookies;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                response.Close();

                //POST
                request = (HttpWebRequest)HttpWebRequest.Create("http://profil.wp.pl/login.html");
                request.Method = "POST";
                request.CookieContainer = cookies;
                string loginData = String.Format("_action=login&url=%2F&idu=100&serwis=&enticket=&login_username=adoss18&login_password=adek18&countTest=1");
                request.ContentType = "application/x-www-form-urlencoded";
                byte[] loginDataBytes = Encoding.ASCII.GetBytes(loginData);
                Stream postData = request.GetRequestStream();
                postData.Write(loginDataBytes, 0, loginDataBytes.Length);
                postData.Close();
                response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                doc.Load(stream, Encoding.UTF8);
            }

 

Można śmiało sprawdzić na tym loginie(adoss18) i pw(adek18), konto stworzone specjalnie dla przykładu. Łańcuch loginData tworzony w przykładzie jest wzięty z firebuga z metody POST login.html, próbowałem analogicznie zrobić do formularza allegro ale niestety nie działa, próbowałem dodać również ciasteczko (exp_content_cookie) które jest odpowiedzialne za zapamiętanie akcji tego formularza i przejście do wybranej strony. Kod do allegro podam w następnym poście.


tagi: C#   Html


adoss  2011-12-07 13:59:04 #1
0
avatar
 
 

Poniżej podaję kod do przykładu ze strony allegro:

{
                CookieContainer cookies = new CookieContainer();
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://allegro.pl/daskie-pheromone-essence-5-ml-skoncentrowane-fero-i1953089611.html");
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
                request.Method = "GET";
                request.CookieContainer = cookies;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                response.Close();
                // opcjonalne dodanie ciasteczka:
                Cookie adult = new Cookie();
                adult.Name = "exp_content_cookie";
                adult.Value = "42";
                adult.Domain = ".allegro.pl";
                adult.Path = "/";
                adult.Expires = DateTime.Parse("2012-09-18 00:28:54");
                cookies.Add(adult);
                //
                //POST
                request = (HttpWebRequest)HttpWebRequest.Create("http://allegro.pl/daskie-pheromone-essence-5-ml-skoncentrowane-fero-i1953089611.html");
                request.Method = "POST";
                request.CookieContainer = cookies;
                string loginData = "go_to=ShowItem2.php%3Fitem%3D1953089611&explicit_code=42&accept=Jestem+pe%C5%82noletni+i+chc%C4%99+przej%C5%9B%C4%87+dalej";
                request.ContentType = "application/x-www-form-urlencoded";
                byte[] loginDataBytes = Encoding.ASCII.GetBytes(loginData);
                Stream postData = request.GetRequestStream();
                postData.Write(loginDataBytes, 0, loginDataBytes.Length);
                postData.Close();
                response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();

                //wczytanie źródła do htmldocument z htmlagilitypack
                HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                doc.Load(stream, Encoding.UTF8);

                //wczytanie źródła do stringa
                const int bufSizeMax = 65536;
                const int bufSizeMin = 8192;
                StringBuilder sb;

                int length = (int)response.ContentLength;
                int bufSize = bufSizeMin;
                if (length > bufSize)
                    bufSize = length > bufSizeMax ? bufSizeMax : length;
                byte[] buf = new byte[bufSize];
                sb = new StringBuilder(bufSize);
                while ((length = stream.Read(buf, 0, buf.Length)) != 0)
                    sb.Append(Encoding.UTF8.GetString(buf, 0, length));
            }

 

W przykładzie umieściłem wczytanie streamu do htmldocument i do stringa jakby ktoś nie miał biblioteki HtmlAgilityPack to usuńcie zaznaczone komentarzem 2 linijki wczytujące do doc. Dodam jeszcze że dodanie ciasteczka do kontenera nic nie zmienia.

Jakieś korekty, sugestie?propozycje innych rozwiązań?


adoss  2011-12-09 14:07:21 #2
0
avatar
 
 

nikt nie ma chociaż pomysłu na rozwiązanie??


Udziel odpowiedzi

avatar
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.

Idź na górę strony