Seite 1 von 2

get http stuff ohne webGadget

Verfasst: 08.03.2010 16:03
von broozar
hallo allesamt,
sorry für die wahrscheinlich blöde frage, ich möchte daten (rohtext auf einer website) online abfragen und diese in einen string speichern, ohne über ein webGadget zu gehen. PB ist mein erster gehversuch in richtung basic, habe vorher mit php/python/lua und derartigem gearbeitet, das ist alles etwas neu für mich. vielen dank im voraus!

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 16:09
von STARGÅTE
Das einfachste wäre:

Code: Alles auswählen

ReceiveHTTPFile(URL$, Dateiname$)
Einfach die URL angeben und den Datei-Speichername und dann kannst du diese Datei öffnen (ReadFile())
und den Quelltext Zeile für Zeile auslesen (ReadString())

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 16:17
von broozar
danke, das habe ich auch im handbuch gesehen, aber geht es auch, ohne die datei zwischenzuspeichern?

ich suche das äquivalent zu pythons

Code: Alles auswählen

	f = urllib.urlopen(url, params)
	htmlSource = f.read()
	f.close()

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 16:24
von X360 Andy

Code: Alles auswählen

InitNetwork()


; Lädt den Inhalt einer URL in einen String
Procedure.s DownloadToString(URL$, TimeOut=5000)
Protected Event, Time, Size, String$
Protected BufferSize = $1000
Protected *Buffer = AllocateMemory(BufferSize)
Protected ServerName$ = GetURLPart(URL$, #PB_URL_Site)
Protected ConnectionID = OpenNetworkConnection(ServerName$, 80)
If ConnectionID
  SendNetworkString(ConnectionID, "GET "+URL$+" HTTP/1.0"+#LFCR$+#LFCR$)
  Time = ElapsedMilliseconds()
  Repeat
   Delay(10)
   Event = NetworkClientEvent(ConnectionID)
  Until Event Or ElapsedMilliseconds()-Time > TimeOut
  If Event
   Repeat
    Size = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
    String$ + PeekS(*Buffer, Size, #PB_Ascii)
   Until Not Size
   Inhalt = FindString(String$, #LFCR$, 1)
   If Inhalt
    ProcedureReturn Mid(String$,Inhalt+3)
   Else
    ProcedureReturn String$
   EndIf
  EndIf
EndIf
EndProcedure
Autor unbekannt

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 16:43
von STARGÅTE
Autor unbekannt
ne ich ^^

Zu benutzten wäre es dann so:

Code: Alles auswählen

Inhalt$ = DownloadToString("http://data.unionbytes.de/ip.php")
Debug Inhalt$
Debugger hat geschrieben:84.188.197.188

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 16:56
von broozar
sehr cool, vielen dank!

#LFCR$ wird moniert, wahrscheinlich weil ich so ein demo-nutzer bin, die meldung kommt auch in den mitgelieferten examples von PB. (ich führe das programm derzeit in einer win2k virtualbox aus, ich denke, das ist nicht das Problem, oder?). die IDE schlägt mir #CRLF$ vor, was beim compilen aber auch nicht durchläuft.

habe versucht, #LFCR$ zu eliminieren, leider hängt die app 5s bis zum timeout und läuft dann normal weiter, ohne irgendetwas auszugeben.

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 17:24
von ts-soft

Code: Alles auswählen

#LF = 10 ; LineFeed, Zeilenvorschub
#CR = 13 ; Carriage Return, Wagenrücklauf, Enter
#LF$ = Chr(#LF)
#CR$ = Chr(#CR)
#LFCR$ = #LF$ + #CR$
#CRLF$ = #CR$ + #LF$

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 17:31
von broozar
die prozedur läuft nun in ihrem eigenen thread und blockt somit die hauptapp nicht mehr, was schön ist, aber nach 5s bekomme ich immer meine debug-zeile "timeout". #lf$ und co sind gefixed, danke.

PS: tolle community :) i love it

es geht jetzt... fast. den rest krieg ich selber raus. vielen Dank!

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 18:18
von broozar
ok, der letzte schritt fehlt mir. ich bekomm ein 302 "document has moved", aber über einen browser ist die seite problemlos erreichbar. auch wird nicht die adresse meines spaces im header zurückgegeben, sondern die des providers.
EDIT: http://guttgame.q-soft.ch/ip.php funktioniert, http://server.csis-game.net/scc.php erzeugt dieses 302. beide scripts sollten einfach nur die IP wiedergeben.
EDIT2: server scheint grad down zu sein, war aber auch ne gute möglichkeit, das timeout zu testen... was leider nicht korrekt arbeitet in diesem falle.
EDIT3: da der prozess bei mir sowieso in einem eigenen thread läuft, säge ich ihn einfach nach einer gewissen zeit ab, falls er noch aktiv ist. ist das so eigentlich eine gute idee?

Code: Alles auswählen

  If (ElapsedMilliseconds()-TimeMain > 5000) And (IsThread(ip_thread))
    KillThread (ip_thread)
meisten funktioniert es, manchmal hängt er jedoch immernoch fest, was ich komisch finde. nicht die app hängt, sondern er hängt im versuch der verbindungsherstellung ("connecting...") und der thread wird trotzdem nicht abgesägt. die interpretation von 5000ms ist auch sehr frei manchmal... kann ich das unter VirtualBox abbuchen, läuft da was in meinem programm schief oder ist PBs interpretation von zeit in verbindung mit einem WaitWindowEvent() von natur aus "frei"...

Re: get http stuff ohne webGadget

Verfasst: 08.03.2010 22:23
von HeX0R
Wenn es dir nur um deine externe IP geht, da gibt's jede Menge Stuff hier im Board.

Hier z.B. ein Zweizeiler.