HLab

Julien Hautefeuille

Refl.me, OpenWeatherMap et Golang : notification sur mobile Android

Capture Refle.me

Le mois dernier, j’ai eu connaissance de l’existence de l’application Refl.me disponible sur le magasin d’applications Android de Google.

Refl.me permet de recevoir des notifications sur son mobile grâce au format JSON.

Refl.me fonctionne directement avec un service web, aucun serveur tiers n’est utilisé, aucune inscription n’est requise et aucun stockage de vos données personnelles n’a lieu.

Refl.me permet simplement de recevoir des données statistiques, des notifications, de superviser des données…

La documentation disponible fournit un exemple en PHP ainsi que la manière de sécuriser l’accès au service web à l’aide d’une clé.

Pour tester un peu l’application, j’ai développé un mini service web fournissant des données météorologiques du service OpenWeatherMap avec la fonctionnalité de sécurisation de l’accès par clé en utilisant le language Go.

Pour ce mini service web, j’ai utilisé les technologies suivantes :

Au préalable, j’ai renseigné dans les variables d’environnement du système d’exploitation, la clé de l’API OpenWeatherMap ainsi que la clé secrète d’authentification au service web.

Pour la configuration du démon httpd, j’utilise les directives suivantes à adapter à votre configuration :

server "notification.mondomaine.fr" {
    listen on * tls port 443
    log style combined
    connection { max requests 500, timeout 3600 }
    location "*" { fastcgi socket ":9999" }
    hsts
    tls {
        certificate "/etc/ssl/notification.mondomaine.fr.fullchain.pem"
        key "/etc/ssl/private/notification.mondomaine.fr.key"
    }
}

Pour le service web, j’ai utilisé un contrôleur Gin :

// Cette structure permet de stocker les données exportées en JSON
var data struct {
    Refl        bool    `json:"refl.me"`
    Title       string  `json:"title"`
    Message     string  `json:"message"`
    Image       string  `json:"image"`
    Number      int     `json:"refresh"`
    Close       bool    `json:"close"`
    UseSecret   bool    `json:"use_secret"`
    SecretOk    bool    `json:"secret_ok"`
}

func Weather(c *gin.Context) {
    key := os.Getenv("MA_CLE")
    secret := c.Query("secret")

    data.Refl = true
    data.Number = 96
    data.Close = false
    data.UseSecret = true

    if len(secret) != 0 {
        lsecret := strings.Split(secret, "_")
        timestamp := lsecret[0]
        checksum := lsecret[1]
        sum := fmt.Sprintf("%x", md5.Sum([]byte(timestamp + key)))

        if sum == checksum {
            w, err := owm.NewCurrent("C", "fr", os.Getenv("WEATHER_TOKEN"))
            if err != nil {
                log.Fatal(err)
            }
            w.CurrentByName(c.Param("station"))
            city := fmt.Sprintf("%s", strings.ToUpper(c.Param("station")))
            temp := fmt.Sprintf("%.1f °C", w.Main.Temp)
            data.Title = city
            data.Message = temp
            data.SecretOk = true
        }
    } else {
        data.Title = fmt.Sprintf("%s", strings.ToUpper(c.Param("station")))
        data.Message = "Error. Enter the secret key."
        data.SecretOk = false
    }

    c.JSON(http.StatusOK, data)
}

Pour accéder au service web dans l’application Refl.me, il suffit de renseigner l’URL :

https://notification.mondomaine.fr/meteo/toulouse

Et de fournir la clé d’authentification.

Refl.me est facile à mettre en place et permet de nouvelles possibilités de notification sous Android.