Utiliser une clé pour récupérer un JSON

Bonjour,

j'utilise un ESP WROOM 32 et j'aimerai l'utiliser pour récupérer des données via un site de transport de ma ville.

J'y arrive sans utiliser de clé d'API mais évidemment le nombre de requêtes est limité par jour.

J'ai déjà essayé avec plusieurs méthode mais sans succès, ici c'est mon code sans clé d'API.

Comment pourrais - je implémenter une clé ?

D'avance merci :wink:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <time.h>

const char* ssid = "XXXXX";
const char* wpd = "YYYYY";

const char* key = "ZZZZZZ

// URLs
const char* urls[] = {
  "https://data.stib-mivb.be/api/explore/v2.1/catalog/datasets/waiting-time-rt-production/records?where=%22UZ-VUB%22&limit=100&refine=pointid%3A1755",
  "https://data.stib-mivb.be/api/explore/v2.1/catalog/datasets/waiting-time-rt-production/records?where=%22GARE%20DE%20BERCHEM%22&limit=20&refine=pointid%3A1746",
  "https://data.stib-mivb.be/api/explore/v2.1/catalog/datasets/waiting-time-rt-production/records?where=%22ETANG%20NOIR%22&limit=20&refine=pointid%3A1746",
  "https://data.stib-mivb.be/api/explore/v2.1/catalog/datasets/waiting-time-rt-production/records?where=%22GARE%20DU%20NORD%22&limit=100&refine=pointid%3A1768",
  "https://data.stib-mivb.be/api/explore/v2.1/catalog/datasets/waiting-time-rt-production/records?where=%22GROOT-BIJGAARDEN%22&limit=100&refine=pointid%3A1680"
};

String getJson(const char* url);
void configureTime();
bool parseDate(const char* isoDate, struct tm* timeStruct);

void setup() {
  Serial.begin(115200);
  delay(1000);

  // Connexion au WiFi
  WiFi.begin(ssid, wpd);
  Serial.println("Connexion au WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.write('.');
  }
  Serial.println("\nConnecté au WiFi");

  // Configurer l'heure via NTP
  configureTime();

  // Traiter chaque URL
  for (int i = 0; i < 5; i++) {
    String response = getJson(urls[i]);

    if (response != "") {
      Serial.println("\nRéponse JSON pour URL: ");
      Serial.println(urls[i]);
      Serial.println(response);  // Affiche la réponse brute pour le débogage

      // Désérialiser le JSON principal
      DynamicJsonDocument root(2048);  // Augmente la taille si nécessaire
      DeserializationError error = deserializeJson(root, response);

      // Vérification des erreurs de désérialisation
      if (error) {
        Serial.print("Erreur de parsing JSON: ");
        Serial.println(error.c_str());
        return;
      }

      // Extraire les données du tableau "results"
      JsonArray results = root["results"].as<JsonArray>();
      if (results.size() > 0) {
        JsonObject result = results[0];

        // Extraire le "lineid" de la première entrée
        String lineid = result["lineid"].as<String>();
        Serial.print("LineID: ");
        Serial.println(lineid);

        // Récupérer la chaîne JSON du champ "passingtimes"
        String passingtimesStr = result["passingtimes"].as<String>();
        
        // Désérialiser la chaîne JSON à l'intérieur de "passingtimes"
        DynamicJsonDocument passingtimesDoc(2048);
        DeserializationError passingtimesError = deserializeJson(passingtimesDoc, passingtimesStr);

        if (passingtimesError) {
          Serial.print("Erreur de parsing du tableau 'passingtimes': ");
          Serial.println(passingtimesError.c_str());
          return;
        }

        // Extraire les informations de chaque passage
        JsonArray passingtimes = passingtimesDoc.as<JsonArray>();
        for (JsonObject passingtime : passingtimes) {
          const char* destination = passingtime["destination"]["fr"];
          const char* expectedArrivalTime = passingtime["expectedArrivalTime"];
          
          Serial.print("Destination: ");
          Serial.println(destination);
          Serial.print("Temps d'arrivée prévu: ");
          Serial.println(expectedArrivalTime);

          // Calculer la différence de temps
          struct tm expectedTime;
          if (parseDate(expectedArrivalTime, &expectedTime)) {
            // Calculer le temps restant
            time_t now = time(nullptr);  // Heure actuelle
            time_t arrival = mktime(&expectedTime);  // Heure d'arrivée
            double diff = difftime(arrival, now);  // Différence en secondes

            // Afficher la différence
            if (diff >= 0) {
              int minutes = diff / 60;  // Conversion en minutes
              Serial.print("Temps restant avant l'arrivée : ");
              Serial.print(minutes);
              Serial.println(" minutes");
            } else {
              Serial.println("Le transport est déjà passé.");
            }
          } else {
            Serial.println("Erreur de parsing de l'heure d'arrivée.");
          }
        }
      } else {
        Serial.println("Aucun enregistrement trouvé dans la réponse.");
      }
    } else {
      Serial.println("Erreur lors de la requête HTTP.");
    }
  }
}

