POST bez parametrow w delphi

0

Czesc,
mam pewien problem, byc moze wybralem nie ten dzial, ale ze tworze pewien program w delphi, wiec wstawilem tutaj.

Mianowicie, potrzebuje za pomoca indy lub synapse przeslac plik csv na jakas strone www.
Robilem to juz kiedys kilka razy.
Sek w tym, ze teraz podgladajac ruch sieciowy (httpfox dla firefoxa) widze ze strona wysyla post, gdy recznie przez nia przesylam plik csv, ale ten POST nie ma zadnych parametrow..
Czy mozna wyslac POST bez zadnych paramatrow?

Chyba mniej wiecej opisalem problem, spotakliscie sie z czyms takim?

0

Nigdy tego nie robiłem. Ale skoro jest to robione to można. Tylko przeczy to trochę idei. Po to jest metoda POST, żeby coś nią przesłać. Ale pod Synapse na pewno możesz spróbować wyślać POST, wpisując do własności Document pusty string. Tylko nie wiem czy nie otrzymasz wtedy na niektórych stronach w odpowiedzi kodu błędu "bad request". Więcej w moim artykule pod adresem: Obsługa protokołu HTTP przy użyciu pakietu Synapse i pewnie inni doradzą tutaj coś więcej, ewetntualnie osoby znające Indy, wypowiedzą się jak to jest pod nim.

0

Ja sądzę że jednak coś poknociłeś pewnie to i POST ale Content-Type pewnie nie application/x-www-form-urlencoded (jak w przypadku "zwykłych" danych formularza ) tylko prawdopodobnie multipart/form-data Wklej to co pokazuje Ci ta wtyczka.

0

Tam jest jakiś javascript zastosowany i POST (a nawet trzy POSTY) są puste i faktycznie ContentType jakiś dziwny(chociaz w sumie nie znam sie na rodzajach typow),
screen:

user image

0

Tak jak przypuszczałem to multipart/form-data tylko nie wiem nie znam tej wtyczki albo ona nie pokazuje albo Ty nie pokazałeś tego co potrzebne to powinno wyglądać jakoś tak:

-----------------------------3232154484937
Content-Disposition: form-data; name="jakies pole"

jakas wartossc
-----------------------------3232154484937
Content-Disposition: form-data; name="kolejne pole"

jakas wartossc
-----------------------------3232154484937
Content-Disposition: form-data; name="nazwa pola typu file w formularzu"; filename="tutaj nazwa pliku"
Content-Type: application/octet-stream

Tu zawartość pliku

Poza tym zwykłe standardowe nagłówki w stylu:

POST jakis adres.php HTTP/1.1
Host: ekazekforum.pl
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: jakies adres
Cookie: jakies ciacha
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------3232154484937
Content-Length: 3320

Jak będziesz to wszystko miał to bez problemu można wysłać to samo zarówno przez Indy jak i Synapse w Delphi.

0

okeeej, przelaczylem na wyswietlanie surowych danych (RAW) i dostalem takie cos:

 -----------------------------1335777819079
Content-Disposition: form-data; name="delang"

pl_PL
-----------------------------1335777819079
Content-Disposition: form-data; **name="import_file"; filename="akt wolter.csv**"
Content-Type: application/vnd.ms-excel

"product_code","active","stock","delivery"
"MEW900",1,10,"48 godzin"
(.......)

-----------------------------1335777819079--

czyli teortycznie musze probowac wysylac paramatry name oraz filename, na adres referera.
Ciasteczka w tym przypadku chyba nie sa istotne zbytnio.

0

No to wysyłasz w Indy (wersja 10 nie wiem czy w 9 tak samo) coś w stylu:

var
  Params: TIdMultipartFormDataStream; //uses IdMultipartFormData
  HTML: string;
begin
  IdHTTP1.Request.UserAgent:= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0';
  IdHTTP1.HandleRedirects:= True;
  Params:= TIdMultipartFormDataStream.Create;
  try
  Params.AddFormField('delang', 'pl_PL'); //tak musiz doda wyskie pola jakie sa wysylane
  Params.AddFile('import_file', 'sciezka i nazwa pliku', 'application/vnd.ms-excel');
  IdHTTP1.Request.ContentType:= 'multipart/form-data';
  HTML:= IdHTTP1.Post('adres', Params);
  finally
  Params.Free;
  end;
