CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Logowanie przez IdHTTP
Strona 3 z 4

Re: Logowanie przez IdHTTP

Nowy postNapisane: środa, 18 maja 2011, 21:48
przez polymorphism
Kodu nie podam, bo nic Ci on nie da. Pisałem go z wykorzystaniem klas, których po prostu nie masz, więc niewiele by wniósł. Jutro, jeśli będę pamiętał i będzie mi się chciało, pokombinuje z czystym COM-em.

Re: Logowanie przez IdHTTP

Nowy postNapisane: czwartek, 19 maja 2011, 08:53
przez Darek_C++

Re: Logowanie przez IdHTTP

Nowy postNapisane: czwartek, 19 maja 2011, 22:30
przez mckri
To jest link, z którego miałem kod, podawany 3 posty wczesniej.

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 20 maja 2011, 07:33
przez Cyfrowy Baron
Czy sprawdzałeś z wciśnięciem klawisza ENTER, jak podałem wcześniej???

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 20 maja 2011, 11:29
przez polymorphism
Jak obiecałem, tak robię. Masz tu (niezbyt piękny) kod, który loguje się na to forum:
KOD cpp:     UKRYJ  
IHTMLDocument2* doc;           

if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (void**)&doc)))
{
        IHTMLElementCollection* forms;
        IDispatch*                      disp;
        IHTMLFormElement*       form;

        if(SUCCEEDED(doc->get_forms(&forms)))
        {

                if(SUCCEEDED(forms->item(CVariant().toVARIANT(), CVariant(0).toVARIANT(), (IDispatch**)&disp)))
                {
                        IDispatch* user = NULL;
                        IDispatch* pass = NULL;
                        IDispatch* login = NULL;

                        disp->QueryInterface(IID_IHTMLFormElement, (void**)&form);

                        form->item(CVariant(L"username").toVARIANT(), CVariant().toVARIANT(), (IDispatch**)&user);
                        form->item(CVariant(L"password").toVARIANT(), CVariant().toVARIANT(), (IDispatch**)&pass);
                        form->item(CVariant(L"login").toVARIANT(), CVariant().toVARIANT(), (IDispatch**)&login);

                        if(user && pass && login)
                        {
                                IHTMLInputElement*      input1;
                                IHTMLElement*           input2;

                                user->QueryInterface(IID_IHTMLInputElement, (void**)&input1);
                                input1->put_value(CVariant(L"użytkownik").toVARIANT().bstrVal);
                                input1->Release();

                                pass->QueryInterface(IID_IHTMLInputElement, (void**)&input1);
                                input1->put_value(CVariant(L"hasło").toVARIANT().bstrVal);
                                input1->Release();

                                login->QueryInterface(IID_IHTMLElement, (void**)&input2);
                                input2->click();
                                input2->Release();
                        }

                        if(user) user->Release();
                        if(pass) pass->Release();
                        if(login) login->Release();
                        form->Release();
                }
                forms->Release();
        }

        doc->Release();
}
 

Dwie uwagi:
  • jak łatwo zauważyć, użyłem własnej klasy CVariant. Myślę, że nie powinno być problemu z zamianą jej na klasę TVariant.
  • Metoda IHTMLInputElement::put_value oczekuje stringa typu BSTR, a to nie jest zwykły unikodowy string. Dlatego w swoim kodzie użyłem klasy CVariant, ale tylko do konwersji wchat_t[] -> BSTR. Jeśli VCL-owy string ma jakąś metodę, która zwraca string tego typu, użyj go. W przeciwnym wypadku trzeba użyć odpowiednich funkcji WinAPI, nazw nie pamiętam ;)

    --- dodane ---

    WideString ma przeciążony operator konwersji dla BSTR, czyli powinno wystarczyć:
    KOD cpp:     UKRYJ  
    (BSTR)WideString(L"tralala")

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 20 maja 2011, 21:48
przez Slynx
Jeśli to jest web browser, a z tego co mówicie to tak, to czemu się tak strasznie bawicie w jakieś nowe klasy, kombinacje, itp Web browser ma wbudowane metody. Sam wykorzystywałem to gdy logowałem się na stronę i potrzebowałem własnie kliknąć przycisk "loguj", a z tego co rozumiem, właśnie tego potrzebował autor (jeśli się mylę, to sorry, ale właśnie to zrozumiałem z ostatnich postów)
Kod jest z C++/cli, ale z przerobieniem nie powinno być żadnych problemów
KOD cpp:     UKRYJ  
        HtmlElementCollection ^ element_collection =  web_browser->Document->All;
                for each (HtmlElement ^ cur_elem in element_collection)
                {
                        if (cur_elem->GetAttribute("name") == "poczta_activate")
                                cur_elem->InvokeMember("click");
                        if (cur_elem->GetAttribute("id") == "kapcza")
                                cur_elem->SetAttribute("value", kapcza);
                        if (cur_elem->GetAttribute("class") == "submit-button")
                                cur_elem->InvokeMember("click");
                }
 

