Autor Beitrag
OliverN_26
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Mi 22.02.12 20:21 
Hi Leute

vorab .. ich weiß ich bin hier heute völlig falsch, da ich in diesem Schritt nicht mit Delphi arbeite, aber ich weiß kein gutes Forum für meine Frage und ich weiß, dass hier ne Menge Cracks rum schwirren, die evt. eine Idee haben.

also ..

Mit Delphi empfange ich Daten, werte diese aus und sende sie an meine Datenbank, wo sie auf einer Internet-Seite angezeigt und weiter bearbeitet werden. Soweit so gut. Wir sind ein Subunternehmer eines großen, namhaften Unternehmens hier in Deutschland. Die Bearbeitung der Daten kann leider nicht nur in unserem System passieren, sondern muss ebenfalls in einer Webseite eingetragen werden, um an den "großen Partner" gesendet werden zu können. Dies ist natürlich doppelte Arbeit die ich mir gerne ersparen würde. Ich möchte also die Daten in meinem Internetformular bearbeiten und im Hintergrund sollen die "notwendigen" Daten an die fremde Internetseite geschickt werden. Ein weiteres Problem dabei ist, dass ich die Seite 3-5x bestätigen muß und Folgeseiten ebenfalls ausgefüllt werden müssen. Kann man so was simulieren?

Bevor die Diskussion aufkommt .. es ist nichts illegales und bewegt sich alles im Firmenumfang. Wenn ich den Namen sagen würde, würde sich auch die Frage erübrigen den Partner nach einer Datenbank-Schnittstelle zu fragen. Die kümmern sich da leider "0" drum.
Ich habe bei einem anderen Subunternehmer allerdings schon mitbekommen das dies möglich ist. "Angeblich" auf sehr einfach Weise (mit den Scripten rücken auch die nicht raus).

Mich würde schon mal weiter bringen wenn ich wüsste, mit welcher Sprache man so was bewerkstelligen kann. PHP kann ich mir wenig vorstellen, da es serverseitig arbeitet, aber, wenn ich im Internet suche, gerate ich immer wieder an "fsockopen()". Bin ich da auf dem richtigen Weg? Hat jemand mit so was Erfahrungen und kann mich in die richtige Richtung rollen oder mir ein paar Tips geben?

Weiß da grad echt keinen Rat mehr .. hoffe, auch wenns grad nich Delphi ist kann mir jemand helfen.

1000 Dank im voraus

lg
Oli
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 22.02.12 23:43 
Moin!

user profile iconOliverN_26 hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte also die Daten in meinem Internetformular bearbeiten und im Hintergrund sollen die "notwendigen" Daten an die fremde Internetseite geschickt werden. Ein weiteres Problem dabei ist, dass ich die Seite 3-5x bestätigen muß und Folgeseiten ebenfalls ausgefüllt werden müssen. Kann man so was simulieren?
Ja klar kann man das. Wenn kein Javascript drin ist, geht das relativ simpel mit IdHTTP von den Indies, bei Javascript-Klamotten kann man das mit einem TWebbrowser probieren und dann über die COM-API darauf zugreifen (etwas hakelig, braucht Erfahrung). :idea:

user profile iconOliverN_26 hat folgendes geschrieben Zum zitierten Posting springen:
wenn ich im Internet suche, gerate ich immer wieder an "fsockopen()". Bin ich da auf dem richtigen Weg?
Pauschal würde ich sagen: nein, das wird nix. Damit öffnest du lediglich einen Socket (also theoretisch kann man das schon an der Stelle tatsächlich umsetzen, aber das wird sich keiner antun, den ganzen Protokoll-Layer selbst da oben drauf zu setzen).

