Online-Abfrage von Bahn-Verbindung

Werden von der Seite evtl. Cookies gesetzt, die Du beim Request wieder mitschicken musst?

Cookies sind vollkommen egal

Hier hast du ein Beispiel mit zwischemgeschalteten Linux und curl direktive: TrollMaker.com is for sale | HugeDomains

Das Funktionsprinzip ist bei beiden Anwendungen etwa identisch, es müssen POST Variablen transportiert werden, die normalerweise der Server auf der Gegenseite erledigt.

Cookies sind nicht zwingend egal. Es mag durchaus sein, das in diesem Fall Cookies keine Rolle spielen, aber das kann man nicht verallgemeinern. Wird ein Cookie als Session-Cookie verwendet, z.b. um SPAM-Anfragen zu verhindern, dann spielt das schon ein Rolle.

Unabhängig davon habe ich mit telnet mal ein wenig gespielt und siehe da, es muss nicht zwingend POST sein :slight_smile:

Du kannst Deine Parameter auch einfach per GET an den Request-String anhängen. Was ich allerdings gemacht habe ist die "&" in einfache "&" zu ändern, so wie es das Protokoll vorsieht. Vor allem sieht man, das Du den Request auf das GET und den "Host" Parameter eindampfen kannst. Das spart wieder Speicher für Dein Programm, weil Du die ganzen Strings wie Useragent etc. nicht mehr brauchst. Auch der LD-Parameter ist nicht notwendig, Du kannst direkt mit dem "GET /bin/trainsearch.exe/dox?date=10.02.12&productClassFilter=1&trainname=874&stationFilter=80&start=Suchen HTTP/1.1" die Abfrage lostreten.
Siehe hier:

telnet reiseauskunft.bahn.de 80
Trying 81.200.198.90...
Connected to reiseauskunft.bahn.de.
Escape character is '^]'.
GET /bin/trainsearch.exe/dox?date=10.02.12&productClassFilter=1&trainname=874&stationFilter=80&start=Suchen HTTP/1.1
Host: reiseauskunft.bahn.de

HTTP/1.1 200 OK
Date: Fri, 10 Feb 2012 08:52:47 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: text/html; charset=ISO-8859-1

e35

<?xml version="1.0" encoding="ISO-8859-1"?> Deutsche Bahn -

Fahrtinformationen

ICE 874 (Zuglauf vom: 10.02.12)
an ab Halt Aktuelles
09:52   aktuelle Zeit
09:58

10:00

(+0)

(+0)

Braunschweig Hbf
10:16

10:18

(+0)

(+0)

Wolfsburg Hbf
11:11

 

(+0)

 

Berlin-Spandau
11:25

 

(+0)

 

Berlin Hbf
11:37

 

(+0)

 

Berlin Ostbahnhof

![|5x5](upload://nA1aBgycMKWgfd8vPKBMeO82JAQ.gif)

0

Connection closed by foreign host.

Vielen Dank für eure Mühe! Ich bin krank zu hause und werde heute mittag ausgiebig Gelegenheit haben, mich damit zu befassen.

Cookies hab ich im Browser mal gesperrt, die Abfrage funktioniert trotzdem, daran kann es also nicht liegen.

Was mir nicht so klar ist: Wenn ich die Anfrage mit dem Firefox oder sonst einem Browser machen kann, warum kann ich sie dann nicht mit dem Arduino machen, der letztendlich genauso mit dem Server kommunizieren kann? Ich vermute, die Antwort steckt in diesen Sätzen:

"Was du tun musst ist das Formular zu spammen, sozusagen, das heisst den Inhalt der POST Variablen zu injizieren, es wird ja da die Zugnummer und der Select erwartet.
Ich befürchte, dass das ohne weiteren Server nicht funktioniert und wenn da bei der Bahn irgendwer für Sicherheit der Server zuständig ist, wird er das unterbinden."

Das ist mir nicht so ganz klar. Bei meiner Anfrage übergebe ich doch die POST-Daten?

Naja aber wahrscheinlich funktioniert es ja mit der GET-Methode wie mkl0815 schrieb :slight_smile:

Ich habe mir das mal angeschaut und würde aus meinen bescheidenen Kentnissen folgendes feststellen.
Das Formular ist im prinzip ja eine mischung aus post und get!

Als ziel für das Formular steht ja eine URL drinne die GET-Variablen enthält.
Diese sind aber fix.
Diese ID ist anscheind immer gleich. Weil bei mir steht das selbe.
Du mußt also dein Formular an diese Adresse senden:

http://reiseauskunft.bahn.de/bin/trainsearch.exe/dox?ld=9642&amp;rt=1&amp;use_realtime_filter=1&amp;OK

Und dabei die POST-Variablen mit senden.

<select class="sqproduct nofullwidth" name="date" id="date">
<option value="10.02.12" >heute</option>
<option value="11.02.12" >morgen</option>
</select>

Für das Datum.
z.b. date=10.01.12

<select class="sqproduct nofullwidth" name="productClassFilter" id="productClassFilter">
<option value="1" >ICE</option>
<option value="2" >IC/EC</option>
<option value="4" >IR/D</option>
<option value="8" >RE/RB</option>
</select>

Für die Zugart
z.b. productClassFilter=1

<input class="text" type="text" name="trainname" id="trainname" value="" />

Die Zugnummer:
z.b. trainname=08154711

<input type="hidden" name="stationFilter" value="80" />

Der scheint auch fix zu sein
stationFilter=80

<input type="submit" class="hauptbtn" name="start" value="Suchen" />

Der Submit-Button
start=Suchen

Wie man beim Arduino POST-Werte setzt weiß ich nicht.
Aber so sollte es gehen
Danach bekommst du ja eine Antwort.
wie die dann aussieht schauen wir dann....

POST Variablen lassen sich nicht "setzen", GET natürlich schon, aber die alleine lassen garnichts zu.

Ist doch aber auch klar: So lange ich einen Client simmuliere muss ich auch mit jedem anderen Client (=Browser) in der Lage sein das nachzumachen.

Und so lässt sich relativ einfach feststellen, dass der eingeschlagene Weg (ohne weitere Unterstützung) ein Holzweg ist.

Mindestens das cURL müsste als Befehl in der Arduino Umgebung funktionieren, was es aber allem Anschein nach nicht tut.

  1. Ich würde sowas grundsätzlich nicht per Arduino machen
  2. Wenn ich sowas machen würde, dann würde ich alle Requests immer durch einen Debugproxy (z.B. Fiddler2) schieben. Das erleichtert die Fehlersuche ganz ungemein.

df6ih:
POST Variablen lassen sich nicht "setzen", GET natürlich schon, aber die alleine lassen garnichts zu.

Ist doch aber auch klar: So lange ich einen Client simmuliere muss ich auch mit jedem anderen Client (=Browser) in der Lage sein das nachzumachen.

Und so lässt sich relativ einfach feststellen, dass der eingeschlagene Weg (ohne weitere Unterstützung) ein Holzweg ist.

Mindestens das cURL müsste als Befehl in der Arduino Umgebung funktionieren, was es aber allem Anschein nach nicht tut.

Sorry, aber ich verstehe leider überhaupt nicht was Du mit diesen Sätzen sagen willst. Die POST Daten hat der o.p. ja in seinem Request den er absetzt drin.

clientBahn.println("date=10.02.12&productClassFilter=1&trainname=874&stationFilter=80&start=Suchen");

Was meinst Du mit

Und so lässt sich relativ einfach feststellen, dass der eingeschlagene Weg (ohne weitere Unterstützung) ein Holzweg ist.

Und wie kommst Du von simulierten Clients (Browser) zu dieser Schlussfolgerung?
Und welcher Befehl soll "cURL" sein?
Ich gebe es zu, aber ich bin verwirrt....

Das gibt es fertig zu lesen:

Unterschiede der Methoden GET / POST

Die geposteten Variablen werden innerhalb der Übertragung des Servers tranportiert, da kann man erst mal nicht eingreifen. Was du im Link zeigst sind GET Variablen, die kann man sehr wohl beeinflussen, dummerweise handelt es sich im vorliegenden Fall aber um beides.

Hinzu kommen alle möglichen Sicherheitsabfragen der Server neuerer Bauart ( sprich Betriebssysteme und deren Kompilate) die nach Spam Methoden suchen, eben genau die, die es im erfolgreichen Nutzungsfalle brauchen würde.

Also, wie GET und POST funktioniert, weiß ich schon seit einiger Zeit. Vielen Dank für die Belehrung.

Die geposteten Variablen werden innerhalb der Übertragung des Servers tranportiert, da kann man erst mal nicht eingreifen. Was du im Link zeigst sind GET Variablen, die kann man sehr wohl beeinflussen, dummerweise handelt es sich im vorliegenden Fall aber um beides.

Was meinst Du hier mit "eingreifen"? Wie bereits zweimal im Thread erwähnt, werden die POST Daten mit dem HTTP-Request vom Arduino mitgeschickt. Die entsprechende Zeile hatte ich im übrigen nocheinmal explizit gepostet. Meine Lösung verwendet tatsächlich nur GET Parameter, was ja offensichtlich auch zu funktionieren scheint. Dabei ging es mir vor allem darum, das diese Lösung Speicher- und Programmtechnisch deutlich einfacher und effektiver ist. Das sollte aber nicht bedeuten, das POST nicht funktionieren kann, was Du offensichtlich zu glauben scheinst.

Hinzu kommen alle möglichen Sicherheitsabfragen der Server neuerer Bauart ( sprich Betriebssysteme und deren Kompilate) die nach Spam Methoden suchen, eben genau die, die es im erfolgreichen Nutzungsfalle brauchen würde.

Auch hier verstehe ich leider wieder nicht ganz, was Du damit sagen willst. Was hat bitte der Server (gemeint ist die Maschine, das Blech, nicht das Webserver-Programm) und das Betriebssystem mit dem Web-Request zu tun. Von welchen Sicherheitsabfragen redest Du konkret?
Arduio und der Webserver (gemeint ist das Programm und nicht der Computer) der Bahn reden ja schon miteinander. Diese Strecke der Kommunikation können wir also bei der Analyse erstmal vernachlässigen. Nun würde es ehr darum gehen, zu schauen ob die vom Arduino erzeugten HTTP-Requests RFC-konform sind und daher vom Webserver (Programm nicht Computer) korrekt verarbeitet werden können. Hier ist der Vorschlag von Udo das ganze zum Testen über einen Proxy laufen zu lassen schon mal nicht schlecht.
Da hier ein gewisser Aufwand entsteht, sollten wir dauf das Fedback von "nachtaktiv68" warten, ob die reine GET-Methode klappt, oder ob wir weiter mit der POST Methode testen sollen.

Ja also ich habe das jetzt soweit implementiert - mit der GET-Methode funktioniert es einwandfrei, reproduzierbar und stabil. Wobei mich durchaus auch interessieren würde, warum es mit POST nicht funktionieren sollte, denn ein Browser wie Firefox oder Chrome kann es ja auch - warum sollte es dann ein Arduino nicht können, wenn man mal davon ausgeht, dass die Systemressourcen nicht das Problem sind?

Ich weiss was du meinst... du willst es doch ohne Tastatureingaben (automatisch) haben, oder ?

Ja, es läuft ohne Tastatureingaben ab!

Nochmal ... langsam zum mitdenken: Du kommst OHNE Tastatureingaben an den Punkt wo es den Standaort eines gerade in Fahrt befindlichen Zuges anzeigt ? Ich bin BAFF :drooling_face:

Sagen wir mal so - ich schicke einen GET-Request, und bekomme als Antwort den Zuglaufplan mit aktuellen Verspätungsdaten, genau das was ich brauche!

Mit Verspätung:

<tr>

<td class="arrival tqdetail">
16:56


16:58
</td>

<td class="tqdetail rt top">
<span class="bold red">(+10)</span>


<span class="bold red">(+10)</span>
</td>

<td class="station tqdetail top">
Mannheim Hbf


</td>

</tr>



Ohne Verspätung:

<tr>

<td class="arrival tqdetail">
18:41


18:43
</td>

<td class="tqdetail rt top">


</td>

<td class="station tqdetail top">
Koblenz Hbf


</td>

</tr>

Oha ! Das wundert mich. Bei der Bahn ist bekanntermaßen nichts unmöglich.

Hast du mal so einen Link mit seinen Paramtern ?

Mein Request sieht so aus:

GET /bin/trainsearch.exe/dox?date=11.02.12&productClassFilter=2&trainname=2311&stationFilter=80&start=Suchen HTTP/1.1
Host: reiseauskunft.bahn.de

Wird halt dynamisch in meinem Sketch erzeugt.

Ich bin hin und weg !

Das ist also rein über GET Parameter ansprechbar! Prima Sache !

im Browser: Deutsche Bahn: bahn.de - -

@df6ih: Wozu brauchst Du "Tastatureingaben"? Es ist doch wurscht woher die Daten der Parameter kommen. Da die Werte bekannt sind, werden die beim HTTP-Request in Richtung Webserver der Bahn übertragen. Egal ob per GET oder per POST, die Daten stecken immer in einem Request. Bei GET in der URL, genauer eigentlich URI und beim POST im Body des Request. Die Daten werden doch nicht einzeln übertragen, jedesmal, wenn Du im Formular etwas einträgst oder anklickst. Das geht zwar auch (per AJAX), wird aber im Bahnformular nicht verwendet und war auch nie Gegenstand der Diskussion.
Es gibt auch prinzipiell keinen Unterschied zwischen Deinem Browser und er Arduino-Software. Am Ende schickt ein Programm über eine TCP Verbindung auf Port 80 an die IP 81.200.198.90 einen größeren String, der dann von der Gegenstelle interpretiert wird. Die daraus resultierende Antwort schickt dann der Bahnserver wieder über die gleiche Verbindung zurück.
Spannend bleibt die Frage nach den POST Parametern allemal. Leider ist mein Arduino-Ethernet ziemlich tief in meiner Wetterstation vergraben, daher kann ich das zur Zeit nicht testen. Ich behalte das aber mal im Hinterkopf, denn so offene Fragen zu Sachen die eingentlich funktionieren müßten, mag ich auch nicht.