end;

W Synapse też można to wysłać z tym że o ile mi wiadomo nie ma tam nic ułatwiającego przygotowanie danych typu multipart/form-data więc trzeba samemu męczyć i zrobić coś na wzór: http://stackoverflow.com/questions/11471513/how-to-send-a-file-and-other-post-data-with-synapse

0

robie na indy jednak.

przy wysylaniu dostaje blad:

---------------------------
Debugger Exception Notification
---------------------------
Project Wysylacz.exe raised exception class $C0000005 with message 'access violation at 0x00636eec: read of address 0x00000148'.
---------------------------
Break   Continue   Help   
---------------------------

i przenosi mnie do:

function TIdCustomHTTP.GetRequest: TIdHTTPRequest;
begin
  Result := FHTTPProto.Request;
end; 

w module IdHTTP

dodanie znacznika <code class="delphi"> - fp

0

Jakia to wersja Indy i w ogóle ten błąd to w momencie wysyłania przy wywoływaniu Post? IdHTTP utworzone?

0

OK, glupi blad, zrobilem logowanie wczesniej i zwalnialem IdHTTP.

Teraz bledow pamieciowych nie ma, ale po wykonaniu Wysylania, przenosi mnie na strone logowania zamiast wyslac plik.

mam podpiety cookiemanager itp

0

Rozumiem że cały czas operujesz na tym samym IdHTTP i oczywiście logowanie przebiegło prawidłowo i nie czyścisz w między czasie ciasteczek?
Czasami (bardzo rzadko) zdarza się że Indy nie radzi sobie z niektórymi ciasteczkami. Spróbuj tak: wywal IdCookieMenager on bardzo mało naprawdę kiedy jest potrzebny i napisz kod na wzór:

  var
     i: Integer
    cookie: string;
 //bla bla
 //KOD LOGOWANIA
 //poniżej kod odpowiedzialny za "ręcznie" przekazanie ciasteczek
  for i:=0 to IdHTTP1.Response.RawHeaders.Count - 1 do
  begin
    if Pos('Set-Cookie', IdHTTP1.Response.RawHeaders.Names[i]) = 1 then
    begin
      cookie:= IdHTTP1.Response.RawHeaders.Strings[i];
      Delete(cookie, 1, 11);  //obciac 'Set-Cookie: '
      IdHTTP1.Request.CustomHeaders.Add('Cookie: '+ cookie);
    end;
  end;
  //KOD WYSYŁANIA PLIKU
0

wklejam procedure, ktora loguje, ale nie wysyla pliku ( przejscie na strone logowania). Czyzby winny byl javascript?

procedure TForm1.ZalogujButtonClick(Sender: TObject);
var
  Request: TStringList;
  Response: TMemoryStream;
  Params: TIdMultipartFormDataStream;
  i: Integer;
    cookie: string;
begin
  Params := TIdMultipartFormDataStream.Create;
  try
    Response := TMemoryStream.Create;
    try
      Request := TStringList.Create;
      try
        Request.Add('redirect=/xxxxxxxx');
        Request.Add('login=xxxxxxx');
        Request.Add('password=xxxxxxxx');

        HTTP.AllowCookies := True;
        HTTP.HandleRedirects := True;
        HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
        HTTP.Post('http://xxxxxxxxxx.com/admin/auth/login', Request, Response);
        Memo1.Text := HTTP.Get('http://xxxxxxxxxxx.com/xxxxxxxx/import/id/2');

        for i:=0 to HTTP.Response.RawHeaders.Count - 1 do
        begin
          if Pos('Set-Cookie', HTTP.Response.RawHeaders.Names[i]) = 1 then
          begin
            cookie:= HTTP.Response.RawHeaders.Strings[i];
            Delete(cookie, 1, 11);  //obciac 'Set-Cookie: '
            HTTP.Request.CustomHeaders.Add('Cookie: '+ cookie);
          end;
        end;

        Params.AddFormField('delang', 'pl_PL');
        Params.AddFile('import_file', 'C:\xxxxx.csv', 'application/vnd.ms-excel');
        HTTP.Request.ContentType:= 'multipart/form-data';
        Memo1.Text := HTTP.Post('http://xxxxxxxxx/import/id/2', Params);
      finally
        Request.Free;
        Params.Free;
      end;
    finally
      Response.Free;
    end;
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end; 
0