Und die haben wirklich keinen Webservice für die Datenübermittlung? So wie du das beschreibst, ist das Formular (oder besser die Formularkaskade) eher für menschliche Benutzung vorgesehen... :? Mit z.B. einem Webservice wäre das erheblich viel einfacher!

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 23.02.12 08:17 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Und die haben wirklich keinen Webservice für die Datenübermittlung? So wie du das beschreibst, ist das Formular (oder besser die Formularkaskade) eher für menschliche Benutzung vorgesehen... :? Mit z.B. einem Webservice wäre das erheblich viel einfacher!


Leider nicht ganz unüblich. Das Problem ist, dass die "Großen" oft in einer Position sind, wo sie einfach bestimmen können. Das heißt dann, sie sagen "ihr müsst die Daten in dem Webformular eintragen. Fertig. Wenn euch das zu viel Arbeit ist, stellt halt noch einen Mann dafür ein.". Und aus Sicht des Datenempfängers besteht ja auch keine Notwendigkeit, eine definierte Schnittstelle zur Verfügung zu stellen. Der Partner kann die Daten ja im Formular eintragen. Da wäre es nur Mehraufwand, eine Schnittstelle zu entwickelt und zu pflegen.
Aus den Gründen muss ich auch an einigen Stellen Webformulare füttern. Wie schon gesagt: IdHttp.

Für POST sieht das dann prinzipiell so aus:
ausblenden Delphi-Quelltext
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:
procedure TBlaBla.DoLogin(AUsername, APassword: String);
var
  PostData : TStringList;
  ResultStream : TStringStream;
const
  ANMELDENAME = 'anmeldename';
  PASSWORT = 'password';
  URI = 'http://.../index.php';
begin

  PostData := nil;
  ResultStream := nil;
  try
    PostData := TStringList.Create;
    ResultStream := TStringStream.Create('', SysUtils.TEncoding.GetEncoding(1252));

    PostData.Values[ANMELDENAME] := AUsername;
    PostData.Values[PASSWORT] := APassword;
    PostData.Values['site'] := 'login';

    FHttp.Post(URI, PostData, ResultStream);
    ParseLoginResult(ResultStream);

  finally
    PostData.Free;
    ResultStream.Free;
  end;

end;


FHttp wird hier an einer anderen Stelle erzeugt. Das musst Du also noch machen, oder halt auf die Form klatschen.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 23.02.12 08:28 
Und da es um mehrere Seiten geht, die der Reihe nach angesteuert werden müssen, könnte es notwendig sein auch einen Cookiemanager in TIdHttp einzubinden. Es kann aber auch sein, dass es IDs in der generierten Seite gibt, die du als Session-ID wieder mitschicken musst oder Ähnliches.

Falls es notwendig wird, könntest du mit Chrome, Opera oder IE 7+ und dessen integrierten Debugger (oder mit einem Browserplugin, wenn du den Firefox nutzen möchtest) nachschauen was da bei den Aufrufen so alles an Daten hin- und hergesendet werden.
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Do 23.02.12 11:27 
Hi und schon mal danke für die Rückantworten.

An 1 Stelle haben wir uns glaub ich Missverstanden. Die Abwicklung mit Delphi ist durch und die Daten werden "nur" noch im Web-Bereich bearbeitet und ausgewertet. Das heisst die übermittlung der Daten wird nicht mit Delphi geschehen. Ich weiß nur nicht ob man so was was mit Javascript/PHP/CGI (oder sonst was) hinbekommt?!

Um das mit Delphi zu realisieren wäre es notwendig eine Tabelle in die Datenbank zu legen, in der die Daten, die für die anzusteuernde Seite wichtig sind, gespeichert werden müssen. Das Delphi Tool prüft dann einfach in regelmäßigen Abständen diese Tabelle und wenn Daten da sind werden sie abgeschickt. Wäre sicher auch ne Lösung, aber mit diesem Problem steh ich ziemlich am Anfang und bevor ich mir jetzt die Tage um die Ohren schlage, würd ich gern das ein oder andere abwägen um wirklich mit der optimalsten Lösung an den Start zu gehen.

