OpenWeatherMap API

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

OpenWeatherMap API

Message par Flype »

Salut,

Voici un Module pour l'API OpenWeatherMap

http://openweathermap.org/api

EDIT: Mis à jour le 04/09/2015

Code : Tout sélectionner

;=======================================================
;== Module OpenWeatherMap
;=======================================================
;== Compiler:  PureBasic 5.31 (x64)
;== Tested on: Linux XUbuntu
;== Author:    flype, 2015
;== Version:   1.3 (2015-09-04)
;== Source:    GitHub link (soon)
;=======================================================

; http://openweathermap.org/api
; http://openweathermap.org/api_station
; http://openweathermap.org/current
; http://openweathermap.org/forecast5
; http://openweathermap.org/forecast16
; http://openweathermap.org/weather-data
; http://openweathermap.org/weather-conditions
; http://openweathermap.org/img/w/{weather.icon}.png

;=======================================================
;== Module Http
;=======================================================

DeclareModule Http
  
  ;----------------------------------------
  ;-- Functions
  ;----------------------------------------
  
  Declare   GetData  (url.s, bufSize.i = 65536)
  Declare   GetImage (url.s, bufSize.i = 65536)
  Declare.s GetString(url.s, bufSize.i = 65536)
  
EndDeclareModule

Module Http
  
  EnableExplicit
  
  ;----------------------------------------
  ;-- Publics
  ;----------------------------------------
  
  Procedure GetData(url.s, bufSize = 65536)
    
    Protected connection, exit, count, total, *buf1, *buf2
    
    url = URLEncoder(url)
    connection = OpenNetworkConnection(GetURLPart(url, #PB_URL_Site), 80, #PB_Network_TCP)
    If connection
      If SendNetworkString(connection, "GET " + url + #CRLF$, #PB_UTF8)
        Repeat
          Select NetworkClientEvent(connection)
            Case #PB_NetworkEvent_None: Delay(10)
            Case #PB_NetworkEvent_Disconnect: exit = #True
            Case #PB_NetworkEvent_Data
              *buf1 = AllocateMemory(bufSize)
              If *buf1 <> #Null
                *buf2 = *buf1
                Repeat
                  count = ReceiveNetworkData(connection, *buf2, 1024)
                  If count > 0
                    *buf2 + count : total + count
                  EndIf
                Until count = 0
                *buf1 = ReAllocateMemory(*buf1, total)
              EndIf
              exit = #True
          EndSelect
        Until exit
      EndIf
      CloseNetworkConnection(connection)
    EndIf
    
    ProcedureReturn *buf1
    
  EndProcedure

  Procedure GetImage(url.s, bufSize = 65536)
    
    Protected result, *buf = Http::GetData(url, bufSize)
    
    If *buf
      result = CatchImage(#PB_Any, *buf, MemorySize(*buf))
      FreeMemory(*buf)
    EndIf
    
    ProcedureReturn result
    
  EndProcedure
  
  Procedure.s GetString(url.s, bufSize = 65536)
    
    Protected result.s, *buf = Http::GetData(url, bufSize)
    
    If *buf
      result = PeekS(*buf, -1, #PB_UTF8)
      FreeMemory(*buf)
    EndIf
    
    ProcedureReturn result
    
  EndProcedure
  
EndModule

;=======================================================
;== Module OpenWeatherMap
;=======================================================

DeclareModule OpenWeatherMap
  
  ;----------------------------------------
  ;-- Constants
  ;----------------------------------------
  
  #OWM_API_ICON    = "http://openweathermap.org/img/w/"
  #OWM_API_ROOT    = "http://api.openweathermap.org/data/2.5/"
  
  #OWM_API_FIND    = "http://api.openweathermap.org/data/2.5/find"
  #OWM_API_GROUP   = "http://api.openweathermap.org/data/2.5/group"
  #OWM_API_WEATHER = "http://api.openweathermap.org/data/2.5/weather"
  #OWM_API_BOX     = "http://api.openweathermap.org/data/2.5/box/city"
  
  #OWM_MODE_HTML = "html"
  #OWM_MODE_JSON = "json"
  #OWM_MODE_XML  = "xml"
  
  #OWM_TYPE_ACCURATE = "accurate"
  #OWM_TYPE_LIKE     = "like"
  
  #OWM_UNIT_Imperial = "imperial"
  #OWM_UNIT_Metric   = "metric"
  
  #OWM_LANG_Bulgarian  = "bg"
  #OWM_LANG_Catalan    = "ca"
  #OWM_LANG_Chinese_Traditional = "zh_tw"
  #OWM_LANG_Chinese_Simplified  = "zh" ; or "zh_cn"
  #OWM_LANG_Croatian   = "hr"
  #OWM_LANG_Dutch      = "nl"
  #OWM_LANG_English    = "en"
  #OWM_LANG_Finnish    = "fi"
  #OWM_LANG_French     = "fr"
  #OWM_LANG_German     = "de"
  #OWM_LANG_Italian    = "it"
  #OWM_LANG_Polish     = "pl"
  #OWM_LANG_Portuguese = "pt"
  #OWM_LANG_Romanian   = "ro"
  #OWM_LANG_Russian    = "ru"
  #OWM_LANG_Spanish    = "es" ; or "sp"
  #OWM_LANG_Swedish    = "sv" ; or "se"
  #OWM_LANG_Turkish    = "tr"
  #OWM_LANG_Ukrainian  = "uk" ; or "ua"
  
  ;----------------------------------------
  ;-- Structures
  ;----------------------------------------
  
  Structure OWM_Clouds
    all.l ; Cloudiness, %
  EndStructure
  
  Structure OWM_Coord
    lon.d ; City geo location, latitude
    lat.d ; City geo location, longitude
  EndStructure
  
  Structure OWM_Error
    cod.s     ; Error code
    message.s ; Error message
  EndStructure
  
  Structure OWM_Main
    temp.d       ; Temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit. 
    pressure.l   ; Atmospheric pressure (on the sea level, if there is no sea_level or grnd_level data), hPa
    humidity.l   ; Humidity, %
    temp_min.d   ; Minimum temperature at the moment. 
                 ; This is deviation from current temp that is possible for large cities 
                 ; and megalopolises geographically expanded (use these parameter optionally). 
                 ; Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit.
    temp_max.d   ; Maximum temperature at the moment. 
                 ; This is deviation from current temp that is possible for large cities 
                 ; and megalopolises geographically expanded (use these parameter optionally). 
                 ; Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit.
    sea_level.l  ; Atmospheric pressure on the sea level, hPa
    grnd_level.l ; Atmospheric pressure on the ground level, hPa
  EndStructure
  
  Structure OWM_Rain
    h3.l ; Rain volume for the last 3 hours
         ; Remark: original property is '3h'
  EndStructure
  
  Structure OWM_Snow
    h3.l ; Snow volume for the last 3 hours
         ; Remark: original property is '3h'
  EndStructure
  
  Structure OWM_Sys
    type.l    ; Internal parameter
    id.l      ; Internal parameter
    message.d ; Internal parameter
    country.s ; Country code (GB, JP etc.)
    sunrise.l ; Sunrise time, unix, UTC
    sunset.l  ; Sunset time, unix, UTC
  EndStructure
  
  Structure OWM_Weather
    id.l          ; Weather condition id
    main.s        ; Group of weather parameters (Rain, Snow, Extreme etc.)
    description.s ; Weather condition within the group
    icon.s        ; Weather icon id
  EndStructure
  
  Structure OWM_Wind
    speed.d ; Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour.
    deg.l   ; Wind direction, degrees (meteorological)
  EndStructure
  
  Structure OWM_Item
    cod.l             ; Internal parameter
    base.s            ; Internal parameter
    id.l              ; City ID
    name.s            ; City name
    visibility.l      ; Visibility
    dt.l              ; Time of data calculation, unix, UTC
    coord.OWM_Coord   ; Coord object
    clouds.OWM_Clouds ; Clouds object
    error.OWM_Error   ; Error object
    main.OWM_Main     ; Main object
    rain.OWM_Rain     ; Rain object
    sys.OWM_Sys       ; Sys object
    snow.OWM_Snow     ; Snow object
    wind.OWM_Wind     ; Wind object
    List weather.OWM_Weather() ; Weather objects
  EndStructure
  
  Structure OWM_Group
    message.s             ; Message
    cod.s                 ; Code
    calctime.d            ; Processing server time
    count.l               ; Number of items
    List items.OWM_Item() ; Items list
    error.OWM_Error       ; Error object
  EndStructure
  
  ;----------------------------------------
  ;-- Functions
  ;----------------------------------------
  
  Declare OWM_GetCitiesInIDs(*object.OWM_Group, cityIDs.s)
  Declare OWM_GetCitiesInCircle(*object.OWM_Group, lat.d, lon.d, count.i = 10)
  Declare OWM_GetCitiesInRect(*object.OWM_Group, lat1.d, lon1.d, lat2.d, lon2.d, mapZoom.d)
  
  Declare OWM_GetWeatherByGeoCoord(*object.OWM_Item, lat.d, lon.d)
  Declare OWM_GetWeatherByCityID(*object.OWM_Item, cityID.s)
  Declare OWM_GetWeatherByCityName(*object.OWM_Item, cityName.s)
  Declare OWM_GetWeatherByZipCode(*object.OWM_Item, zip.s)
  Declare OWM_GetWeatherIcon(*object.OWM_Weather)
  
  Declare OWM_SetDefaultAPIKey(key.s)
  Declare OWM_SetDefaultLang(lang.s)
  Declare OWM_SetDefaultUnits(units.s)
  
EndDeclareModule

Module OpenWeatherMap
  
  EnableExplicit
  
  ;-----------------------------------------------------
  ;-- Privates
  ;-----------------------------------------------------
  
  Enumeration
    #OWM_FIND
    #OWM_ITEM
    #OWM_GROUP
  EndEnumeration
  
  Global defaultAPIKey.s
  Global defaultLang.s
  Global defaultUnits.s
  
  Procedure.s PrepareJSON(json.s)
    
    ; Rename "3h" member of OWM_Rain and OWM_Snow objects to "h3"
    json = ReplaceString(json, #DQUOTE$ + "3h" + #DQUOTE$, #DQUOTE$ + "h3" + #DQUOTE$)
    
    ; Rename "list" member of OWM_Group object to "items"
    json = ReplaceString(json, #DQUOTE$ + "list" + #DQUOTE$, #DQUOTE$ + "items" + #DQUOTE$)
    
    ; Rename "cnt" member of OWM_Group object to "count" (for standardized use)
    json = ReplaceString(json, #DQUOTE$ + "cnt" + #DQUOTE$, #DQUOTE$ + "count" + #DQUOTE$)
    
    ProcedureReturn json
    
  EndProcedure
  
  Procedure GetJSON(*object, service.s, params.s)
    
    Protected id, success, json.s
    
    params + "&mode=" + #OWM_MODE_JSON
    
    If defaultUnits <> #NULL$
      params + "&units=" + defaultUnits
    EndIf
    
    If defaultLang <> #NULL$
      params + "&lang="  + defaultLang
    EndIf
    
    If defaultAPIKey <> #NULL$
      params + "&APPID="  + defaultAPIKey
    EndIf
    
    json = Http::GetString(#OWM_API_ROOT + service + params)
    
    ;Debug "OpenWeatherMap::GetJSON()"
    ;Debug #OWM_API_ROOT + service + params
    ;Debug json
    
    If json <> #NULL$
      id = ParseJSON(#PB_Any, PrepareJSON(json))
      If id
        Select service
          Case "weather"
            Protected *item.OWM_Item = *object
            ExtractJSONStructure(JSONValue(id), *item,       OWM_Item)
            ExtractJSONStructure(JSONValue(id), *item\error, OWM_Error)
            success = #True
          Case "box/city", "find", "group"
            Protected *group.OWM_Group = *object
            ExtractJSONStructure(JSONValue(id), *group,       OWM_Group)
            ExtractJSONStructure(JSONValue(id), *group\error, OWM_Error)
            success = #True
        EndSelect
        FreeJSON(id)
      EndIf
    EndIf
    
    ProcedureReturn success
    
  EndProcedure
  
  ;-----------------------------------------------------
  ;-- Publics Getters
  ;-----------------------------------------------------
  
  Procedure OWM_GetCitiesInIDs(*object.OWM_Group, cityIDs.s)
    ProcedureReturn GetJSON(*object, "group", "?id=" + cityIDs)
  EndProcedure
  
  Procedure OWM_GetCitiesInCircle(*object.OWM_Group, lat.d, lon.d, count.i = 10)
    ProcedureReturn GetJSON(*object, "find", "?lat=" + lat + "&lon=" + lon + "&cnt=" + count)
  EndProcedure
  
  Procedure OWM_GetCitiesInRect(*object.OWM_Group, lat1.d, lon1.d, lat2.d, lon2.d, mapZoom.d)
    ProcedureReturn GetJSON(*object, "box/city", "?bbox=" + lat1.d + "," + lon1.d + "," + lat2.d + "," + lon2 + "," + mapZoom)
  EndProcedure
  
  Procedure OWM_GetWeatherByGeoCoord(*object.OWM_Item, lat.d, lon.d)
    ProcedureReturn GetJSON(*object, "weather", "?lat=" + lat + "&lon=" + lon)
  EndProcedure
  
  Procedure OWM_GetWeatherByCityID(*object.OWM_Item, cityID.s)
    ProcedureReturn GetJSON(*object, "weather", "?id=" + cityID)
  EndProcedure
  
  Procedure OWM_GetWeatherByCityName(*object.OWM_Item, cityName.s)
    ProcedureReturn GetJSON(*object, "weather", "?q=" + cityName)
  EndProcedure
  
  Procedure OWM_GetWeatherByZipCode(*object.OWM_Item, zipCode.s)
    ProcedureReturn GetJSON(*object, "weather", "?zip=" + zipCode)
  EndProcedure
  
  Procedure OWM_GetWeatherIcon(*object.OWM_Weather)
    ProcedureReturn Http::GetImage(#OWM_API_ICON + *object\icon + ".png")
  EndProcedure
  
  ;-----------------------------------------------------
  ;-- Publics Setters
  ;-----------------------------------------------------
  
  Procedure OWM_SetDefaultAPIKey(key.s)
    defaultAPIKey = key
  EndProcedure
  
  Procedure OWM_SetDefaultLang(lang.s)
    defaultLang = lang
  EndProcedure
  
  Procedure OWM_SetDefaultUnits(units.s)
    defaultUnits = units
  EndProcedure
  
EndModule

;=======================================================
;== End of include
;=======================================================
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: OpenWeatherMap API

Message par Flype »

Un exemple d'utilisation

EDIT: Mis à jour le 02/09/2015 23:02

Code : Tout sélectionner

;==========================================
;== OpenWeatherMap Test 1
;==========================================

InitNetwork()

IncludeFile "OpenWeatherMap.pbi"

UseModule OpenWeatherMap

; Optional API Key - Obtain a free one here :
; http://openweathermap.org/appid

;OWM_SetDefaultAPIKey("your_api_key_here")

OWM_SetDefaultLang(#OWM_LANG_French)
OWM_SetDefaultUnits(#OWM_UNIT_Metric)

Define x.OWM_Item, result, mask.s = "%dd/%mm/%yyyy %hh:%ii:%ss"

;result = OWM_GetWeatherByCityName(x, "Saint Etienne,fr")
;result = OWM_GetWeatherByCityName(x, "Paris,fr")
result = OWM_GetWeatherByCityName(x, "Roma,it")
;result = OWM_GetWeatherByCityName(x, "London,uk")
;result = OWM_GetWeatherByZipCode(x, "29000,fr")
;result = OWM_GetWeatherByZipCode(x, "94040,us")
;result = OWM_GetWeatherByGeoCoord(x, -0.13, 51.51)

If result
  Debug "name: "          + x\name
  Debug "dt: "            + FormatDate(mask, x\dt)
  Debug "cloud.all: "     + x\clouds\all + "%"
  Debug "coord.lon: "     + x\coord\lon
  Debug "coord.lat: "     + x\coord\lat
  Debug "main.temp: "     + x\main\temp + "°C"
  Debug "main.pressure: " + x\main\pressure + " hPA"
  Debug "main.humidity: " + x\main\humidity + "%"
  Debug "main.temp_min: " + x\main\temp_min + "°C"
  Debug "main.temp_max: " + x\main\temp_max + "°C"
  Debug "sys.country: "   + x\sys\country
  Debug "sys.sunrise: "   + FormatDate(mask, x\sys\sunrise)
  Debug "sys.sunset: "    + FormatDate(mask, x\sys\sunset)
  Debug "rain.3h: "       + x\rain\h3
  Debug "snow.3h: "       + x\snow\h3
  Debug "wind.speed: "    + x\wind\speed + "m/s"
  Debug "wind.deg: "      + x\wind\deg + "°"
  ForEach x\weather()
    Debug "weather.main: "        + x\weather()\main
    Debug "weather.description: " + x\weather()\description
    Debug "weather.icon: "        + x\weather()\icon
  Next
Else
  Debug "code: "    + x\error\cod
  Debug "message: " + x\error\message
EndIf

;==========================================
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: OpenWeatherMap API

Message par Flype »

Un deuxième exemple, avec image.

EDIT: Mis à jour le 02/09/2015

Code : Tout sélectionner

;==========================================
;== OpenWeatherMap Test 2
;==========================================

InitNetwork()

UsePNGImageDecoder()

IncludeFile "OpenWeatherMap.pbi"

UseModule OpenWeatherMap

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 200, "OpenWeatherMap", #PB_Window_ScreenCentered)
  
  TextGadget(0, 10, 10, 380, 20, "")
  ImageGadget(1, 10, 40, 50, 50, 0, #PB_Image_Border)
  
  Define x.OWM_Item
  
  OWM_SetDefaultLang(#OWM_LANG_French)
  OWM_SetDefaultUnits(#OWM_UNIT_Metric)
  
  If OWM_GetWeatherByCityName(x, "manchester,uk")
    If FirstElement(x\weather())
      Define imgID = OWM_GetWeatherIcon(x\weather())
      SetGadgetText(0, x\weather()\description)
      SetGadgetState(1, ImageID(imgID))
    EndIf
  EndIf
  
  Repeat
    Delay(1)
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  
EndIf

;==========================================
Autre exemple illustrant les fonctions de type " Liste " de résultats
OWM_GetCitiesInIDs()
OWM_GetCitiesInRect()
OWM_GetCitiesInCircle()

EDIT: Mis à jour le 04/09/2015

Code : Tout sélectionner

;==========================================
;== OpenWeatherMap Test 3
;==========================================

InitNetwork()

IncludeFile "OpenWeatherMap.pbi"

UseModule OpenWeatherMap

;OWM_SetDefaultAPIKey("_votre_api_key_")
OWM_SetDefaultLang(#OWM_LANG_French)
OWM_SetDefaultUnits(#OWM_UNIT_Metric)

Define x.OWM_Group, result.i

result = OWM_GetCitiesInIDs(x, "524901,703448,2643743")
;result = OWM_GetCitiesInRect(x, 12, 32, 15, 37, 7)
;result = OWM_GetCitiesInCircle(x, 45.5, 47.5, 100)

If result
  Debug "count: " + x\count
  ForEach x\items()
    Debug "============"
    Debug "name: "     + x\items()\name
    Debug "temp: "     + x\items()\main\temp     + "°C"
    Debug "pressure: " + x\items()\main\pressure + " hPA"
    Debug "humidity: " + x\items()\main\humidity + "%"
    Debug "wind: "     + x\items()\wind\speed    + "m/s"
    ForEach x\items()\weather()
      Debug "weather: " + x\items()\weather()\description
    Next
  Next
Else
  Debug "code: "    + x\error\cod
  Debug "message: " + x\error\message
EndIf

;==========================================
Image
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: OpenWeatherMap API

Message par Micoute »

Bonjour Flype et merci pour ce partage fort instructif !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: OpenWeatherMap API

Message par Kwai chang caine »

Bonjour FLYYYYPE !!!

Comment ça me fait plaisir de revoir ton chaton hérissé trainer par la !!! :D
Il m'avait semblé te voir trainer tes guetres sur le US, j'ai rien dit
Mais la, je ne peux résister à l'envie de faire une grosse bise à mon MAITRE des premiers jours quand j'etais un "BB PB" :mrgreen:

Que deviens tu ?? tu sais que tu as des fans, tu pourrais au moins leur donner de tes nouvelles de temps en temps :wink:

J'ai pas pu tester ton code, because proxy :?
Mais je te remercie les yeux fermés, je sais que les codes de FLYPE c'est du NETMAESTRO/SROD QUALITY

Encore merci de repasser (J'ammenerais mes chemises :mrgreen: :oops:) et de ton partage
Sincerement ce retour dans le temps m'a fait plaisir 8)

Passe une excelente journée MASTER FLYPE
Image
Dernière modification par Kwai chang caine le mer. 02/sept./2015 8:34, modifié 4 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: OpenWeatherMap API

Message par Anonyme2 »

Salut Flype :D

Ca marche bien pour mon petit village qui s'appelle Sourans (exemple 2 modifié en conséquence).
Ca correspond bien à la situation.
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: OpenWeatherMap API

Message par Ar-S »

Merci Flype !

Petit soucis avec le village ou je suis actuellement (le grand lemps)
Si je marque "le grand lemps" ça ne marche pas, si je mets "grand lemps", ça marche (bon ça ça vient d'openweather c'est pas grave)
En revanche, si l'url générée est la bonne
http://api.openweathermap.org/data/2.5/ ... &mode=json : OK via le navigateur
Elle fonctionne via le navigateur (firefox) mais pas via PB.
Peut-être une coquille en cas de noms composés ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: OpenWeatherMap API

Message par Ar-S »

J'avais essayé ça, marche en copie aussi via firefox mais pas via pb
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: OpenWeatherMap API

Message par Ollivier »

Je crois que le robot du site a bugué: il m'a indiqué que j'avais une réponse ici à un de mes messages. Sauf que je n'ai pas de message ici!
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: OpenWeatherMap API

Message par Ollivier »

ow Flype!

C'est gentil ça! Effectivement, tu tiens ta parole!!
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: OpenWeatherMap API

Message par Flype »

@BB-Kwai, @Denis, @Ollivier, @Spock, @Ar-S, @Micoute

Gros big up à vous tous :P
Merci pour ton chouette message Kwai, et oui désolé de pas donner beaucoup de nouvelles, c'est vrai. Je suis juste pris par le temps, par les réalités du quotidien, par la sortie difficile de mon ancienne boite, par mon futur nouveau taf, la vie quoi :o Et puis aussi, je touche beaucoup moins à PB, et donc je suis un peu rouillé :? Maintenant je fais des trucs nettement moins rigolos (quoique) dans les langages plus prisés par l'industrie du dev. Mais j'aime toujours autant mon PB (en ce moment sur Linux x64) et je regarde de près chacune des mises à jour :wink: Bon ce n'est plus aussi fluide qu'avant, quoique çà va quand même, j'ai pondu ce module en 2 ou 3h pour un petit projet perso dont je vous partagerai sûrement les sources.

Merci pour vos remontées sur le module que je n'ai pas beaucoup testé par manque de temps ; j'ai laissé quelques boulettes dans ce tas de lignes qu'il faut que j'améliore. Vu que je pratique plus beaucoup n'hésitez pas à proposer des pistes d'amélioration (nouvelles fonctionnalités PB que je n'ai pas vu etc...). Je vois que Spock (Dobro ?) s'est déjà bien amusé avec ;)

A faire :
- %20 dans l'URL (je vais traiter çà à bas niveau pour que ce soit transparent pour le coder)
- Compatibilité Unicode (j'ai eu un peu la flegme sur ce coup là)
- Il me semble qu'il y a une coquille quelque part pour le chargement de l’icône.
- Intégrer l'exemple de Spock dans une archive.
- Upload sur GitHub
- Quand la maj de PB sera stable, utilisation des nlles fonctions Http
- Après il y a toujours ouatmil trucs possibles

PS :
Pour info, attention à pas trop abuser du service, il y a très certainement un garde fou coté serveur OpenWeatherMap si trop de requêtes, trop rapprochées - comme GoogleMap par exemple. Ca peu expliquer pourquoi dès fois il n'y a pas de réponse (deny ou timeout).
Image
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: OpenWeatherMap API

Message par Ollivier »

Flype a écrit :Pour info, attention à pas trop abuser du service
Si je peux te rassurer, j'ai un petit peu de mal avec la communication moderne: pas de TV ni ADSL depuis pas mal d'années! Je ne contribuerai donc point à la saturation de ce serveur!

Cependant, je suis très enchanté par ton geste. Sans même voir fonctionner ce code source, j'en découvre beaucoup!
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: OpenWeatherMap API

Message par Flype »

MAJ du premier post et des exemples.

- %20 corrigé (merci Spoke) : Utilisation de URLEncoder()
- Compatible Unicode (merci infratec) : Utilisation de PeekS(*buf, -1, #PB_UTF8)
- SendNetworkString au lien de SendNetworkData (merci infratec)
- Fonctions HTTP déplacées dans un autre module (pour factorisation du code et prévoir futur maj PB)
- PrepareJSON plus robuste, au cas où : Chr(34).

@Ollivier

Ah tiens, je connais quelqu'un aussi comme çà, qui est allergique ou plutôt hyper-sensible aux ondes électromagnétiques... J'imagine que c'est pas cool.
Enfin moi je disais çà, mais vous pouvez abuser autant que vous voulez du service/serveur. C'est pas le mien :lol:
Et c'est juste un petit ban temporaire...
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: OpenWeatherMap API

Message par Flype »

Spock a écrit :
Flype a écrit : PS :
Pour info, attention à pas trop abuser du service, il y a très certainement un garde fou coté serveur OpenWeatherMap si trop de requêtes, trop rapprochées - comme GoogleMap par exemple. Ca peu expliquer pourquoi dès fois il n'y a pas de réponse (deny ou timeout).
ouaip, je me suis douté d'un truc comme ça
c'est pourquoi j'ai mis une demi heure pour le timer :)
Il est aussi possible d'utiliser une API Key - à obtenir sur le site - c'est gratuit, juste une inscription :
http://openweathermap.org/appid

Ah bah tiens d'ailleurs, faut que j'intègre ce paramètre.

EDIT:
+ Ajout de OWM_SetDefaultAPIKey("votre clef")
+ Optimisation du code, plus compact.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: OpenWeatherMap API

Message par Flype »

Tous les détails des limites de l'usage gratuit ici :

http://openweathermap.org/price
http://openweathermap.org/price_detailes

En bref, çà va c'est cool pour la plupart des usages :

1200 requêtes max par minute ==> çà, çà va :)
Disponibilité du serveur : 95% à 99,5% ==> çà explique les quelques requêtes sans réponse :|
Mise à jour des données météo toutes les 2 heures ==> j'en connais un qui va devoir changer son timer :wink:
Historique max à 1 jour (non implémenté dans le module de toutes façons)
Image
Répondre