Wetterdaten z.B. von Wetter.com auslesen
-
- Beiträge: 250
- Registriert: 25.11.2004 19:51
- Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS
Wetterdaten z.B. von Wetter.com auslesen
Hallo zusammen,
ich möchte mir ein kleines eigenes Gadget bauen, welches lediglich als Grafik und ein wenig Text das Wetter als Bild darstellt.
Das Anzeigen und die Grafiken sollten kein Problem darstellen - allerdings habe ich noch keinen Ansatz z. B. Wetterdaten von einer Website auszulesen (idealerweise auch vorhersagen etc.) und diese dann zu verwerten.
Hat hier evtl. jemand einen Ansatz oder Ideen bzw. sowas schon mal versucht?
LG der Stef
ich möchte mir ein kleines eigenes Gadget bauen, welches lediglich als Grafik und ein wenig Text das Wetter als Bild darstellt.
Das Anzeigen und die Grafiken sollten kein Problem darstellen - allerdings habe ich noch keinen Ansatz z. B. Wetterdaten von einer Website auszulesen (idealerweise auch vorhersagen etc.) und diese dann zu verwerten.
Hat hier evtl. jemand einen Ansatz oder Ideen bzw. sowas schon mal versucht?
LG der Stef
PB 4.6 / 32 Bit / 64 Bit
-
- Beiträge: 250
- Registriert: 25.11.2004 19:51
- Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS
Re: Wetterdaten z.B. von Wetter.com auslesen
Nachtrag: Okay - hab just kurz nach dem Post direkt was zum Thema gefunden - das geheimniss nennt sich Wetter API wie es z. B. google anbietet.
Diese Website enthält schon mal gar nicht so verkehrte Ansätze:
http://www.web-spirit.de/webdesign-tuto ... eather-API
Wer natürlich was brauchbares in PB als Code liefert ist immer willkommen
LG der Stef
Diese Website enthält schon mal gar nicht so verkehrte Ansätze:
http://www.web-spirit.de/webdesign-tuto ... eather-API
Wer natürlich was brauchbares in PB als Code liefert ist immer willkommen

