Seite 1 von 4

ReceiveHTTPFile contra URLDownload [Erledigt]

Verfasst: 07.06.2008 22:46
von Elektrolurch
Hi all

Ich habe mal gerade etwas herumgespielt.
Dabei habe ich gemerkt, dass folgender Code nicht funktioniert.
URLDownload legt die Datei 1.txt an.
ReceiveHTTP leider nicht die Datei 2.txt
Ist der Name etwa zu lang?
Kürzere (http://ergebnisse.westlotto.com) gehen wieder.

Code: Alles auswählen

Url.s ="http://ergebnisse.westlotto.com/wlinfo/WL_InfoService?client=frss&gruppe=Gewinnzahlen&spielart=LOTTO"

InitNetwork() 
URLDownloadToFile_(0, Url.s, "1.txt", 0, 0)
ReceiveHTTPFile(Url.s, "2.txt")

End
BYE Andre

Verfasst: 07.06.2008 23:29
von ts-soft
Zu dem eigentlichen Problem kann ich leider nichts sagen, aber wie wäre es,
die Daten gleich als XML in den Speicher zu laden? Hier mal ein Grund-
gerüst (Hauptprocedure aus einem anderem Project)

Code: Alles auswählen

Procedure.s RemoteXMLString(url.s, buffersize.l = 1024, timeout.l = 3000)

  ; by edel
  ; modified by kiffi
  ; modified by ts-soft

  Protected cid.l, pos.l, headerlen.l, NetEvent.l, Buffer.l 
  Protected server.s, file.s, Header.s, response.s

  If Left(url, Len("http://")) = "http://"
    url = Right(url, Len(url) - Len("http://"))
  EndIf

  pos = FindString(url, "/", 0)

  If pos = 0
    server = url
    file   = "/"
  Else
    server = Left(url, pos - 1)
    file   = Right(url, Len(url) - pos + 1)
  EndIf

  cid = OpenNetworkConnection(server, 80, #PB_Network_TCP)

  If cid

    Header  = "GET "+ file + " HTTP/1.0"  + #CRLF$
    Header  + "Host: " + server           + #CRLF$
    Header  + "Accept: */*"               + #CRLF$
    Header  + "Connection: close"         + #CRLF$ + #CRLF$

    SendNetworkString(cid, Header)

    Buffer  = AllocateMemory(buffersize)
    timeout + ElapsedMilliseconds()

    Repeat

      NetEvent = NetworkClientEvent(cid)

      If NetEvent = #PB_NetworkEvent_Data

        Repeat
          headerlen = ReceiveNetworkData(cid, Buffer, buffersize)
          response  + PeekS(Buffer, headerlen, #PB_UTF8)
        Until headerlen = 0

        FreeMemory(Buffer)

        pos      = FindString(response, #CRLF$ + #CRLF$, 0) - 1
        pos      = Len(#CRLF$ + #CRLF$) + pos
        pos      = FindString(response, "<", pos) - 1

        response = Mid(response, pos, Len(response) - pos - 1)

        CloseNetworkConnection(cid)

        ProcedureReturn response

      EndIf

      If timeout < ElapsedMilliseconds()
        CloseNetworkConnection(cid)
        ProcedureReturn ""
      EndIf

    ForEver

    CloseNetworkConnection(cid)
  EndIf

  If Buffer
    FreeMemory(Buffer)
  EndIf

  ProcedureReturn ""

EndProcedure

Define.s Url ="http://ergebnisse.westlotto.com/wlinfo/WL_InfoService?client=frss&gruppe=Gewinnzahlen&spielart=LOTTO"

InitNetwork()

Define.s xml = RemoteXMLString(Url)

If xml
  Define.l oXML = CatchXML(#PB_Any, @xml, Len(xml))
  
  If oXML
  
  ; ...
  
  FreeXML(oXML)
  EndIf
EndIf

Verfasst: 08.06.2008 07:33
von edel
; by edel
Hoe ?

Verfasst: 08.06.2008 07:53
von rolaf
edel hat geschrieben:
; by edel
Hoe ?
Der Code hat sich wahrscheinlich durch die zwei weiteren Bearbeiter so stark verändert das du ihn nicht wiedererkennst. :lol:

Verfasst: 09.06.2008 21:05
von marco2007
Die Länge ist wohl nicht schuld:

Code: Alles auswählen

Url.s ="http://www.oneview.de/tags/index.jsf;jsessionid=1050569DA5FF481D396A84620EBF4BD6?tags=Europameisterschaft+RSS+Sport"
...funkt nämlich.

Was sollte nun erscheinen? Die Seite oder der XML-Code?

Code: Alles auswählen

Procedure Open()
  If OpenWindow(0, 0, 0, 800, 600, "Test")
    If CreateGadgetList(WindowID(0))
      WebGadget(0, 10, 20, 780, 590, "http://ergebnisse.westlotto.com/wlinfo/WL_InfoService?client=frss&gruppe=Gewinnzahlen&spielart=LOTTO")
      
    EndIf
  EndIf
EndProcedure

Open()
Repeat: Until WaitWindowEvent()=#WM_CLOSE 

...ich könnte mir vorstellen, daß es damit zusammenhängt...

lg
Marco

Verfasst: 10.06.2008 09:11
von Elektrolurch
Hi

Eigentlich sollte die Seite gespeichert werden um lediglich die Lottozahlen daraus auszulesen. (Seite abholen, parsen, vergleichen, Rundmail versenden)

ReceiveHTTPFile wäre halt Plattformübergreifend gewesen, obwohl das nicht unbedingt bindend ist.

BYE Andre

Verfasst: 10.06.2008 14:57
von ts-soft
RemoteXMLString() ist plattformübergreifend. Die XML wird zum parsen sogar
in den Speicher geladen, da fehlen also nur noch ein paar Zeilen aus der
XML lib und Du kannst Dein Programm drumrum bauen :wink:

Als Datei speichern kannst Dir doch sparen, xml wird doch sowieso
(jedenfalls bei so kleinen Dateien) im Speicher geparst.

Gruß
Thomas

Verfasst: 10.06.2008 17:42
von Elektrolurch
Hi

Sorry ich bin leider noch Anfänger.
RemoteXMLString()
Ist leider nicht in der PureBasic Hilfe :cry:
da fehlen also nur noch ein paar Zeilen aus der
XML lib und Du kannst Dein Programm drumrum bauen
Welche?
Von wo?
und gibts da auch eine Anleitung?

Deshalb bin ich ja auch weiter oben im Thread nicht auf die Prozedure angesprungen, da ich sie schlichtweg nicht ganz verstehe.

Als ich das letzte mal hier blind eine Prozedure eingebaut hatte, schlug nach dem erstellen der EXE mein Virenscanner an.

Bye Andre

Verfasst: 10.06.2008 17:57
von ts-soft
Elektrolurch hat geschrieben:Hi

Sorry ich bin leider noch Anfänger.
RemoteXMLString()
Ist leider nicht in der PureBasic Hilfe :cry:
Kann ja auch nicht, ist ja keine PB Funktion, sondern eine Procedure.
Die mußte nicht unbedingt verstehen, die lädt die XML in den Speicher und
gibt diese als String zurück (nur die URL als Parameter übergeben, die
anderen Parameter kannste erstmal ignorieren)
Praktischerweise sollte man das XML auch mit der in PB integrierten XML lib,
die ist in der Hilfe, nutzen.

Du kannst natürlich auch den String mit den Stringfunktionen parsen, wenn
Du die XML Funktionen noch nicht verstehst. Als Datei speichern würde auch
gehen, aber wäre blödsinnig.

Verfasst: 11.06.2008 13:45
von Elektrolurch
Hi

Ich habe die Procedure jetzt mal eingebaut und konnte sie auch einbinden.
Soweit scheint alles zu laufen.

Nun stelle ich mir gerade eine neue Frage, oder vielmehr euch.
Bisher arbeitet mein Program komplett ohne GUI und das soll wenn möglich auch so bleiben.
Kann man im Speicher irgendwie einen Lottoschein generieren, den man dann als JPG an die Rundmail anhängen kann?


Bye Andre