void loop() {
  // Rien à faire dans la boucle
}

// Fonction pour récupérer les données JSON depuis l'URL
String getJson(const char* url) {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Pas de connexion WiFi");
    return "";
  }

  HTTPClient http;
  http.begin(url);

  // Effectuer la requête HTTP
  int httpCode = http.GET();
  
  // Afficher le code de statut HTTP
  Serial.print("Code de statut HTTP : ");
  Serial.println(httpCode);

  // Vérifier si la requête a échoué
  if (httpCode <= 0) {
    Serial.println("Erreur lors de la requête HTTP");
    http.end();
    return "";
  }

  // Vérifier si la requête a réussi
  if (httpCode == HTTP_CODE_OK) {
    String payload = http.getString();
    http.end();
    return payload;
  }

  http.end();
  return "";
}

// Fonction pour configurer l'heure via NTP
void configureTime() {
  configTime(0, 3600, "pool.ntp.org"); // Configurer l'ESP32 pour obtenir l'heure à partir de NTP
  Serial.println("Synchronisation avec le serveur NTP...");
  
  // Attendre que l'heure soit synchronisée
  while (time(nullptr) < 1510644967) {
    delay(100);
  }
  Serial.println("Heure synchronisée.");
}

// Fonction pour parser une date ISO 8601
bool parseDate(const char* isoDate, struct tm* timeStruct) {
  char buffer[20];
  // Formater la chaîne pour l'analyser : yyyy-mm-ddTHH:MM:SS
  int ret = sscanf(isoDate, "%4d-%2d-%2dT%2d:%2d:%2d", 
                    &timeStruct->tm_year, &timeStruct->tm_mon, &timeStruct->tm_mday, 
                    &timeStruct->tm_hour, &timeStruct->tm_min, &timeStruct->tm_sec);

  if (ret != 6) {
    return false;  // Parsing échoué
  }
  
  // Ajuster l'année et le mois pour le format struct tm
  timeStruct->tm_year -= 1900;
  timeStruct->tm_mon -= 1;
  return true;
}

leur doc décrit comment obtenir et utiliser une clé

ils disent

It is good practice to pass the API key to the Authorization header in the following format:

Authorization: Apikey <API_KEY>

Alternatively, you can pass the API key as a query parameter in the following format:

apikey=<API_KEY>

Replace <API_KEY>with your API key.

Note: We recommend passing the API key via a header over in a query parameter because headers are not stored in your browser history or server logs, minimizing the risk of exposure of your API key.

donc si vous ne voulez pas l'injecter dans le header, vous pouvez rajouter aux requêtes apikey=<API_KEY>

par exemple votre requête

https://data.stib-mivb.be/api/explore/v2.1/catalog/datasets/waiting-time-rt-production/records?where=%22UZ-VUB%22&limit=100&refine=pointid%3A1755

deviendrait

https://data.stib-mivb.be/api/explore/v2.1/catalog/datasets/waiting-time-rt-production/records?where=%22UZ-VUB%22&limit=100&refine=pointid%3A1755&apikey=<API_KEY>

bien sûr il faut remplacer <API_KEY> par votre clé

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.