| Autor |
Beitrag |
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 14.09.09 15:22
noo.bee hat folgendes geschrieben : | es scheint alles zu gehen. beim drücken des loginbuttons kommt keine fehlermeldung, mein Memo1 gibt mir den status 200 zurück - also ok  |
Ne, das kann man so nicht sagen. "200 OK" heißt nur, dass die aufgerufene Seite existiert - nicht, dass ein Login funktioniert hat. Irgendwie müsste man mit IdHTTP doch auch den eigentlichen Seitentext - also den HTML-Baum - auslesen können. Ich meine, es ist der Rückgabewert der Funktion Post.
noo.bee hat folgendes geschrieben : | Delphi-Quelltext 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| { ... } procedure TForm1.loginClick(Sender: TObject); begin begin StringList := TStringList.Create; try StringList.Values['yl_name'] := Edit1.Text; StringList.Values['yl_pw'] := Edit2.Text; finally StringList.Free; end; end;
httpMain.Post('http://mein.server.com/index.php?Modul=Login', StringList); memo1.Lines.Text := httpMain.ResponseText; end; | |
Na, du gibtst die StringList ja auch wieder frei, bevor du sie verwendest - was soll denn das? Hast du den Quelltext denn überhaupt ansatzweise verstanden? Vielleicht solltest du dir erstmal die Grundlagen von Objektorientierter Programmierung anschauen - insbesondere die Kapitel über das Erzeugen und Freigeben von Objekten?
noo.bee hat folgendes geschrieben : | Delphi-Quelltext |
Welche Komponente wird erstellt, welcher Code, der wo steht, wird ausgeführt und von wem?
noo.bee hat folgendes geschrieben : | 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| { ... } procedure TForm1.uploadClick(Sender: TObject); var MultiPartFormDataStream: TMsMultiPartFormDataStream; HttpServer, Response: String; begin
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
try httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFormField('EinAnderesFeld', [highligt]'dadum'[/highligt]); MultiPartFormDataStream.AddFile('meine_datei', 'C:\test.avi', '');
MultiPartFormDataStream.PrepareStreamForDispatch; MultiPartFormDataStream.Position := 0;
try
Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream);
except end; finally MultiPartFormDataStream.Free; end; end; | |
Die hervorgehobenen Stellen solltest du dir nochmal genauer anschauen.
Aber poste uns doch bitte einfach mal die URL, über die du die Datei im Browser normalerweise hochladen würdest, dann könnten wir dir weiterhelfen. Sonst musst du die Feldnamen selbst aus dem <form> auslesen.
Grüße,
Yogu
Zuletzt bearbeitet von Yogu am Mo 14.09.09 16:40, insgesamt 1-mal bearbeitet
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mo 14.09.09 16:18
sooo...
also den 3. quelltext den du zitiert hast habe ich von hier www.delphipraxis.net/topic98281.html , bin da auch noch nicht hinter alle zeilen gestiegen...
ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen. mit Post hab ich nichts gefunden
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 14.09.09 16:48
Könntest du vielleicht auch auf die anderen Aspekte eingehen, die ich angesprochen habe? Ich hab keine Lust, gegen eine Wand zu reden und doch keine Antwort zu bekommen.
Du brauchst auch nicht komplett alles zu verstehen, es genügt, wenn du die markieren Zeilen verstehst (die jetzt auch wirklich markiert sind  ). Und um dir helfen zu können, brauche ich
Yogu hat folgendes geschrieben : | | die URL, über die du die Datei im Browser normalerweise hochladen würdest |
noo.bee hat folgendes geschrieben : | | ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen. |
Das ist nur der Status, nicht aber das Ergebnis, in dem steht, ob die Anmeldung erfolgreich war. Auch im Falle eines Passworts wird "200 OK" zurück geliefert.
noo.bee hat folgendes geschrieben : | | mit Post hab ich nichts gefunden |
Entweder hast du mich nicht richtig verstanden, oder du hast den Quelltext aus der Delphi-Praxis nicht einmal durchgelesen. Post wird bereits verwendet, und zwar genau hier:
noo.bee hat folgendes geschrieben : | Delphi-Quelltext 84: 85:
| { ... } Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream); | |
Nach diesem Schema solltest du auch den Seiteninhalt der Anmeldeseite herausfinden 
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mo 14.09.09 17:30
sorry, werd sofort alle aspekte beantworten  will ja schließlich hilfe bekommen :p
| Zitat: | | die URL, über die du die Datei im Browser normalerweise hochladen würdest |
duckload.com
| Zitat: | | ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen. |
da habt ihr mich ja schon aufgeklärt, dass das nur den status der seite wiedergibt, nicht ob ler login funktioniert hat
| Zitat: | | Zitat: | | mit Post hab ich nichts gefunden | Entweder hast du mich nicht richtig verstanden, oder du hast den Quelltext aus der Delphi-Praxis nicht einmal durchgelesen. Post wird bereits verwendet, und zwar genau hier:
Delphi-Quelltext 1: 2: 3:
| 84: Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream); | |
doch hab ich verstanden. aber du meintest es könnte eine rückgabemöglichkeit über Post geben. und daraufhin hab ich geschrieben (oder versucht rüber zu bringen), da ich zu Post und Rückgabewert nichts gefunden habe
so, nun zum highliten:
1. 'EinAnderesFeld': da steht ja als comment
| Zitat: | ich soll ein formularfeld setzen, welches keine datei sein soll ? seit wann sind denn felder dateien ? oder raff ich hier was überhaupt nicht ? oder nennt mir mal ein feld, welches eine datei sein soll  |
2. 'meine_datei': ich weiß nicht genau, wohin du mich da lenken willst, ich sehe da nichts falsches oder denke ich in die verkehrte richtung
3. 'http://mein.server.com/index.html': da hätte wohl das hier stehen müssen 'http://duckload.com/index.php?Modul=Login'
wenn du die hoffnung noch nicht aufgegeben hast, hoffe ich auf antwort 
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 14.09.09 17:50
noo.bee hat folgendes geschrieben : | | Zitat: | | die URL, über die du die Datei im Browser normalerweise hochladen würdest | duckload.com |
Ach so, das geht ja sogar ohne Login  - Würde dir das auch reichen?
noo.bee hat folgendes geschrieben : | | Zitat: | | ich ab mir mit memo1.Lines.Text := httpMain.ResponseText den status wiedergeben lassen. | da habt ihr mich ja schon aufgeklärt, dass das nur den status der seite wiedergibt, nicht ob ler login funktioniert hat
| Zitat: | | Zitat: | | mit Post hab ich nichts gefunden | Entweder hast du mich nicht richtig verstanden, oder du hast den Quelltext aus der Delphi-Praxis nicht einmal durchgelesen. Post wird bereits verwendet, und zwar genau hier:
Delphi-Quelltext 1: 2: 3:
| 84: Response := httpMain.Post('http://mein.server.com/index.html', MultiPartFormDataStream); | |
doch hab ich verstanden. aber du meintest es könnte eine rückgabemöglichkeit über Post geben. und daraufhin hab ich geschrieben (oder versucht rüber zu bringen), da ich zu Post und Rückgabewert nichts gefunden habe |
Was willst du denn wo finden? Post ist doch eine Funktion, oder irre ich mich da? Dann hätte es der Verfasser des Quelltextes der Delphi-Praxis aber auch getan, denn dort wird der Rückgabewert von Post verwendet. Und die betroffene Stelle habe ich zitiert (und du eben wieder - und ich jetzt auch nochmal  ).
noo.bee hat folgendes geschrieben : | so, nun zum highliten:
1. 'EinAnderesFeld': da steht ja als comment
| Zitat: | ich soll ein formularfeld setzen, welches keine datei sein soll ? seit wann sind denn felder dateien ? oder raff ich hier was überhaupt nicht ? oder nennt mir mal ein feld, welches eine datei sein soll  |
|
Die Zeile 72 ('EinAnderesFeld') kannst du tatsächlich weglassen, hab ich gerade getestet.
noo.bee hat folgendes geschrieben : | | 2. 'meine_datei': ich weiß nicht genau, wohin du mich da lenken willst, ich sehe da nichts falsches oder denke ich in die verkehrte richtung |
'meine_datei' (Zeile 76) ersetzt du am besten durch 'file[0]', probier's aber auch mal mit 'file'. So heißt nämlich das Eingabefeld im Formular, das vom Typ "file" ist.
noo.bee hat folgendes geschrieben : | | 3. 'http://mein.server.com/index.html': da hätte wohl das hier stehen müssen 'http://duckload.com/index.php?Modul=Login' |
Rischtisch.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mo 14.09.09 18:38
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mo 14.09.09 22:33
die anmeldung müsste schon bleiben, auch wenn es theoretisch ohne gehen würde
so, also soweit sieht es nett aus. wenn ich versuche meine test.avi zu uppen, meldet firewall zugriff auf duckload.com...
aber die datei wird nicht hochgeladen. auf Form1 kann ich zwar für ne minute nich zugreifen (wäre auch die zeit, die der upload dauern würde), aber in der minute geschieht kein uplaod.
ich kann jetzt auch gar nicht genau sagen wo es hängt
der Rückgabewert von idhttp.post funzt zwar, zeigt mir aber immer den quelltext an, egal ob eingeloggt oder nicht bzw egal, ob ich mein.server.com oder mein.server.com/index.html oder mein.server.com/index.php?Modul=Login...
wie kann ich schauen woran es hängt oder wo es nicht weitergeht ?
EDIT: mit code lässt sich der fehler wohl einfacher finden
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| unit http.form1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, StdCtrls, FileCtrl, ComCtrls, MsMultiPartFormData; type TForm1 = class(TForm) Edit1: TEdit; login: TButton; httpMain: TIdHTTP; Edit2: TEdit; Memo1: TMemo; upload: TButton; procedure loginClick(Sender: TObject); procedure uploadClick(Sender: TObject); private public end;
var Form1: TForm1; StringList: TStringList; s: String; implementation
{$R *.dfm}
procedure TForm1.loginClick(Sender: TObject);
begin StringList := TStringList.Create; try StringList.Values['yl_name'] := Edit1.Text; StringList.Values['yl_pw'] := Edit2.Text; finally end; httpMain.Post('http://duckload.com/index.php?Modul=Login', StringList); memo1.Lines.Text := httpMain.Post('http://duckload.com/member/', StringList); end;
procedure TForm1.uploadClick(Sender: TObject); var MultiPartFormDataStream: TMsMultiPartFormDataStream; HttpServer, Response: String; begin
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
try httpMain.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile('file[0]', 'c:\test.avi', '');
MultiPartFormDataStream.PrepareStreamForDispatch; MultiPartFormDataStream.Position := 0;
try
Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);
except end;
finally MultiPartFormDataStream.Free; end;
end; end. |
--- Moderiert von Narses: Beiträge zusammengefasst---
vllt der falsche weg, aber hab mir mal ne statusbar eingebaut um zu sehen, ob die datei überhaupt gesendet wird. zeigt mir KB an und den fortschrittsbalken. es wird definitiv was geupped, aber ich befürchte, dass es nicht auf meinen account geht sondern in die pampa
also müsste ja irgendwas beim login doch nicht funktionieren
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Di 15.09.09 11:19
Wenn du die Datei an die Loginseite schickst gehts natürlich nicht...
Delphi-Quelltext 1:
| Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream); |
Außerdem brauchst du noch einen TIdCookieManager welchen du mit TIdHTTp verbinden musst (Eigenschaft CookieManager) damit der Login auch erhalten bleibt.
Aber wenn ich mir deinen Code so anschaue, insbesondere den oberen Teil, habe ich das Gefühl das du überhaupt nix verstanden hast. Z. B. hast du StringList.free auskommentiert was ein Speicherleck verursacht. Hättest die Anweisungen bei denen du die StringList brauchst doch einfach nur in den try-finally-Block schieben müsen. Guck mal hier: christian-stelzmann....s.php?name=crashkurs
Und natürlich enthält der Rückgabewert von .Post den Quelltext der Seite. Den musst du eben durchsuchen (parsen) z. B. nach einem bestimmten Satz (Login war erfolgreich), je nachdem was duckload dir nachdem Login eben anzeigt. Stichworte: Copy, Pos, PosEx, Delete
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Di 15.09.09 11:47
is das nicht die anmeldung ? httpMain.Post('http://duckload.com/index.php?Modul=Login', StringList);
und das nicht der upload ? Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream);
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Di 15.09.09 12:05
noo.bee hat folgendes geschrieben : | is das nicht die anmeldung ? httpMain.Post('http://duckload.com/index.php?Modul=Login', StringList);
und das nicht der upload ? Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream); |
Schau mal genau hin, du schickst sowohl den Login als auch die Datei an ein und die selbe Adresse.
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Di 15.09.09 12:40
die url zum upload Delphi-Quelltext 1:
| und das nicht der upload ? Response := httpMain.Post('http://duckload.com/index.php?Modul=Login', MultiPartFormDataStream); | war einfach die letzte adresse die ich versucht habe :/ ich hatte vorher auch andere urls getestet aber die gingen ebenfalls nicht
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Di 15.09.09 13:50
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Di 15.09.09 14:11
weitergeleitet werde ich auf duckload.com/index.php?Modul=Hauptseite, aber ich hab das vorher schon mit modul=hauptseite probiert und ging nicht... ok, dann liegt der fehler woanders, sicher beim anmelden/einloggen
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Di 15.09.09 14:14
noo.bee hat folgendes geschrieben : | | weitergeleitet werde ich auf duckload.com/index.php?Modul=Hauptseite, aber ich hab das vorher schon mit modul=hauptseite probiert und ging nicht... ok, dann liegt der fehler woanders, sicher beim anmelden/einloggen |
Hast du auch den TIdCookieManager verwendet wie ich oben beschrieben habe?
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Di 15.09.09 14:28
nein, cookie hab ich noch nicht eingebaut. ich weiß auch noch nicht wie des geht  und ich hab es erstmal ohne probiert - hätte ja klappen können 
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Di 15.09.09 14:45
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Di 15.09.09 15:35
oki, cookie hab ich gemacht. aber wie zuvor keine änderung 
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Di 15.09.09 15:58
Jetzt machen wir deinen Code mal etwas schöner und besser benutzbar:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function Login(AUserName, APassword, AURL: String):Boolean; var PostData: TStrings; Source: String; begin Result := False;
PostData := TStringList.Create; try PostData.Add('yl_name=' + AUserName); PostData.Add('yl_pw=' + APassword);
Source := IdHTTP1.Post(AURL, PostData);
Result := pos('Login war erfolgreich', Source) > 0; finally PostData.Free; end; end; |
Füg das mal im Code-Editor ein und ruf es mit
Delphi-Quelltext 1: 2: 3: 4:
| if Login('benutzername', 'passwort', 'http://duckload.com/index.php?Modul=Login') then ShowMessage('Login war erfolgreich') else ShowMessage('Login fehlgeschlagen'); |
z. B. per ButtonClick auf. Zuvor löscht du aber bitte die IdHTTP-Komponente von der Form und platzierst eine neue und machst keine Verändernung an den Eigenschaften (außer den Cookiemanager eintragen, der ist wichtig!!!)!
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Di 15.09.09 16:38
soll ich komplett erneuern ? also neues form, neuer button, neue idhttp und neuer cookie und dann dein code einfügen ?
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 15.09.09 16:41
noo.bee hat folgendes geschrieben : | | der Rückgabewert von idhttp.post funzt zwar, zeigt mir aber immer den quelltext an, egal ob eingeloggt oder nicht bzw egal, ob ich mein.server.com oder mein.server.com/index.html oder mein.server.com/index.php?Modul=Login... |
Ist ja schön, dass er dir einen Quelltext anzeigt, ist ja noch schöner, dass er das immer macht und ich find's ja wirklich klasse, dass das immmer so ist, auch wenn man nicht angemeldet wurde - die Frage ist doch: Was wird zurückggegeben? Dort müsste schwarz auf weiß stehen, ob der Login geklappt hat oder nicht. Ganz einfach.
|
|
|