Tu nic nie więcej nie pomogę. Kod z grubsza wygląda na poprawny* a dokładnie poprawności wszystkich przekazywanych parametrów, ciasteczek itd. zweryfikować nie mogę ponieważ nie wiem co to za strona i nie mam danych logowania.
Jedynie zastanawiające dla mnie jest to że jest tylko jedno pole delang a nie ma żadnych innych może ta wtyczka jakoś obcina wyniki i nie pokazuje wszystkiego przejrzyj w źródle strony cały kod HTML tego formularza (form), który odpowiedzialny jest za wysyłanie pliku bo podejrzewam że są tam też inne pola typu input.

*Pod względem tego co może mieć wpływ na wysyłanie, bo pod względem poprawności jest tam namieszanie z obsługą wyjątków i zwalnianiem TIdMultipartFormDataStream

0

Powalczę jeszcze z tym wieczorem, jednak kazek jakbyś mógł mi pomóc osobiście jeszcze bardziej (podam haslo i login), to daj jakiś kontakt do siebie na skrzynke:
[email protected] , na pewno pomoc będzie 'odwzajemniona'.
Nie chce jeszcze dawać tego do zleceń, bo to mała rzecz jest..

0

Jak sobie nie poradzisz to załóż sobie tutaj konto i wyślij dane na PW (a najlepiej cały kod bez maskowania adresów itd.). Ja na żadną tymczasową pocztę nie będę wysyłał e-maila bo oni przejmują adresy poczty przychodzącej w celu rozsyłania spamu.

0

Strona stosuje JavaScript i inne bajery, dlatego indy/synapse nie sprawdzilo sie.
Sprawdzil sie Webbrowser... jako ostatecznosc.
Zalogowanie sie na strone bylo proste, gorzej z wyslaniem pliku, no ale udalo sie, kod bylejaki ale dziala.
Przy pliku otwieram OpenDialog do wyboru plików z dysku, wysyłam klawisze ze sciezka do pliku do edita z OpenDialog, nie potrafilem uzyskac uchwytu tej kontrolki, wiec symuluje klawisze, potem wyslanie komunikatu do buttona 'otworz' i mamy skonfigurowany formularz do wysylki, na koncu wywoluje SUMBIT i plik jest wgrywany.

TO już chyba moja 2 lub 3 sytuacja, kiedy javascript/xxx wyklucza indy/synapse, i trzeba uzywac mniej elegancko WB.

Pozdro dla kazka, za probe pomocy.

0

A dlaczego nie wysłałeś danych POST do uploadu pliku zgodnie z przykładem który podałem w temacie Webbrowser i wywolanie okna do upload'u pliku. ? Tam masz procedurę WBPostMultipartData trzeba tylko zmienić w niej Content-Type: Application/octet-string na Content-Type: application/vnd.ms-excel w btnSendClick zmienić FormFields.DelimitedText:= 'numitems=1&numfileelements=2&subdir1=/&newsubdir1='; na FormFields.DelimitedText:= delang=pl_PL; uploadname1 na import_file oczywiście podać odpowiedni URL i nazwę pliku. Powinno pięknie wysyłać bez zabawy w wypełnianie pola input typu file symulowaniem klawiszy (inaczej takiego pola programowo wypełnić się nie da).

0

kod wydal mi sie za dlugi i zagmatwany do rzeczy, ktora ja okreslilem jako 'prosta'...
w tamtym temacie bylo jeszcze wlasnie otwieranie OpenDialogu i z tego skorzystalem.
Jak na razie dziala, byc moze poprawie kod, ale to moze kiedys.

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