Jako, że nie miałem konkretnej nazwy przycisku, więc nie mogłem wyłapać, który to, to wyłapałem wszystkie elementy. Potem sprawdziłem po kolei, który ma wybrany atrybut, czyli logowanie i wywołanie odpowiedniego zdarzenia na tym elemencie (InvokeMember("click"))
Tu są przy okazji dwa inne przykłady, więc nie będę usuwał. Fragment kodu jest ze starego kreatora kont na wp.
W web_browser wszystko wyłapuje się przez Document->GetElmentByiD a potem wywołuje odpowiednie metody (ustawia atrybuty czy wywołuje zdarzenia)

... ale coś mam wrażenie, że wy nie o tym gadacie... choć o webBrowserze, ktoś wspomniał...

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 20 maja 2011, 22:20
przez polymorphism
Jeśli to jest web browser, a z tego co mówicie to tak, to czemu się tak strasznie bawicie w jakieś nowe klasy, kombinacje

Spróbuj zrobić to samo, tylko bez użycia klas .NET-owych, wtedy zobaczysz, dlaczego się tak strasznie bawimy ;)

Re: Logowanie przez IdHTTP

Nowy postNapisane: sobota, 21 maja 2011, 11:16
przez Slynx
Aha, czyli źle zrozumiałem. Czemu mnie to nie dziwi...

Ale widzisz... klasy NET-owe górą ; p

Re: Logowanie przez IdHTTP

Nowy postNapisane: sobota, 21 maja 2011, 11:44
przez polymorphism
Slynx napisał(a):Ale widzisz... klasy NET-owe górą ; p

Nie tyle .NET-owe, co jakiekolwiek klasy, które upraszczają kod i trzymają z daleka od korzystania bezpośrednio z COM-a.

Re: Logowanie przez IdHTTP

Nowy postNapisane: niedziela, 22 maja 2011, 21:43
przez mckri
Czy sprawdzałeś z wciśnięciem klawisza ENTER, jak podałem wcześniej???

Cyfrowy Baronie, nie sprawdzałem. Uznałem, że symulowanie kliknięcia przycisku myszki nie zadziała, gdyż z tego co na szybko sprawdziłem, po wprowadzeniu danych logowania do pól edycji, naciśnięcie klawisza enter na tym komponencie nie daje żadnego efektu. Przyznaję, że nie próbowałem tego rozgryzać dlaczego tak jest.

polymorphism, Twój kod (po przerobieniu dla builder'a) działa tak jak chciałem! Dzieki!

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 5 sierpnia 2011, 15:39
przez mate006
Ja mam pytanie odnośnie kodu polymorphism'a w jaki sposób dodać tekst do textarea, i jak wybrac odpowiednią opcję w checkbox?

Byłbym bardzo wdzięczny bo nie mogę sobie z tym poradzić

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 5 sierpnia 2011, 18:29
przez polymorphism
Za mało informacji podałeś.

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 5 sierpnia 2011, 19:04
przez mate006
polymorphism napisał(a):Za mało informacji podałeś.


Poradziłem sobie z tym problemem, jednak mam inny problem, pisze sobie programik który wpisuje różne dane do mojego serwisu www. No i mam w nim pola typu radio <input type="radio" name="plec" value="woman"/> <input type="radio" name="plec" value="man"/> i moje pytanie brzmi jak zaznaczyć drugą wartość. bo udało mi się i zaznacza ale tylko pierwszą możliwość, oto ten kod:

KOD cpp:     UKRYJ  
IDispatch* radio = NULL;

form->item((TVariant)(L"plec"), (TVariant)0, (IDispatch**)&radio);

radio->QueryInterface(IID_IHTMLInputElement, (void**)&input1);
input1->put_checked(false);
input1->Release();
 


No i jeszcze jedną znalazłem uwagę, chodzi o to że jeśli wartość name elementu input jest w cudzysłowach ("") to wszystko ładnie chodzi, lecz jeśli jest w apostrofach ('') to wyskakuje błąd Access Violation ..., i chciałem się jeszcze spytać czy można to jakoś rozwiązać.

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 5 sierpnia 2011, 19:37
przez polymorphism
i moje pytanie brzmi jak zaznaczyć drugą wartość.

KOD cpp:     UKRYJ  
form->item((TVariant)(L"plec"), (TVariant)1, (IDispatch**)&radio);

A tak próbowałeś?

(...) lecz jeśli jest w apostrofach ('') to wyskakuje błąd Access Violation

Nie rozumiem, jak w apostrofach?

Re: Logowanie przez IdHTTP

Nowy postNapisane: piątek, 5 sierpnia 2011, 20:01
przez mate006
(...) lecz jeśli jest w apostrofach ('') to wyskakuje błąd Access Violation
Nie rozumiem, jak w apostrofach?


Jedni piszą strony z użyciem apostrofów:
KOD cpp:     UKRYJ  
<input class='input' id='name' type='text' name='name' size='35' maxlength='50'  value='' />


a inni z użyciem cudzysłowów
KOD cpp:     UKRYJ  
<input class="input" id="name" type="text" name="name" size="35" maxlength="50"  value="" />


No i z apostrofami nie działa