WebBrowser - Pobieranie plików

0

Witam, chciałbym pobrać plik, który jest możliwy do pobrania tylko po zalogowaniu na stronę.
Moje pytanie jest takie: jak pobrać plik mając adres do niego i będąc zalogowanym przez WB na tę stronę?

Jakby coś to pobrałem i zainstalowałem również EmbeddedWB ale nigdzie nie ma jak się dzięki temu pobiera pliki.
Prosze nie pisać o Synapse i Indy bo się na tym nie znam :(

Chodzi oczywiście o Delphi

0

To sie doucz.
Jezeli zawsze bedziesz mowil, ze nie umiesz tego i tamtego, to nigdy nic nie napiszesz.
PS: Pisze bez polskich znakow, bo z linux'a :)

0

Ale nie chcę tego robić w czymś innym bo już w WB zacząłem

0

Próbowałem z Synapse, znalazłem parę przydatnych rzeczy na forum ale się nie udało bo nie mogłem się nawet zalogować :/
Chodzi o logowanie na pocztę GMail (przy WB oczywiście nie miałem z tym problemu...

function HTTPEncode(const AStr: string): string;
const
  NoConversion = ['A'..'Z', 'a'..'z', '*', '@', '.', '_', '-'];
var
  Sp, Rp: PChar;
begin
  SetLength(Result, Length(AStr) * 3);
  Sp := PChar(AStr);
  Rp := PChar(Result);
  while Sp^ <> #0 do
  begin
    if Sp^ in NoConversion then
      Rp^ := Sp^
    else if Sp^ = ' ' then
      Rp^ := '+'
    else
    begin
      FormatBuf(Rp^, 3, '%%%.2x', 6, [Ord(Sp^)]);
      Inc(Rp, 2);
    end;
    Inc(Rp);
    Inc(Sp);
  end;
  SetLength(Result, Rp - PChar(Result));
end;

function Explode(var a: TStrArray; Border, S: string): Integer;
var
S2: string;
begin
Result  := 0;
S2 := S + Border;
repeat
  SetLength(A, Length(A) + 1);
  a[Result] := Copy(S2, 0,Pos(Border, S2) - 1);
  Delete(S2, 1,Length(a[Result] + Border));
  Inc(Result);
until S2 = '';
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
  C : String;
  GALX, S : String;
  HttpSend : THttpSend;
  tempStr : string;
  A : TStrArray;
  I : Integer;
Begin
HttpSend := THttpSend.Create;
  with HttpSend do
  begin
    KeepAlive := True;
    Protocol := '1.1';
    MimeType := Default_MimeType;
    UserAgent := Opera_UserAgent;

    //Pobieranie źródła strony z zlogowaniem
    HttpSend.HTTPMethod('GET', 'https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=1eic6yu9oa4y3&ss=1&scc=1&ltmpl=default&ltmplcache=2&hl=pl');
    source1.Lines.LoadFromStream(HttpSend.Document);


    for I := 0 to source1.Lines.Count - 1 do
    begin
    S := source1.Lines[I];
    if Copy(S, 1, Length('             name="GALX"')) = '             name="GALX"' then
    begin
    Explode(A, 'value', source1.Lines[I +1]);
    Explode(A, '="', A[1]);
    Explode(A, '" />', A[1]);

    GALX := A[0];

    end;
    end;

    C := 'ltmpl=default&ltmplcache=2&continue=' + HTTPEncode('https://mail.google.com/mail/h/?zy=e&f=1') + '&service=mail&rm=false&ltmpl=default&hl=pl&ltmpl=default&scc=1&GALX=' + GALX + '&Email=LOGIN&Passwd=PASSWD&PersistentCookie=&rmShown=1&' + HTTPEncode('Zaloguj się');

    HttpSend.Document.Write(Pointer(C)^, Length(C));
    HttpSend.HTTPMethod('POST', 'https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=1eic6yu9oa4y3&ss=1&scc=1&ltmpl=default&ltmplcache=2&hl=pl');

    HttpSend.Clear;
    HttpSend.HTTPMethod('POST', 'https://mail.google.com/mail/h/?zy=e&f=1');
    source1.Lines.LoadFromStream(Httpsend.Document);
    source1.Lines.SaveToFile('D:\test.html');
    end;

end;

W źródle strony wywalało mi błąd 411 :/

0

A no z gmailem mogą być kombinacje, ale debugger HTTP lub sniffer w łape, zmieniamy kod strony na logowanie po HTTP i jazda - analizujesz co wysyła przeglądarka do servera i to samo starasz się wysłać w Synapse. Co do błędu 411 to jak widzę jest to Length Required, nie wiem dlaczego Tobie taki błąd wyskakuje, bo Synapse nie pozwala na ręczne ustawienie wartośći Content Length, ponieważ jest ona ustala w zależności od tego co jest w nagłówku. A i rozumiem, że przy POST'owaniu ustawiłeś MimeType oraz używasz modułów do SSL'a jak i odpowiednich dllek, do pobrania ze strony Synapse? I może Misiekd tutaj zajrzy to będzie umiał coś doradzić. Ja widzę, że Ty się logujesz po prostu chyba do poczty gmaila, a to da się zrobić innymi sposobami, można przecież pobrać pocztę i załączniki. Koniecznie chcesz to robić po HTTPS? Zobacz sobie źródła programów dołaczonych do tego postu. Jeden odbiera poczte i odpowiada przy znalezieniu tematów o wskazanym tytule, a drugi wysyła pocztę. Oba działają i były testowane na poczta.o2.pl oraz gmail.com. Obecne wersje są z mała poprawką. Do katalogu z programem wrzucone są wymagane dllki do SSLa czyli: libeay32.dll i ssleay32.dll. A moduł ssl_openssl_lib.pas zostal tak zmieniony aby odczytywał te dllki z katalogu programu w razie jakbyś gdzieś w Pathu albo systemie miał je w innych wersjach, które mogłby by nie zadziałać. Podałem link do tego tematu Miśkowid na GG, może spojrzy i coś doradzi z gmailem po HTTPS, bo ja do pobierania załączników z gmaila użył bym pop3, ale nie wiem jak z innym folderami gmaila poza głownym, może faktycznie trzeba kombinować po HTTPS, to ktoś inny może to robił pod Synapse lub Indy i coś jeszcze Tobie konkretniej pomoże.

0

http://4programmers.net/Forum/Delphi_Pascal/170032-migracja_indy_synapse?hl=synapse tam jest klasa do wysyłki maili (odbiór trzeba sobie dopisać). Co do bibliotek do ssla to ja używam cl32.dll z cryptlib library w wersji 3.3.3.0 (nie wiem jaka jest aktualna).
Aby działało to z gmailem to pod linią SMTPSend.AutoTLS := True; trzeba dopisać jeszcze SMTPSend.FullSSL := True;

Jeszcze odbieranie maili (żeby nikt nie mówił, że wujek Misiek zły :p)

var
  pop: TPOP3Send;
  MimeMsg: TMimeMess;
  MimeParts, MimePart: TMimePart;
  i, j: integer;
  s: string;
begin
  pop := TPOP3Send.Create;
  MimeMsg := TMimeMess.Create;
  try
    pop.AuthType := POP3AuthLogin;
    pop.AutoTLS := False;
    pop.FullSSL := True;
    pop.Sock.SSL.SSLType := LT_SSLv3;

    pop.TargetHost := 'pop.gmail.com';
    pop.TargetPort := '995';
    pop.UserName := 'dupa';
    pop.Password := 'maryna';

    if pop.Login then
    begin
      if pop.List(0) then
      begin
        for i := 0 to pop.FullResult.Count - 1 do
        begin
          if pop.Retr(i + 1) then
          begin
            MimeMsg.Lines.Assign(pop.FullResult);
            MimeMsg.DecodeMessage;

            MimeParts := MimeMsg.MessagePart;

            //MimeMsg.Header.Subject; - temat
            //MimeMsg.Header.ToList; - adresy odbiorców
            //MimeMsg.Header.Date; - data wysłania

            case MimeParts.PrimaryCode of
              MP_TEXT:
              begin
                MimeParts.DecodePart;
                SetLength(s, MimeParts.DecodedLines.Size);
                MimeParts.DecodedLines.Read(Pointer(s)^, MimeParts.DecodedLines.Size);
                //w s jest teraz cała treść emaila
              end;
              MP_MULTIPART:
              begin
                for j := 0 to MimeParts.GetSubPartCount - 1 do
                begin
                  MimePart := MimeParts.GetSubPart(j);
                  MimePart.DecodePart;
                  if Length(Trim(MimePart.FileName)) = 0 then
                  begin
                    SetLength(s, MimePart.DecodedLines.Size);
                    MimePart.DecodedLines.Read(Pointer(s)^, MimePart.DecodedLines.Size);
                    //w s jest teraz cała treść emaila
                  end
                  else
                  begin                    
                    //MimePart.FileName; - nazwa załącznika
                    //MimePart.DecodedLines - załącznik
                  end;
                end;
              end;
            end;
          end;
        end;
      end
      else
      begin
        //błąd pobierania listy wiadomości
        Result := False;
      end;
      pop.Logout;
    end
    else
    begin
      //błąd logowania
      Result := False;
    end;
  finally
    FreeAndNil(MimeMsg);
    FreeAndNil(pop);
  end;
end;

BTW wypadało by to do kupy zebrać i wrzucić do artów... Ach to lenistwo :p :/

Co do gmaila to ma on taką przypadłość, że jak odczytasz maila raz (nie ważne, czy programem pocztowym czy przez stronę) to przenosi on tą wiadomość z odebrane i drugi raz żaden program pocztowy używający pop3 jej nie odczyta. Nie mam pojęcia czy da się to zmienić/wyłączyć czy nie. Po prostu pop3 potrafi odebrać wiadomości jedynie z folderu inbox

0

No mi właśnie chodzi koniecznie o logowanie na stronę a nie pobieranie wiadomości przez np POP (nie pytajcie czemu :P )
Libeay32.dll i ssleay32.dll mam w wersji 0.9.8.4 (czyli tak jak u Ciebie w tych przykładach)
A co do MimeType to ustawione mam "application/x-www-form-urlencoded"
Wrzuciłem sobie do folderu z programm też ssl_openssl_lib ale to również nie przyniosło skutków.
Dlatego właśnie chciałem użyć webbrowsera bo z synapse za nic nie daję rady poprawić na tyle aby choćby się logowało.

0

przecież masz podany GOTOWY kod, który zarówno wysyła jak i odbiera maile z gmaila

0

@mc: proszę nie ignorować pomocy Miśka :) Sam go poprosiłem żeby podzielił się swoją wiedzą w tym temacie, a i ma On też rację, że przydały by się arty o POP3 i SMTP w Synapse, jak i o metodach GET i POST w THttpSend też od Synapse. Jednak również tak, jak Misiek nie mogę się przemóc i skrobnąć na ten temat krótkiego arta z przykładami chociażby do gotowców, ale co się odwlecze to nie uciecze, więc może wkrótce damy radę coś takiego napisać, chociaż moim zdaniem to co jest dostępne na stronie projektu plus to co już tutaj ja czy Misiek napisalismy na forum powinno być wystarczające, a przynajmniej dla polskich użytkowników. Ja staram się wklejać przynajmniej w pytaniach o THttpSend przykładowe kody.

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