LG der Stef
PB 4.6 / 32 Bit / 64 Bit
Re: Wetterdaten z.B. von Wetter.com auslesen
Naja dieser Link liefert dir ja ein XML-Baum.
Das hießt für PB:
Link-Zusammenstellen
Runterladen
Mit XML-Paser die einzelnen Daten lesen
im gadget darstellen
Das hießt für PB:
Link-Zusammenstellen
Runterladen
Mit XML-Paser die einzelnen Daten lesen
im gadget darstellen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 250
- Registriert: 25.11.2004 19:51
- Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS
Re: Wetterdaten z.B. von Wetter.com auslesen
Jups, dank google chrome ging da erstmal nix - FF brachte dann das XML.
Das schon mal n recht guter Ansatz. Die Frage ist - man müsste das doch ohne zwischenspeichern auch On The Fly auslesen können?
Evtl. eine Idee how-to?
Thx a Lot
PS: Sind immer wieder die gleichen 5 Leute die einem hier weiterhelfen - Muss euch mal für eure Dauer-Unterstützung loben. Ohne euch schaut glaub der PB Support auf dauer echt n bizzi mau aus.
Das schon mal n recht guter Ansatz. Die Frage ist - man müsste das doch ohne zwischenspeichern auch On The Fly auslesen können?
Evtl. eine Idee how-to?
Thx a Lot
PS: Sind immer wieder die gleichen 5 Leute die einem hier weiterhelfen - Muss euch mal für eure Dauer-Unterstützung loben. Ohne euch schaut glaub der PB Support auf dauer echt n bizzi mau aus.
PB 4.6 / 32 Bit / 64 Bit
Re: Wetterdaten z.B. von Wetter.com auslesen
Ich hatte mir dafür schonmal was zurechtgebastelt, was mir igoogle ausliest und parst...
Lädt auch die Wetter Icons herunter (im png format wie für PB gemacht
)
Ist wie gesagt vorab gebastelt gewesen, also noch nicht EnableExplicit geeicht .... und lässt sich wahrscheinlich auch eleganter lösen
Lädt auch die Wetter Icons herunter (im png format wie für PB gemacht

Ist wie gesagt vorab gebastelt gewesen, also noch nicht EnableExplicit geeicht .... und lässt sich wahrscheinlich auch eleganter lösen

Code: Alles auswählen
;###############################################################################
;#####
;##### Google Wetterdaten
;#####
;###############################################################################
UsePNGImageDecoder()
Structure weather_data
Celsius.i
Fahrenheit.i
Datum.s
Condition_Text.s
LuftFeuchte.i
Wind_Text.s
Image.i
EndStructure
Procedure.i iGoogle_Weather(Location.s, Path.s, Map Weather_Data.weather_data(), Language.s = "de")
Url.s = "http://www.google.com/ig/api?weather=" + Location + "&hl=" + Language
ClearMap(Weather_Data())
If ReceiveHTTPFile(Url,Path + "wet.txt")
Nr = ReadFile(#PB_Any,Path + "wet.txt")
If Nr
res.s = ReadString(Nr)
CloseFile(Nr)
EndIf
EndIf
DeleteFile(Path + "wet.txt")
If res <> ""
With Weather_Data(Location)
Anz = CountString(res,">")
Dim XML.s(Anz)
For i=1 To Anz
XML(i) = StringField(res,i,">")+">"
Next i
For i=1 To Anz
String.s = XML(i)
If d=0
If FindString(String,LCase("current_date_time data"),1)
TempString.s = StringField(String,2,Chr(34))
Datum = ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", TempString)
d = 1
\Datum = FormatDate("%dd.%mm.%yyyy - %hh:%ii:%ss",Datum)
EndIf
EndIf
If c=0
If FindString(String,LCase("condition data"),1)
\Condition_Text = StringField(String,2,Chr(34))
c = 1
EndIf
EndIf
If a=0
If FindString(String,LCase("temp_c data"),1)
\Celsius = Val(StringField(String,2,Chr(34)))
a = 1
EndIf
EndIf
If b=0
If FindString(String,LCase("temp_f data"),1)
\Fahrenheit = Val(StringField(String,2,Chr(34)))
b = 1
EndIf
EndIf
If h=0
If FindString(String,LCase("humidity data"),1)
\LuftFeuchte = Val(RemoveString(StringField(String,2,":"),"%"))
h=1
EndIf
EndIf
If Not IsImage(Image)
If FindString(String,LCase("icon data"),1)
ImageUrl.s = "http://img0.gmodules.com"+StringField(XML(i),2,Chr(34))
ImageUrl = Left(ImageUrl,Len(ImageUrl)-3) + "png"
If ReceiveHTTPFile(ImageUrl,Path + "weather.png")
\Image = LoadImage(#PB_Any,Path + "weather.png")
Image = \Image
If IsImage(Image)
DeleteFile(Path + "weather.png")
EndIf
EndIf
EndIf
EndIf
If w=0
If FindString(String,LCase("wind_condition data"),1)
w=1
\Wind_Text = Trim(RemoveString(StringField(String,2,":"),Chr(34)+"/>"))
EndIf
EndIf
Next i
EndWith
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
;##### Beispiel
InitNetwork()
NewMap Wetter.weather_data()
Image = CreateImage(#PB_Any,40,40)
Location.s = "Hamburg"
If iGoogle_Weather(Location, GetTemporaryDirectory(), Wetter())
OpenWindow(0,0,0,300,100,"Wetter : "+Location,#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
If IsImage(Wetter(Location)\Image)
ImageGadget(0,10,10,40,40,ImageID(Wetter(Location)\Image))
EndIf
TextGadget(1,55,10,250,15,Wetter(Location)\Condition_Text)
TextGadget(2,55,25,250,15,Str(Wetter(Location)\Celsius) + " Grad Celsius bei "+Str(Wetter(Location)\LuftFeuchte)+"% Luftfeuchtigkeit")
TextGadget(3,55,40,250,15,"Wind aus "+Wetter(Location)\Wind_Text)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit = 1
EndIf
Zuletzt geändert von Bisonte am 21.04.2011 17:42, insgesamt 1-mal geändert.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Wetterdaten z.B. von Wetter.com auslesen
also Ohne zwischen Speichern gehts mit TS-Softs code: ReceiveHTTPMemory()
Ich denke den XML-Rest bekommst du dann selber hin, wenn du die Beispiele der Hilfe anguckst
Code: Alles auswählen
Procedure.i ReceiveHTTPMemory(URL.s, BufferSize = 4096, Timeout = 5000)
Protected Connection, Time, Time2, Event, Size, Size2, SizeAll, pos
Protected.s Server
Protected *Mem, *Buffer, *Mem2
Size = 1
If LCase(Left(URL, 7)) <> "http://" : URL = "http://" + URL : EndIf
Server = GetURLPart(URL, #PB_URL_Site)
If Not Server : ProcedureReturn #False : EndIf
Connection = OpenNetworkConnection(Server, 80, #PB_Network_TCP)
If Not Connection : ProcedureReturn #False : EndIf
If BufferSize <= 0 : BufferSize = 4096 : EndIf
*Buffer = AllocateMemory(BufferSize)
If Not *Buffer : ProcedureReturn #False : EndIf
SendNetworkString(Connection, "GET " + URL + " HTTP/1.0" + #LFCR$ + #LFCR$)
Time = ElapsedMilliseconds()
Repeat
Event = NetworkClientEvent(Connection)
If Event = #PB_NetworkEvent_Data
Repeat
Size = ReceiveNetworkData(Connection, *Buffer, BufferSize)
If Size > 0
Time = ElapsedMilliseconds()
SizeAll + Size
*Mem = ReAllocateMemory(*Mem, SizeAll)
If *Mem
CopyMemory(*Buffer, *Mem + (SizeAll - Size), Size)
Else
CloseNetworkConnection(Connection)
FreeMemory(*Buffer)
ProcedureReturn #False
EndIf
EndIf
Until Size <= 0
EndIf
Time2 = ElapsedMilliseconds() - Time
Until Time2 > Timeout Or Size <= 0
CloseNetworkConnection(Connection)
FreeMemory(*Buffer)
If Time2 > Timeout
If *Mem : FreeMemory(*Mem) : EndIf
ProcedureReturn #False
EndIf
pos = FindString(PeekS(*mem, -1, #PB_UTF8), #CRLF$ + #CRLF$, 1) - 1
pos = Len(#CRLF$ + #CRLF$) + pos
Size2 = MemorySize(*Mem) - pos
*Mem2 = AllocateMemory(Size2)
If *Mem2
CopyMemory(*Mem + pos, *Mem2, Size2)
FreeMemory(*Mem)
ProcedureReturn *Mem2
EndIf
FreeMemory(*Mem)
ProcedureReturn #False
EndProcedure
InitNetwork()
*Adresse = ReceiveHTTPMemory("http://www.google.com/ig/api?weather=Berlin&hl=de")
Debug CatchXML(1, *Adresse, MemorySize(*Adresse))
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Wetterdaten z.B. von Wetter.com auslesen
ah jetzt weiss ich wieder warum ich das von hand geparst habe...
XMLStatus gab da ne Fehlermeldung raus, und da ich nicht wirklich firm bin, was den XML Teil von PB angeht,
lieber so wie ich es kann, auch wenns merkwürdig aussieht ...
XMLStatus gab da ne Fehlermeldung raus, und da ich nicht wirklich firm bin, was den XML Teil von PB angeht,
lieber so wie ich es kann, auch wenns merkwürdig aussieht ...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
-
- Beiträge: 250
- Registriert: 25.11.2004 19:51
- Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS
Re: Wetterdaten z.B. von Wetter.com auslesen
Ja Krass - drücke erstmal mehrfach den "Danke sagen" Button an euch Beide.
*THX* *THX* *THX*

*THX* *THX* *THX*

PB 4.6 / 32 Bit / 64 Bit
-
- Beiträge: 250
- Registriert: 25.11.2004 19:51
- Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS
Re: Wetterdaten z.B. von Wetter.com auslesen
Ja XML ist glaub auch nicht so ganz meine Stärke:
Leider klemmt hier noch irgendwas und liefert nicht alle Werte die aus dem XML kommen.
Code: Alles auswählen
;EnableExplicit
Enumeration
#XML_Wetter
#Window
#TreeGadget
EndEnumeration
Procedure.i Sidebar_Gadget_ReceiveHTTPMemory(URL.s, BufferSize = 4096, Timeout = 2000)
Protected Connection, Time, Time2, Event, Size, Size2, SizeAll, pos
Protected.s Server
Protected *Mem, *Buffer, *Mem2
Size = 1
If LCase(Left(URL, 7)) <> "http://" : URL = "http://" + URL : EndIf
Server = GetURLPart(URL, #PB_URL_Site)
If Not Server : ProcedureReturn #False : EndIf
Connection = OpenNetworkConnection(Server, 80, #PB_Network_TCP)
If Not Connection : ProcedureReturn #False : EndIf
If BufferSize <= 0 : BufferSize = 4096 : EndIf
*Buffer = AllocateMemory(BufferSize)
If Not *Buffer : ProcedureReturn #False : EndIf
SendNetworkString(Connection, "GET " + URL + " HTTP/1.0" + #LFCR$ + #LFCR$)
Time = ElapsedMilliseconds()
Repeat
Event = NetworkClientEvent(Connection)
If Event = #PB_NetworkEvent_Data
Repeat
Size = ReceiveNetworkData(Connection, *Buffer, BufferSize)
If Size > 0
Time = ElapsedMilliseconds()
SizeAll + Size
*Mem = ReAllocateMemory(*Mem, SizeAll)
If *Mem
CopyMemory(*Buffer, *Mem + (SizeAll - Size), Size)
Else
CloseNetworkConnection(Connection)
FreeMemory(*Buffer)
ProcedureReturn #False
EndIf
EndIf
Until Size <= 0
EndIf
Time2 = ElapsedMilliseconds() - Time
Until Time2 > Timeout Or Size <= 0
CloseNetworkConnection(Connection)
FreeMemory(*Buffer)
If Time2 > Timeout
If *Mem : FreeMemory(*Mem) : EndIf
ProcedureReturn #False
EndIf
pos = FindString(PeekS(*mem, -1, #PB_UTF8), #CRLF$ + #CRLF$, 1) - 1
pos = Len(#CRLF$ + #CRLF$) + pos
Size2 = MemorySize(*Mem) - pos
*Mem2 = AllocateMemory(Size2)
If *Mem2
CopyMemory(*Mem + pos, *Mem2, Size2)
FreeMemory(*Mem)
ProcedureReturn *Mem2
EndIf
FreeMemory(*Mem)
ProcedureReturn #False
EndProcedure
Procedure FillTree(*CurrentNode, CurrentSublevel)
; Ignore anything except normal nodes. See the manual for
; XMLNodeType() for an explanation of the other node types.
;
If XMLNodeType(*CurrentNode) = #PB_XML_Normal
; Add this node to the tree. Add name and attributes
;
Text$ = GetXMLNodeName(*CurrentNode) + " (Attributes: "
If ExamineXMLAttributes(*CurrentNode)
While NextXMLAttribute(*CurrentNode)
Text$ + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
Wend
EndIf
Text$ + ")"
AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel)
; Now get the first child node (if any)
;
*ChildNode = ChildXMLNode(*CurrentNode)
; Loop through all available child nodes and call this procedure again
;
While *ChildNode <> 0
FillTree(*ChildNode, CurrentSublevel + 1)
*ChildNode = NextXMLNode(*ChildNode)
Wend
EndIf
EndProcedure
InitNetwork()
Global *Adresse = Sidebar_Gadget_ReceiveHTTPMemory("http://www.google.com/ig/api?weather=Memmingen&hl=de")
CatchXML(#XML_Wetter, *Adresse, MemorySize(*Adresse))
If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TreeGadget(#TreeGadget, 10, 10, 480, 480)
;
*MainNode = MainXMLNode(#XML_Wetter)
If *MainNode
FillTree(*MainNode, 0)
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Leider klemmt hier noch irgendwas und liefert nicht alle Werte die aus dem XML kommen.
PB 4.6 / 32 Bit / 64 Bit
Re: Wetterdaten z.B. von Wetter.com auslesen
Wenn man das mit CatchXML() geholte mit XMLStatus() überprüft, erfüllt es #PB_XML_InvalidToken
Es scheint an einem Umlaut zu liegen (in dem einen Fall das ö von bewölkt)
Die Parameter von CatchXML() sind ja (#XML, *Adresse, Laenge [, Flags [, Kodierung]])
Da hab ich nun mit rumexperimentiert ... und siehe da :
CatchXML(#XML, *Adresse, Laenge , 0 , #PB_Ascii)
und schon wird alles angezeigt (bzw. von deinem Bsp. ausgelesen) wie es sein soll...
Edit :
Ich hab meinen Code von oben ein wenig überarbeitet, Stargates Hinweis übernommen (hier ts-soft sei gedankt) und ein
hoffentlich einwandfreies Include gebastelt, das auch ein Anfänger verstehen könnte (von der Fremdprozedur mal abgesehen
)...
Es scheint an einem Umlaut zu liegen (in dem einen Fall das ö von bewölkt)
Die Parameter von CatchXML() sind ja (#XML, *Adresse, Laenge [, Flags [, Kodierung]])
Da hab ich nun mit rumexperimentiert ... und siehe da :
CatchXML(#XML, *Adresse, Laenge , 0 , #PB_Ascii)
und schon wird alles angezeigt (bzw. von deinem Bsp. ausgelesen) wie es sein soll...
Edit :
Ich hab meinen Code von oben ein wenig überarbeitet, Stargates Hinweis übernommen (hier ts-soft sei gedankt) und ein
hoffentlich einwandfreies Include gebastelt, das auch ein Anfänger verstehen könnte (von der Fremdprozedur mal abgesehen

Code: Alles auswählen
EnableExplicit
;###############################################################################
;#####
;##### Benötigte Prozeduren zum Netzwerk Initialisieren und Download2Memory
;#####
;###############################################################################
Procedure.i NetWorkInit()
Static Netz
If Netz <> #True
If InitNetwork() = 0
Netz = #False
MessageRequester("Network","No TCP-Stack found !",#MB_ICONSTOP)
End
Else
Netz = #True
EndIf
EndIf
ProcedureReturn Netz
EndProcedure
Procedure.i ReceiveHTTPMemory(URL.s, BufferSize = 4096, Timeout = 5000)
;##### Original von ts-soft
If NetWorkInit()
Protected Connection, Time, Time2, Event, Size, Size2, SizeAll, pos
Protected.s Server
Protected *Mem, *Buffer, *Mem2
Size = 1
If LCase(Left(URL, 7)) <> "http://" : URL = "http://" + URL : EndIf
Server = GetURLPart(URL, #PB_URL_Site)
If Not Server : ProcedureReturn #False : EndIf
Connection = OpenNetworkConnection(Server, 80, #PB_Network_TCP)
If Not Connection : ProcedureReturn #False : EndIf
If BufferSize <= 0 : BufferSize = 4096 : EndIf
*Buffer = AllocateMemory(BufferSize)
If Not *Buffer : ProcedureReturn #False : EndIf
SendNetworkString(Connection, "GET " + URL + " HTTP/1.0" + #LFCR$ + #LFCR$)
Time = ElapsedMilliseconds()
Repeat
Event = NetworkClientEvent(Connection)
If Event = #PB_NetworkEvent_Data
Repeat
Size = ReceiveNetworkData(Connection, *Buffer, BufferSize)
If Size > 0
Time = ElapsedMilliseconds()
SizeAll + Size
*Mem = ReAllocateMemory(*Mem, SizeAll)
If *Mem
CopyMemory(*Buffer, *Mem + (SizeAll - Size), Size)
Else
CloseNetworkConnection(Connection)
FreeMemory(*Buffer)
ProcedureReturn #False
EndIf
EndIf
Until Size <= 0
EndIf
Time2 = ElapsedMilliseconds() - Time
Until Time2 > Timeout Or Size <= 0
CloseNetworkConnection(Connection)
FreeMemory(*Buffer)
If Time2 > Timeout
If *Mem : FreeMemory(*Mem) : EndIf
ProcedureReturn #False
EndIf
pos = FindString(PeekS(*mem, -1, #PB_UTF8), #CRLF$ + #CRLF$, 1) - 1
pos = Len(#CRLF$ + #CRLF$) + pos
Size2 = MemorySize(*Mem) - pos
*Mem2 = AllocateMemory(Size2)
If *Mem2
CopyMemory(*Mem + pos, *Mem2, Size2)
FreeMemory(*Mem)
ProcedureReturn *Mem2
EndIf
FreeMemory(*Mem)
EndIf
ProcedureReturn #False
EndProcedure
;###############################################################################
;#####
;##### iGoogle Wetterdaten
;#####
;###############################################################################
UsePNGImageDecoder()
Structure iGoogle_wetter_daten
current_date_time.s
city.s
postal_code.s
Unit_System.s
ccondition.s
temp_f.i
temp_c.i
humidity.i
cicon.s
cimage.i
wind_condition.s
day_of_week.s[5]
low.i[5]
high.i[5]
icon.s[5]
image.i[5]
condition.s[5]
EndStructure
Global NewMap iGoogle_Weather_Data.iGoogle_wetter_daten()
Procedure.s iGoogle_Weather_ParseData(String.s)
Protected Result.s = ""
Result = Mid(String,FindString(String,Chr(32),1))
Result = RemoveString(Result,"data=")
Result = RemoveString(Result,"/>")
Result = RemoveString(Result,#DQUOTE$)
Result = Trim(Result)
ProcedureReturn Result
EndProcedure
Procedure.s iGoogle_Weather_ParseNode(String.s)
Protected Result.s = ""
Result = StringField(String,1," ")
Result = RemoveString(Result,"<")
Result = Trim(Result)
ProcedureReturn Result
EndProcedure
Procedure iGoogle_Weather_forecast_information(Location.s, Array XML.s(1), Start,Stop)
Protected Mark.s, Result.s, i.i, Datum.i
With iGoogle_Weather_Data(Location)
For i=Start To Stop
Result.s = iGoogle_Weather_ParseData(xml(i))
Mark.s = iGoogle_Weather_ParseNode(xml(i))
Select Mark
Case "city"
\city = result
Case "postal_code"
\postal_code = result
Case "current_date_time"
Datum = ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", Result)
\current_date_time = FormatDate("%dd.%mm.%yyyy - %hh:%ii:%ss",Datum)
Case "unit_system"
\Unit_System = result
EndSelect
Next i
EndWith
EndProcedure
Procedure iGoogle_Weather_current_conditions(Location.s, Array XML.s(1), Start,Stop)
Protected Mark.s, Result.s, i.i
Protected *BildAdresse
With iGoogle_Weather_Data(Location)
For i=Start To Stop
Result.s = iGoogle_Weather_ParseData(xml(i))
Mark.s = iGoogle_Weather_ParseNode(xml(i))
Select Mark
Case "condition"
\ccondition = result
Case "temp_f"
\temp_f = Val(result)
Case "temp_c"
\temp_c = Val(result)
Case "humidity"
result = Trim(RemoveString(StringField(result,2,":"),"%"))
\humidity = Val(result)
Case "icon"
\cicon = "http://img0.gmodules.com"+Result
*BildAdresse = ReceiveHTTPMemory(Left(\cicon,Len(\cicon)-3) + "png")
If *BildAdresse
\cimage = CatchImage(#PB_Any,*BildAdresse)
FreeMemory(*BildAdresse)
EndIf
Case "wind_condition"
\wind_condition = result
EndSelect
Next i
EndWith
EndProcedure
Procedure iGoogle_Weather_forecast_conditions(Location.s, Array XML.s(1), Tag, Start,Stop)
Protected Mark.s, Result.s, i.i
Protected *BildAdresse
If Tag <=4
With iGoogle_Weather_Data(Location)
For i=Start To Stop
Result.s = iGoogle_Weather_ParseData(xml(i))
Mark.s = iGoogle_Weather_ParseNode(xml(i))
Select Mark
Case "day_of_week"
\day_of_week[Tag] = Result
Case "low"
\low[Tag] = Val(Result)
Case "high"
\high[Tag] = Val(Result)
Case "icon"
\icon[Tag] = "http://img0.gmodules.com"+Result
*BildAdresse = ReceiveHTTPMemory(Left(\icon[Tag],Len(\icon[Tag])-3) + "png")
If *BildAdresse
\image[Tag] = CatchImage(#PB_Any,*BildAdresse)
FreeMemory(*BildAdresse)
EndIf
Case "condition"
\condition[Tag] = Result
EndSelect
Next i
EndWith
EndIf
EndProcedure
Procedure iGoogle_Weather(Location.s, Language.s = "de")
Protected Url.s = "http://www.google.com/ig/api?weather=" + Location + "&hl=" + Language
Protected *Adresse = ReceiveHTTPMemory(Url)
Protected String.s, Anz.i, i.i, Start.i, Stop.i, Nr.i
If *Adresse
String.s = PeekS(*Adresse)
FreeMemory(*Adresse)
EndIf
If String <> ""
Anz = CountString(String,">")
Dim XML.s(Anz)
For i=1 To Anz
XML(i) = StringField(String,i,">")+">"
Next i
For i=1 To Anz
If XML(i) = "<forecast_information>"
Start = i+1
Repeat
i + 1
Until XML(i) = "</forecast_information>"
Stop = i-1
iGoogle_Weather_forecast_information(Location,xml(),start,stop)
EndIf
If XML(i) = "<current_conditions>"
Start = i+1
Repeat
i + 1
Until XML(i) = "</current_conditions>"
Stop = i-1
iGoogle_Weather_current_conditions(Location,xml(),start,stop)
EndIf
If XML(i) = "<forecast_conditions>"
Start = i+1
nr + 1
Repeat
i + 1
Until XML(i) = "</forecast_conditions>"
Stop = i-1
iGoogle_Weather_forecast_conditions(Location,xml(),Nr,start,stop)
EndIf
Next i
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
;#####
;##### Beispiel
;#####
Define Location.s, Event.i, Quit.i, i.i
Location.s = "Berlin"
If iGoogle_Weather(Location)
OpenWindow(0,0,0,300,500,"Wetter : "+Location,#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
With iGoogle_Weather_Data(Location)
If IsImage(\cimage)
ImageGadget(0,10,10,40,40,ImageID(\cimage))
EndIf
TextGadget(1,55,10,250,15,\current_date_time)
TextGadget(2,55,25,250,15,\ccondition)
TextGadget(3,55,40,250,15,Str(\temp_c) + " Grad Celsius bei "+Str(\humidity)+"% Luftfeuchtigkeit")
TextGadget(4,55,55,250,15,"Wind aus "+\wind_condition)
TextGadget(5,55,90,250,15,"Weitere Vorhersagen :")
For i=1 To 4
If IsImage(\cimage)
ImageGadget(i+5,10,100+(i*50),40,40,ImageID(\image[i]))
EndIf
TextGadget(i+5+4,55,100+(i*50),250,15,\day_of_week[i]+" : "+Str(\low[i])+" | "+Str(\high[i])+" Grad Celsius")
TextGadget(i+5+4+4,55,120+(i*50),250,15,\condition[i])
Next i
EndWith
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit = 1
EndIf
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom