Delphi - Logowanie na forum phpBB by Przemo

0

Witam, mam taki problem , że po użyciu tej funkcji:

Uses
MSHTML;
...
 Var
  dokumentwww : IHTMLDocument3;
begin
dokumentwww := WebBrowser2.Document as IHTMLDocument3;

if assigned(dokumentwww) then
Submit := (dokumentwww.getElementsByName('login').item(0,'')as
IHTMLInputElement);
if assigned(Submit) then
Submit .form.submit;

Ponownie przerzuca mnie na stronę logowania. Formularz wypełniam przy użyciu FillForm i tu jest wszystko ok, tylko właśnie jest problem z Submit.

Aha, przy użyciu tej funkcji i logowaniu się do serwisów nie opartych o phpBB by Przemo wszystko działa ok.

Proszę o pomoc!

0

Nie wiem dlaczego Submit nie działa i nie chce mi się z tym kombinować, zamiast tego zasymuluj kliknięcie przycisku "Zaloguj"

var
 doc: IHTMLDocument3;
 elem: IHTMLElement;
begin
  doc:= WebBrowser1.Document as IHTMLDocument3;
  if Assigned(doc) then
  begin
    elem:= doc.getElementsByName('username').item(0, '') as IHTMLElement; //login
    if Assigned(elem) then
      (elem as IHTMLInputElement).value:= 'login';
    elem:= doc.getElementsByName('password').item(0, '') as IHTMLElement; //haslo
    if Assigned(elem) then
      (elem as IHTMLInputElement).value:= 'hasło';
    elem:= doc.getElementsByName('login').item(0, '') as IHTMLElement; //button zaloguj
    if Assigned(elem) then
      elem.click;
  end;
end;
0

O to chodziło ;) Wszystko gitarka, wielkie dzięki Ci

0

Witam,
sorry, że odświeżam tak stary post ale chciałbym przenieść się z Webbrowsera na Indy.
Tyle, że mam problem z tym logowaniem:

Var
StreamIn: TStringStream;
Begin
idHTTP.CookieManager:=Form1.IdCookieManager1;

 StreamIn:= TStringStream.Create('');
  try
    StreamIn.WriteString('username=XXXXX&password=XXXXX');
    idHTTP.post('http://adres_forum.pl/login.php', StreamIn);

    for i:=1 to idHTTP.CookieManager.CookieCollection.Count do
      idHTTP.CookieManager.AddCookie(idHTTP.CookieManager.CookieCollection.Items[i-1].CookieText,
                                                        'http://adres_forum.pl/login.php');
 finally
  Memo1.Text:= IdHTTP.Get('http://adres_forum.pl/');

  end;

Co jest nie tak? W źródle jest komunikat o tym, że nie jestem zalogowany
Czy trzeba np podawać również name buttona w tej linii:

 StreamIn.WriteString('username=XXXXX&password=XXXXX');

?

Proszę o pomoc ;)

0

Ja od dawna nie używam Indy, ale jak musi być Indy to przejrzyj sobie źródła programu, który dołączyłem i zobacz jak loguje się na forum na jun.pl, które właśnie jest oparte na PhpBB i dodatkowo na tym by Przemo. Może być też tak, że inne dane wysyłane są w pakietach do logowania na tym forum na jakie chcesz się zalogowac, bo każde forum może działać inaczej, nawet u jednego dostawcy tak bywa. Dlatego polecam przyjrzeć się pod snifferem typu WireShark (jak go używać pokazują tutoriale video na YouTube), a później to samo wysłać metodą POST. Ale jak wyslać dane metodą POST pod Indy to nie mam pojęcia, bo pod Indy tylko na ogół pobierałem metodą GET, ale jeżeli ustawienie MIME type nie pomoże to nie wiem, może ktoś inny coś Tobie doradzi jeżeli koniecznie chcesz to zrobić pod Indy.

0

Ciągle próbuje się z tym uporać. Przeanalizowałem twój program, dało mi to trochę do myślenia.
Jednak mając ten kod, twierdzę, że zapisują się ciastka (czyli że chyba się loguje):