Die Sache mit dem Webservice schau ich mir mal an. Angeboten bekommen wir das nicht. Wie "Nersgatt" das schon sagte interessiert die das recht wenig. Es existiert eine Internetseite wo wir die erforderlichen Daten einzutragen haben und fertig. Nur das hat absolut nichts mit einer internen Auftragsabwicklung zu tun und schon muß man alles doppelt machen. Bei unserer Auftragsmenge ist die ganze "sinnlose" Mehrarbeit einfach nich mehr machbar.

lg
Oli

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Die TWebBrowser Komponente ist schon mal ein guter Anfang, da ich die Formularfelder schon mal mit meinen Daten füllen kann. Glaub damit bin ich auch dem richtigen Weg. Problem was ich jetzt habe ist beim Senden des Formulares im Internet per "action" ein Link mit einer Session ID übergeben wird. Wie kann kann ich bei der Komponente mit "submit" Werte übergeben?
Mein jetziger Testversuch:

ausblenden Delphi-Quelltext
1:
2:
3:
WebBrowser1.OleObject.document.forms.item(0).elements.item('feld1').value := '22222';
WebBrowser1.OleObject.document.forms.item(0).elements.item('feld2').value := '36240';
WebBrowser1.OleObject.document.forms.item(0).submit;


danke
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 23.02.12 19:17 
Solange es keine dynamischen Inhalte auf der Seite geht, sollte TWebBrowser aber gar nicht notwendig und nur unnötiger Aufwand sein.

Wenn die Session ID in dem selben Formular steht, sollte diese auch im TWebBrowser mit übergeben werden. Was da genau passiert, könntest du mit Wireshark mit dem Original vergleichen.
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Fr 24.02.12 12:14 
Also ich sag mal so .. wenn es denn funktioniert mach ich mir diesen "einmaligen" unnötigen Aufwand sehr gerne :-)
Was wäre denn die Alternative?

Ich hab mal ein bisschen gelesen und probiert, aber .

1. Wenn ich den Button in der TWebBrows-Komponente drücke gehts. Mach ich es mit WebBrowser1.OleObject.document.forms.item(0).submit; passiert zwar was aber anscheinend nicht richtig, denn ich gelange nicht auf die Folgeseite. Was an dem Action-Attribut liegen könnte ?!

2. Ein Auszug aus dem Quelltext der Form sieht wie folgt aus:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
<form id="orderDetails" method="post" action="/MWIA/fc.htm?_flowExecutionKey=_cA3DFCCBC-C30A-42C9-F2EA-E6D91FC94F6E_k4BBC10C6-C9F1-965E-1527-DCF683533B51"><br>
   <label for="techId">Techniker Nummer</label><br/>
   <input id="techId" name="techId" style="-wap-input-format: '5N'; -wap-input-required: true;" type="text" value="" maxlength="5"/><br><br/>
   
   <label for="woId">Auftragsnummer</label><br/>
   <input id="woId" name="woId" style="-wap-input-format: '6N'; -wap-input-required: true;" type="text" value="" maxlength="6"/><br/><br/>
   
   <input type="submit" class="button" name="_eventId_login" value="Bestätigen"/><br/><br/>
</form>


3. könnte ich rein theoretisch den Link mit Indy-HTTP und POST einfach so versenden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
sl := TStringlist.Create;
sl.Add('techId=12345');
sl.Add('woId=59478');

IdHTTP1.Post('http://' + Hostname + '/MWIA/fc.htm?_flowExecutionKey=_cA3DFCCBC-C30A-42C9-F2EA-E6D91FC94F6E_k4BBC10C6-C9F1-965E-1527-DCF683533B51',sl);


