HTML mit Parameterübergabe, Post

Anfängerfragen zum Programmieren mit PureBasic.
proggernewbie
Beiträge: 19
Registriert: 23.03.2017 11:05
Computerausstattung: Win7 64bit, PureBasic 5.61 64bit
Linux Mint 19.1 64bit, PureBasic 5.71 64bit
VM (WinXP 32bit, PureBasic 5.71)
Wohnort: Kreis RE

HTML mit Parameterübergabe, Post

Beitrag von proggernewbie »

Hallo,
wie sich einige sicherlich erinnern, hatte ich seinerzeit zum G20 Gipfel die Kommentierungen auf der Webseite von Anne Will mitgelsen und mir auf der Platte mit eurer Hilfe gespeichert.
Um mich nun weiter mit dem Download von Daten/Deteien aus dem Netz zu beschäftigen, habe ich versucht eine HTML-Seite mit einfachen Parametern abzurufen. Aber ich scheitere schon beim Verständnis, wie das ganze realisiert wird.

Wenn ich z.B. auf der Seite http://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?ld= eine Zugverbindung abfragen möchte, müsste ich eine Zugbezeichnung wie "RE 3285" oder "ALX84137" als Parameter an den Server der Bahn senden.
Wie kann ich jetzt von meinem PC eine Anfrage an den Server der Bahn senden, mit dem ich diesen Parameter übermittle? Habe dazu etwas mit POST gelesen, aber verstehe nicht, wie ich das ganze in ein Programm einbauen kann, bei dem ich mehrere Zugnummern nacheinander abfragen könnte.

Könnte mich jemand vielleicht in die Richtung schubsen, damit ich den Ablauf besser verstehe oder hätte eine kleine Empfehlung für mich?

Vielen Dank schon mal.

ps: den quelltext mit den POST Daten von Nic the Quick habe ich natürlich gefunden, verstehe aber nur Bahnhof.
http://www.purebasic.fr/german/viewtopi ... =8&t=29328
Inzwischen 61 Jahre alt.
Leider immer noch keine große Programmiererfahrung; nach Burn-Out vor fünf Jahren, starke Schwächen mit der Merkfähigkeit.
Körperlich und geistig schreitet der Verfall eben voran.
Trotzdem möchte ich versuchen etwas programmieren zu lernen und bin dankbar für jede Hilfe.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: HTML mit Parameterübergabe, Post

Beitrag von juergenkulow »

Code: Alles auswählen

; Fragt einen Zug der Bahn ab, zeigt die Antwort als Hex oder String-Ansicht und speichert die Antwrot als HTML-Datei.
EnableExplicit
InitNetwork()
Define Leerzeichen$="%20"
Define Zug$="ICE"+Leerzeichen$+"616"
Define *Speicher=ReceiveHTTPMemory("http://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?ld=15061&country=DEU&rt=1&trainname="+Zug$) 
ShowMemoryViewer(*Speicher,MemorySize(*Speicher)) ; Auf String-Ansicht UTF8 umstellen, unten links. 
Define Dateiname$=SaveFileRequester("Dateiname:","Zug.html","*.html",0)
Define Datei=CreateFile(#PB_Any,Dateiname$,#PB_UTF8)
If 0=Datei : MessageRequester("Fataler Fehler",Dateiname$+" konnte nicht geöffnet werden.") : End : EndIf 
WriteData(Datei,*Speicher,MemorySize(*Speicher))
; Aufräumen
CloseFile(Datei)
FreeMemory(*Speicher) 
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
proggernewbie
Beiträge: 19
Registriert: 23.03.2017 11:05
Computerausstattung: Win7 64bit, PureBasic 5.61 64bit
Linux Mint 19.1 64bit, PureBasic 5.71 64bit
VM (WinXP 32bit, PureBasic 5.71)
Wohnort: Kreis RE

Re: HTML mit Parameterübergabe, Post

Beitrag von proggernewbie »

Hallo,
das nenn ich mal eine gelungene Überraschung. Komme nicht immer dazu hier täglich hinein zu schauen, mit einem Quelltext hatte ich überhaupt nicht gerechnet. Vielen Dank dafür.
Aber mit bestimmten Zeilen komme ich nicht so ganz klar.
Mit der Anweisung

Code: Alles auswählen

Define *Speicher=ReceiveHTTPMemory("http://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?ld=15061&country=DEU&rt=1&trainname="+Zug$) 
wird offensichtlich die angeforderte Datei in den Speicher geladen, das kann ich noch nachvollziehen, aber die nächste Zeile

Code: Alles auswählen

ShowMemoryViewer(*Speicher,MemorySize(*Speicher)) ; Auf String-Ansicht UTF8 umstellen, unten links. 
verstehe ich nicht so recht. Ich sehe, dass auf den Speicher zugegriffen wird und eine Anzeige der Informationen im Speicher erfolgt. Nur könnte ich selbst eine solche "Konstruktion" nicht hinbekommen. Gibte es dazu vielleicht noch eine kleine Anleitung oder einen Tipp zum Nachlesen?
Danke vielmals für alle Hilfe.
Inzwischen 61 Jahre alt.
Leider immer noch keine große Programmiererfahrung; nach Burn-Out vor fünf Jahren, starke Schwächen mit der Merkfähigkeit.
Körperlich und geistig schreitet der Verfall eben voran.
Trotzdem möchte ich versuchen etwas programmieren zu lernen und bin dankbar für jede Hilfe.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: HTML mit Parameterübergabe, Post

Beitrag von juergenkulow »

Hallo proggernewbie,

hier einige hoffentlich hilfreiche Links:
https://www.purebasic.com/german/docume ... iewer.html
http://www.purebasic.com/german/documen ... ysize.html
http://www.purebasic.com/german/documen ... peeks.html um *Speicher in einen String$ zu kopieren: String$=PeekS(*Speicher,MemorySize(*Speicher),#PB_UTF8)
http://www.purebasic.com/german/documen ... tring.html
https://www.purebasic.com/german/docume ... g/mid.html

CGI leicht gemacht!
CGI-Beispiel-Programme
selfhtml html
Für lokale PureBasic Hilfe kann man mit dem Courser über den Befehl gehen und die F1-Taste drücken.

Im Internet Explorer kann man sich den Quelltext der Reiseauskunft ansehen, 348 Zeilen.
Mit Bearbeiten Suchen Input Weiter findet man dann: trainname, stationname, date, time
In der Antwort der Reiseauskunft würde ich nach ICE suchen.

Viel Spaß beim programmieren, denken, testen und hartneckingen probieren.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: HTML mit Parameterübergabe, Post

Beitrag von juergenkulow »

Nachtrag:
Define Laenge=MemorySize(*Speicher)
ShowMemoryViewer(*Speicher,Laenge)
ist fast das gleiche wie
ShowMemoryViewer(*Speicher,MemorySize(*Speicher))
.
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: HTML mit Parameterübergabe, Post

Beitrag von helpy »

Die API von bahn.de für den Fernverkehr:

==> http://data.deutschebahn.com/dataset/api-fahrplan
Windows 10
PB Last Final / (Sometimes testing Beta versions)
proggernewbie
Beiträge: 19
Registriert: 23.03.2017 11:05
Computerausstattung: Win7 64bit, PureBasic 5.61 64bit
Linux Mint 19.1 64bit, PureBasic 5.71 64bit
VM (WinXP 32bit, PureBasic 5.71)
Wohnort: Kreis RE

Re: HTML mit Parameterübergabe, Post

Beitrag von proggernewbie »

Danke vielmals für den umfassenden Input.

Nur zum Verständnis noch eine weitere Nachfrage:
angenommen, ich wollte mehrere Züge abfragen, deren Zugnummern mir bekannt sind. Diese würde ich dann aus einer Datei auslesen und in den "Suchstring" der URL statt des Strings "616" schreiben. Dabei ist die Übergabe als String keinerlei Problem, sondern ich müsste es nur hinbekommen, diese Werte aus der Datei auszulesen.
Bei einer Folge von Zugnummern, die ich hochzählen wollte, müsste ich jedoch die Zahl in einen String umwandeln, um sie an die URL anhängen zu können.
Ist meine Annahme richtig?
Dann würde aus

Code: Alles auswählen

InitNetwork()
for i.l = 1 To 10
Define Leerzeichen$="%20"
Define ZugNr$="616"+ValToStr(i)
Define Zug$="ICE"+Leerzeichen$+ZugNr
Define *Speicher=ReceiveHTTPMemory("http://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?ld=15061&country=DEU&rt=1&trainname="+Zug$)
ShowMemoryViewer(*Speicher,MemorySize(*Speicher)) ; Auf String-Ansicht UTF8 umstellen, unten links.
Next i
Define Dateiname$=SaveFileRequester("Dateiname:","Zug.html","*.html",0)
Define Datei=CreateFile(#PB_Any,Dateiname$,#PB_UTF8)
If 0=Datei : MessageRequester("Fataler Fehler",Dateiname$+" konnte nicht geöffnet werden.") : End : EndIf
WriteData(Datei,*Speicher,MemorySize(*Speicher))
; Aufräumen
CloseFile(Datei)
FreeMemory(*Speicher) 
Wäre das dann so richtig, wobei in diesem Fall aus der Zahl 616 die Zahlen 6161, dann 6162, dann 6163 usw bis 61610 würde?
Inzwischen 61 Jahre alt.
Leider immer noch keine große Programmiererfahrung; nach Burn-Out vor fünf Jahren, starke Schwächen mit der Merkfähigkeit.
Körperlich und geistig schreitet der Verfall eben voran.
Trotzdem möchte ich versuchen etwas programmieren zu lernen und bin dankbar für jede Hilfe.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: HTML mit Parameterübergabe, Post

Beitrag von juergenkulow »

Hallo proggernewbie,

Code: Alles auswählen

EnableExplicit
Define i.l
For i=1 To 10 
  Define Zugnr$="616"+Str(i) ; Siehe Hilfe, Allgemeine Libraries und dann String und Str.
  Debug Zugnr$
Next 

; 6161
; 6162
; 6163
; 6164
; 6165
; 6166
; 6167
; 6168
; 6169
; 61610

Code: Alles auswählen

EnableExplicit
InitNetwork()
Define Zug$=""
Define Daten_vorhanden=#True ; #True steht für wahr und hat den Wert 1.
While Daten_vorhanden        ; Solange Daten vorhanden sind, führe wiederholend die Befehle bis Wend aus.
  Read.s Zug$                ; Lese den Zug aus der DataSection.
  If Zug$="Ende"              ; Wenn der Zug Ende heißt, dann führe die Befehle bis Endif aus. 
    Daten_vorhanden=#False    ; #False steht für falsch und hat den Wert 0. 
  EndIf 
  If Not(Zug$="Ende") ; Wenn der Zug nicht "Ende" heißt dann führe die Befehle bis Endif aus.
    Debug "Zug$:"+Zug$ 
    Zug$=ReplaceString(Zug$," ","%20") ; Leerzeichen wird durch "%20" ersetzt. 
                                       ; Da die Reiseauskunft " " nicht versteht.
    Debug "Zug$:"+Zug$ 
    Define *Speicher=ReceiveHTTPMemory("http://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?ld=15061&country=DEU&rt=1&trainname="+Zug$)
    ShowMemoryViewer(*Speicher,MemorySize(*Speicher)) 
    MessageRequester("Meldung","Zum fortsetzen bitte OK drücken.")
  EndIf 
Wend
End 
  
DataSection
  Data.s "ICE 616"
  Data.s "IC 2320"
  Data.s "ICE 824"
  Data.s "RE 11217"
  Data.s "IC 2795" ; Achtung fährt nicht täglich, 27. Nov 2017  
  Data.s "ERB89972"
  Data.s "Ende"
EndDataSection

; Mit F9 kann man Haltepunkte setzen z. B. bei while. Nach dem Start stop das Programm am Haltepunkt 
; und kann mit wiederholten Tasten F8 schrittweise fortgesetzt werden. 

; Zug$:ICE 616
; Zug$:ICE%20616
; Zug$:IC 2320
; Zug$:IC%202320
; Zug$:ICE 824
; Zug$:ICE%20824
; Zug$:RE 11217
; Zug$:RE%2011217
; Zug$:IC 2795
; Zug$:IC%202795
; Zug$:ERB89972
; Zug$:ERB89972
Datei: Zug.txt

Code: Alles auswählen

ICE 616
IC 2320
ICE 824
RE 11217
IC 2795
ERB89972

Code: Alles auswählen

EnableExplicit
InitNetwork()
Define Daten_vorhanden=#True ; #True steht für wahr und hat den Wert 1.
Define ZugDatei=OpenFile(#PB_Any,"Zug.txt") ; Öffne Datei Zug.txt. 
       ; In der Hilfe stehen die Dateifunktionen unter Allgemeine Libraries, File .
If 0=ZugDatei ; Wenn OpenFile eine 0 zurückgegeben hat. 
  Daten_vorhanden=#False ; Sind keine Daten vorhanden. 
  MessageRequester("Fataler Fehler","Datei Zug.txt konnte nicht geöffnet werden.")
EndIf 
Define Zug$=""
While Daten_vorhanden        ; Solange Daten vorhanden sind, führe wiederholend die Befehle bis Wend aus.
  Zug$=ReadString(ZugDatei)  ; Lese einen String aus der ZugDatei. Hilfe wieder unter File.
  If Eof(ZugDatei)            ; Ist das Ende der ZugDatei erreicht? Hilfe wieder unter File.
    Daten_vorhanden=#False    ; Wenn ja, setzte Daten_vorhanden auf falsch. 
  EndIf 
  Debug "Zug$:"+Zug$ 
  Zug$=ReplaceString(Zug$," ","%20") ; Leerzeichen wird durch "%20" ersetzt. 
                                     ; Da die Reiseauskunft " " nicht versteht.
  Define *Speicher=ReceiveHTTPMemory("http://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?ld=15061&country=DEU&rt=1&trainname="+Zug$)
  ShowMemoryViewer(*Speicher,MemorySize(*Speicher)) 
  MessageRequester("Meldung","Zum fortsetzen bitte OK drücken.")
  FreeMemory(*Speicher)
Wend
; Aufräumen
CloseFile(ZugDatei) ;Hilfe wieder unter File.
End 
  
; Zug$:ICE 616
; Zug$:IC 2320
; Zug$:ICE 824
; Zug$:RE 11217
; Zug$:IC 2795
; Zug$:ERB89972
proggernewbie
Beiträge: 19
Registriert: 23.03.2017 11:05
Computerausstattung: Win7 64bit, PureBasic 5.61 64bit
Linux Mint 19.1 64bit, PureBasic 5.71 64bit
VM (WinXP 32bit, PureBasic 5.71)
Wohnort: Kreis RE

Re: HTML mit Parameterübergabe, Post

Beitrag von proggernewbie »

Hallo Jürgen,
mannomann, ich bin baff.
Das ist so viel für mich, dass ich nach dem ersten Überfliegen alles wieder geschlossen und weggelegt habe. Jetzt beim zweiten und ruhigeren Lesen wird mir allerdings einiges klarer.

Der erste Code definiert Zugnummern und erzeugt sie so, wie ich es in meiner Frage mit dem Zähler beschrieben habe, das ist für mich nachvollziehbar. Auch die Stringkonvertierung, obwohl ich damit schon seit eh und je auf Kriegsfuß stehe. Muss mir das fast jedes Mal wieder suchen. Wusste nicht, dass ich es unter den genannten Punkten "Hilfe -> Allgemein -> String -> Str" so einfach finden kann. Habe bisher immer im Forum danach gesucht.
Der zweite Code liest die Zugdaten aus einer "DataSection" aus. Mit diesem Code komme ich am wenigsten klar. Z.B weiß ich nicht, wie der Zugriff auf die DataSection erfolgt. Ich sehe zwar, dass

Code: Alles auswählen

Read.s Zug$                ; Lese den Zug aus der DataSection.
da steht, hätte aber niemals bei Read.s die Verbindung zur Datasection erkannt. Kann mir das bitte noch jemand genauer erklären, wie der Zugriff darauf genau erfolgt?

Die letzten beiden Dateien (Zug.txt und der folgende Code), machen es genau so wie ich es mit dem Auslesen von Zugnummern aus einer Datei meinte. Allerdings wäre ich niemals in der Lage gewesen den Code so hin zu bekommen. Hätte bei mir weder so professionell und elegant noch so kurz ausgesehen.

Vielen Dank für die ausführliche und weitest gehend für mich nachvollziehbare Kommentierung.
Alfons
Inzwischen 61 Jahre alt.
Leider immer noch keine große Programmiererfahrung; nach Burn-Out vor fünf Jahren, starke Schwächen mit der Merkfähigkeit.
Körperlich und geistig schreitet der Verfall eben voran.
Trotzdem möchte ich versuchen etwas programmieren zu lernen und bin dankbar für jede Hilfe.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: HTML mit Parameterübergabe, Post

Beitrag von juergenkulow »

Hallo Alfons,

HIlfe -> Verschiedene Themen -> Data

Wie kommt man an die in *Speicher stehende Zeile:
ICE 616 München Hbf Dortmund Hbf fährt: 11. Dez 2016 bis 19. Aug 2017; 6. bis 21. Mai 2017 Mo - Fr; nicht 18. Dez 2016, 4. bis 8. Jan 2017, 14., 22., 23. Jan 2017, 9. Mär bis 5. Apr 2017, 15., 16. Jun 2017, 1. Jul bis 13. Aug 2017

html-Code der Zeile im *Speicher:

Code: Alles auswählen

<!-- Begin row of train -->
<tr>
<td colspan="10"><div class="separatingLine" style="margin-top:1px; margin-bottom:1px;"><hr style="display:none;" /></div></td>
</tr>
<tr class="buttonTable"><td class="result" valign="middle" style="width:30px;"  nowrap>&nbsp;<img src="http://www.img-bahn.de/v/17102/img_old/a_pic.gif"></td><td class="result" valign="middle"  nowrap>&nbsp;
<a href="http://reiseauskunft.bahn.de/bin/traininfo.exe/dn/929445/548259/278838/170396/80?rt=1&date=&">ICE  616</a>
&nbsp;&nbsp;</td><td class="result" valign="middle"  nowrap>&nbsp;</td><td class="result"><img src="http://www.img-bahn.de/v/17102/img_old/spacer.gif" width="1" height="30"></td>
<td nowrap>&nbsp;&nbsp;M&#252;nchen Hbf&nbsp;&nbsp;</td>
<td class="result"><img src="http://www.img-bahn.de/v/17102/img_old/spacer.gif" width="1" height="30"></td>
<td nowrap>&nbsp;&nbsp;Dortmund Hbf&nbsp;&nbsp;</td>
<td class="result"><img src="http://www.img-bahn.de/v/17102/img_old/spacer.gif" width="1" height="30"></td>
<td>f&#228;hrt: 11. Dez 2016 bis 19. Aug 2017; 6. bis 21. Mai 2017 Mo - Fr; nicht 18. Dez 2016, 4. bis 8. Jan 2017, 14., 22., 23. Jan 2017, 9. M&#228;r bis 5. Apr 2017, 15., 16. Jun 2017, 1. Jul bis 13. Aug 2017</td>
<td class="result"><img src="http://www.img-bahn.de/v/17102/img_old/spacer.gif" width="1" height="30"></td>
</tr><!-- End row of train -->
Jürgen
Antworten