Często wysyłam coś przez imgur i chciałem w końcu zrobić sobie programik do tego, open source, ale mam problemy z wysłaniem obrazka. Firebug dziwnie analizuje stronę, same GETy pokazuje, ale w snifferze już widać metodę POST i jako UA przestawia się Flash. Czy któryś z ekspertów w tej dziedzinie mógłby rzucić okiem na stronę i napisać co powinno przykuć moją uwagę najbardziej? W ten sposób mi pomożecie.
http://imgur.com/ (upload z dysku)
A z czym masz problem? Przecież jest gotowa funkcja w Synapse HttpPostFile
. Dodajesz tylko moduł httpsend
do sekcji uses. I później poniższy kod załatwia sprawę. Więcej o korzystaniu z HTTP w pakiecie Synapse, napisałem w moim artykule: Obsługa protokołu HTTP przy użyciu pakietu Synapse - oto przykładowy kod:
uses
httpsend;
procedure TForm1.Button1Click(Sender : TObject);
var
SL : TStringList;
MS : TMemoryStream;
begin
SL := TStringList.Create;
MS := TMemoryStream.Create;
MS.LoadFromFile('D:\test.jpg');
if HttpPostFile('http://imgur.com/upload', 'Filedata', 'test.jpg', MS, SL) then
begin
SL.SaveToFile('D:\log.txt');
end;
SL.Free;
MS.Free;
end;
W rezultacie otrzymasz na przykład taką zawartość:
{"data":{"hashes":"[\"ahq2d7E"]","hash":"ahq2d7E","album":false,"edit":false,"gallery":null,"gallery_type":null,"upload_error":false},"success":true,"status":200}
Gdzie ahq2d7E
to id pliku. Oto dowód: http://imgur.com/ahq2d7E - można oczywiście też spróbować zrobić to samodzielnie. Pod WireSharkiem widać metodę POST dla odnośnika /upload
. Ja kombinowałem, ale tam trzeba by podstawiać SID z treści strony z uploadem, no i ogólnie trochę "pocudować". Dlatego zwracało mi pusty plik "loga". Także to już musiał byś się sam pobawić.
Zawsze kod tej funkcji można podejrzeć. A odpowiednią wartość dla parametru FieldName
wziąłem włąsnie z pod WireSharka. Gdzie w podglądzie TCP Streamu, przed właściwym plikiem było takie coś:
------------GI3cH2gL6Ef1KM7cH2ae0KM7GI3GI3
Content-Disposition: form-data; name="Filedata"; filename="test.jpg"
Content-Type: application/octet-stream
I dostosowałem to z kodem tej funkcji. I na przyszłośc, pokobminuj zawsze dłuższą chwilę sam, pomyśl najpierw na spokojnie. A pisanie na jakiekolwiek forum, nawet w dziale dla nowicjuszy, traktuj jako ostateczność.
Kochany jesteś (bez skojarzeń), dziękuję. Teraz widzę swoje błędy, teraz śmiga jak talala pod INDY. A w czym ten jakiś Synapse jest lepszy? On ma to samo co np. idHttp, ale jakoś bardziej rozbudowany jest, czy jak? Spróbuj mnie jakoś przekonać do tego w dwóch słowach, bo używam idHTTP tylko więc mówiąc o Synapse pisz tylko o odpowiedniku idHHTP i czy ciastka można ręcznie łatwo tam dodawać by wysłać do strony? (a może automat to robi za nas?), a obsługa https (ssl) też jest i prosta w użyciu?
I tak na boku, to znam jeszcze jedną stronę do wysyłania obrazków http://obrazki.elektroda.pl/index.php co musiałbym wysyłać z POSTem do skryptu? sporo rzeczy z inputów?
Każdy używa co mu bardziej leży i jest łatwiej. Osobiście od dawna nie korzystam z indy. W Synapse nic nie dzieje się z automatu. Przekirowania trzeba obsłużyć samodzielnie. Ale to żaden problem. Ciasteczka czy nagłowki da się uzupełniać, tak jak pokazałem w swoim artykule. Dla mnie używanie Synapse jest prostsze i bardziej intuicyjne. żeby nasz projekt był w pełni przenośny i każdy mógl sobie skompilowac, przerzucamy pare modułów do katalogu z projektem, a reszte robimy w sposób dynamiczny. Żadnego instalowania. Tutaj Indy perfekcyjnie ogarnia chyba tylko @kAzek. Jeżeli wolisz Indy to Cię nie przekonam. Dla mnie po prostu lepsze i wygodniejsze, bardziej opanowane. Obsługa SSL jest w obu pakietach, z tego co wiem. Zresztą podałem Ci link do artykułu, to trzeba było przeczytać, wszystko byś wiedział z podstawowych informacji o obsłudze protokołu HTTP. A co do wysyłania obrazków na elektrodę, to spróbuj tą funkcją albo po prostu zobacz pod snifferem czy debguerrem HTTP co jest wysyłane przez prawdziwą przeglądarkę www, kiedy wysyłasz tam plik. I później postaraj się wysłać to samo lub najbardziej jak się da, zbliżone do tego. A i nie rozumiem też, dlaczego martwiłeś się że useragent jest na coś ustawiony - na przykład Flash. Pod Synapse bez problemów ustawisz sobie dowolny UserAgent.
Potwierdzam, śmiga na synapse, z ciekawości chciałem przerobić na indy 9, ale
nie wychodzi mi... czy T49 może pokazać jak zrobił to na indy?
Jangcy napisał(a):
Potwierdzam, śmiga na synapse, z ciekawości chciałem przerobić na indy 9, ale
nie wychodzi mi... czy T49 może pokazać jak zrobił to na indy?
do uses dodaj: IdMultipartFormData
var
SRC: TIdMultiPartFormDataStream;
begin
SRC := TIdMultiPartFormDataStream.Create;
SRC.AddFile('Filedata', sciezka);
IdHTTP1.Post(STRONA, SRC); //możesz dać Memo1.Text := idHttp1.... itd by wynik kodu strony w memo był
SRC.Free;
end;
a i pamiętaj o
IdHTTP1.Request.ContentType := 'multipart/form-data'; //choć możesz to ręcznie wklepać w komponencie
Mniej więcej tak. Jakby coś było źle, daj znać, sprawdzę.