Danke

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Mit WebBrowser1.OleObject.document.forms.item(0).elements.item(2).click; funktioniert es so wie ich es will und ich würde alles so hinbekommen wie ich es gerne hätte. Das ist schon mal traumhaft .. aaaaber .. mich interessiert trotzdem die eventuelle Alternative, die jaenicke angesprochen hat. Es sollte nicht zu kompliziert sein. Welche generellen Nachteile zieht es mit sich wenn ich es mit der Webbrowser Komponente mache?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 24.02.12 12:43 
user profile iconOliverN_26 hat folgendes geschrieben Zum zitierten Posting springen:
Welche generellen Nachteile zieht es mit sich wenn ich es mit der Webbrowser Komponente mache?
  • langsamer
  • Du missbrauchst eine visuelle Komponente, obwohl nichts dargestellt werden soll
  • Sicherheitsoptionen des Internet Explorer wirken sich aus
  • Fehler sind schwerer zu finden
  • ...
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Fr 24.02.12 12:52 
Wie sieht die Alternative aus ?
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 24.02.12 12:56 
TIdHttp

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Fr 24.02.12 13:24 
OK .. und wie könnte so was aussehen?
Bei folgendem Code bekomm ich ständig die Meldung "http/1.1 500 Internal Server Error":
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button3Click(Sender: TObject);
var
  sl : TStringList;
  session_id : String;
begin
  session_id := copy(Webbrowser1.LocationURL,pos('?',Webbrowser1.LocationURL),Length(Webbrowser1.LocationURL));

  sl := TStringlist.Create;
  sl.Add('techId=22222');
  sl.Add('woId=59478');

  IdHTTP1.Post('http://pfad/MWIA/fc.htm' + session_id, sl);

  sl.Free;
end;


So ganz versteh ich das auch noch nicht. Mir leuchtet ein dass ich so die Daten an den Server übermittel. Aber ich muß ja auch das "klicken" simulieren da ich mich noch um 5 weitere Folgeseiten kümmern muß. Auf die muß ich ja auch gelangen ?!

Hilfe :-(
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 24.02.12 13:46 
Ich vermute, dass das daran liegt, dass Du die Session-ID noch mit dem TWebbrowser ausliest. Du solltest Dich für eine Sache entscheiden.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Fr 24.02.12 13:54 
OK .. das stimmt .. das könnte sein .. aber selbst wenn ich das jetzt änder .. wie gelange ich auf die Folgeseite, damit ich diese ebenso auswerten und senden kann?
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 24.02.12 14:05 
Du musst nicht nur die URL aufrufen, sondern auch auswerten, was der Server zurückliefert. (Siehe oben Beitrag von mir, ResultStream). Und dann schickst Du halt per Post die Daten ab, die der Server auf der 2. Seite erwartet.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 24.02.12 14:43 
Wie gesagt:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Falls es notwendig wird, könntest du mit Chrome, Opera oder IE 7+ und dessen integrierten Debugger (oder mit einem Browserplugin, wenn du den Firefox nutzen möchtest) nachschauen was da bei den Aufrufen so alles an Daten hin- und hergesendet werden.
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Fr 24.02.12 15:33 
Ich bekomme an der folgenden Stelle immer den Fehler: "Zu viele Parameter"
ausblenden Delphi-Quelltext
1:
ResultStream := TStringStream.Create('', SysUtils.TEncoding.GetEncoding(1252));					
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 24.02.12 15:43 
Versuch mal so: ResultStream := TStringStream.Create();
Die Überladungen kamen vermutlich erst in späteren Delphiversionen.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Fr 24.02.12 15:46 
"Nicht genügend wirkliche Parameter"
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 24.02.12 15:54 
Dann stell mal den Cursor auf TStringStream und drück auf F1... :roll:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 24.02.12 16:05 
Früher hatte TStringStream einen Parameter. Da kannst du einen leeren String angeben, also sprich nur den zweiten Parameter weglassen.

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Dann stell mal den Cursor auf TStringStream und drück auf F1... :roll:
Full Ack...

Und davon abgesehen zeigt Delphi ja auch an welche Parameter erwartet werden, wenn man die Klammer auf schreibt. Und mit Strg + Shift + Leertaste ebenfalls.