Var
StreamIn: TStringStream;
Begin
idHTTP.CookieManager:=Form1.IdCookieManager1;
 
 StreamIn:= TStringStream.Create('');
  try
    StreamIn.WriteString('username=XXXXX&password=XXXXX&login=Zaloguj');
    idHTTP.post('http://adres_forum.pl/login.php', StreamIn);
 
    for i:=1 to idHTTP.CookieManager.CookieCollection.Count do
      idHTTP.CookieManager.AddCookie(idHTTP.CookieManager.CookieCollection.Items[i-1].CookieText,
                                                        'http://adres_forum.pl/login.php');
 finally
  Memo1.Text:= IdHTTP.Get('http://adres_forum.pl/');
 
  end;

Uważam tak, gdyż idHTTP.CookieManager.CookieCollection.Count wynosi 2 lecz gdy pobieram źródło strony głównej, pobiera mi źródło jak gdybym był niezalogowany :|

0

Mały offtopic: wielka prośba do olesia i całej reszty towarzystwa - sniffery, jak WireShark, pracują na poziomie pakietów, ew. niższych protokołów, naprawdę nie ma sensu używać ich do analizowania sesji HTTP. Do takich rzeczy znacznie lepiej nadają się debuggery HTTP(S), jak np. Fiddler. Tego rodzaju zabawki dają bardzo ładny podgląd sesji, możliwość craftowania zapytań/odpowiedzi, wbudowaną obsługę kompresji i szyfrowania... Pozwala nawet ustawiać breakpointy na określone warunki komunikacji.

0

Dobra Olesio :P Użyłem tego twojego synapse i... to samo co w przypadku Indy - w źródle strony jest, że nie jestem zalogowany i żeby przeglądać forum muszę się zalogować. Jeśli chodzi o sam silnik forum (php BB by Przemo) to na pewno nic tam w kodzie nie było mieszane.
To kod, który napisałem:

var
  S : string;
  SynHttp : THttpSend;
begin
  SynHttp := THttpSend.Create;
  S := 'username=XXX&password=XXX&autologin=on&redirect=&login=Zaloguj';
  SynHttp.Document.Write(Pointer(S)^, Length(S));

  SynHttp.HTTPMethod('POST', 'http://XXX.pl/login.php');
  Memo1.Lines.LoadFromStream(SynHttp.Document);
  Memo1.Lines.SaveToFile('D:\a.html');

  SynHttp.Clear;
  SynHttp.HTTPMethod('GET', 'http://XXX.pl/index.php');
  Memo1.Lines.LoadFromStream(SynHttp.Document);
  Memo1.Lines.SaveToFile('D:\b.html');

  SynHttp.Free;
  end;

Proszę o pomoc ;)

0

Zjarzyj do dokumentacji:

procedure Clear;

Reset headers and document and Mimetype.

No a przy postowaniu danych MIMEType może być wymagane. Masz je ustawione tak jak jakiś logiczny useragent? Bo forum może tego wymagać. Poza tym Ty nie pobierasz strony jaką dostałeś po postowaniu. Jakbyś to robił i wtedy zapisywał do pliku html to byś zobaczył co zwraca, jeżeli pusty plik to trzeba upewnić się czy kod błędu jest 301 lub 302, jeżeli tak to trzeba obsłużyć przekierowanie. Zresztą wejdź na: http://testyolesia.jun.pl załóż sobie z pod przeglądarki internetowej jakieś konto i testuj mój kod do woli - to zobaczysz, że wysyła odpowiedzi jak i zakłada nowe tematy, logowanie też oczywiście działa. Akurat z obsłużeniem forów pod phpbb jak i vbiuletyn nie miałem raczej większych problemów jeśli skorzystałem z Synapse i wysyłałem metodą POST to co forum się spodziewa otrzymać oraz obsłużyłem ewentualne przekierowania.

0

Dzięki ;) Gitarka teraz jest. Problem tkwił właśnie w MIMEType.

1 użytkowników online, w tym zalogowanych: 0, gości: 1