Aller au contenu

« Api gouv » : différence entre les versions

De Marmits Wiki
Balise : Révocation manuelle
 
Ligne 318 : Ligne 318 :
# Affichage des paramètres de recherche
# Affichage des paramètres de recherche
echo "Recherche des établissements à '$commune'" >&2
echo "Recherche des établissements à '$commune'" >&2
[ -n "$type_etablissement" ] && echo "Filtre : type '$type_etablissement'" >&2
[ -n "$type_etablissement" ] && echo "Filtre : type '$type_etablissement'" >&2
[ "$output_mode" = "more" ] && echo "Affichage des champs de contact" >&2
[ "$output_mode" = "more" ] && echo "Affichage des champs de contact" >&2
[ "$output_mode" = "all" ] && echo "Affichage de tous les champs disponibles" >&2
[ "$output_mode" = "all" ] && echo "Affichage de tous les champs disponibles" >&2
[ "$offset" -gt 0 ] && echo "Décalage des résultats : $offset" >&2
[ "$offset" -gt 0 ] && echo "Décalage des résultats : $offset" >&2
[ "$limit" -ne 100 ] && echo "Nombre de résultats par page : $limit" >&2
[ "$limit" -ne 100 ] && echo "Nombre de résultats par page : $limit" >&2
echo "" >&2
echo "" >&2


Ligne 335 : Ligne 335 :
         "\($offset + .key + 1)|\(.value.nom_etablissement)|\(.value.type_etablissement)|\(.value.adresse_1)|\(.value.position.lat),\(.value.position.lon)"' | \
         "\($offset + .key + 1)|\(.value.nom_etablissement)|\(.value.type_etablissement)|\(.value.adresse_1)|\(.value.position.lat),\(.value.position.lon)"' | \
         while IFS='|' read -r num etablissement type adresse coord; do
         while IFS='|' read -r num etablissement type adresse coord; do
             printf "%3d | %-30s | %-15s | %-25s | %s\n" \
             printf "%3d | %-30s | %-15s | %-25s | %s\n" \
                   "$num" \
                   "$num" \
                   "$(echo "$etablissement" | cut -c -30)" \
                   "$(echo "$etablissement" | cut -c -30)" \
Ligne 356 : Ligne 356 :
             mail: .value.mail,
             mail: .value.mail,
             web: .value.web
             web: .value.web
         } | with_entries(select(.value != null)))
         } | with_entries(select(.value != null)))
         '
         '
         ;;
         ;;
Ligne 366 : Ligne 366 :
             .value | del(.datasetid, .recordid, .record_timestamp, .geometry) |  
             .value | del(.datasetid, .recordid, .record_timestamp, .geometry) |  
             . + {numero: ($offset + .key + 1)} |
             . + {numero: ($offset + .key + 1)} |
             with_entries(select(.value != null))
             with_entries(select(.value != null))
         )
         )
         '
         '

Dernière version du 31 mai 2025 à 17:15

Ressources

Adresse

Autres

calendrier.api.gouv.fr

Jours fériés

curl -s 'GET' 'https://calendrier.api.gouv.fr/jours-feries/metropole/2027.json'   -H 'accept: application/json' | jq

apicarto.ign.fr

Cadastre

curl -s 'https://apicarto.ign.fr/api/cadastre/commune?code_insee=02211' | jq
code postaux
curl -s 'https://apicarto.ign.fr/api/codes-postaux/communes/02290' | jq

adresse.data.gouv.fr

Démo Requete 1

curl -s "https://api-adresse.data.gouv.fr/search/?q=clermont+ferrand&type=municipality" | jq '.features[]'

Résultat:

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [
      3.107055,
      45.786671
    ]
  },
  "properties": {
    "label": "Clermont-Ferrand",
    "score": 0.9582027272727272,
    "id": "63113",
    "banId": "e78e0f92-9838-4643-a9d2-b12da89352fc",
    "type": "municipality",
    "name": "Clermont-Ferrand",
    "postcode": "63000",
    "citycode": "63113",
    "x": 708317.42,
    "y": 6520789.22,
    "population": 147751,
    "city": "Clermont-Ferrand",
    "context": "63, Puy-de-Dôme, Auvergne-Rhône-Alpes",
    "importance": 0.54023,
    "municipality": "Clermont-Ferrand",
    "_type": "address"
  }
}

Démo Requete 2

curl -s "https://api-adresse.data.gouv.fr/search/?q=clermont+ferrand&type=municipality" | \
jq '.features[] | {citycode: .properties.citycode, postcode: .properties.postcode, commune: .properties.city}'

Résultat:

{
  "citycode": "63113",
  "postcode": "63000",
  "commune": "Clermont-Ferrand"
}

Scripts BASH adresse

#!/bin/bash
# Script pour extraire les informations d'adresses via BAN (fichiers CSV ou API)
# source https://adresse.data.gouv.fr/data/ban/adresses/latest/csv/
# source https://api-adresse.data.gouv.fr

# Aide d'utilisation
usage() {
    echo "Usage: $0 -d DEPARTEMENT -c CODE -m MODE [-C COMMUNE] [-v VILLE] [-h]"
    echo "Extrait les rues d'une ville selon différents critères"
    echo ""
    echo "Options:"
    echo "  -d DEPARTEMENT   Code du département (ex: 51, 75) - non requis en mode 'api'"
    echo "  -c CODE          Code INSEE, postal ou autre selon le mode"
    echo "  -m MODE          Mode de recherche : 'insee', 'postal' ou 'api'"
    echo "  -C COMMUNE       Filtre sur le nom exact de la commune (2ème colonne) - modes insee/postal"
    echo "  -v VILLE         Nom de la ville pour le mode 'api' (optionnel, utilise le code postal si non fourni)"
    echo "  -h               Affiche cette aide"
    echo ""
    echo "Exemples:"
    echo "  $0 -d 51 -c 51454 -m insee"
    echo "  $0 -d 51 -c 51100 -m postal -C \"Reims\""
    echo "  $0 -m api -c 51100 -v \"Reims\""
    echo "  $0 -m api -c 51100"
    exit 1
}

# Variables par défaut
departement=""
code=""
mode=""
commune=""
ville=""

# Traitement des arguments
while getopts ":d:c:m:C:v:h" opt; do
    case $opt in
        d) departement="$OPTARG" ;;
        c) code="$OPTARG" ;;
        m) mode="$OPTARG" ;;
        C) commune="$OPTARG" ;;
        v) ville="$OPTARG" ;;
        h) usage ;;
        \?) echo "Option invalide: -$OPTARG" >&2; usage ;;
        :) echo "Option -$OPTARG nécessite un argument." >&2; usage ;;
    esac
done

# Vérification des paramètres obligatoires
if [ -z "$mode" ]; then
    echo "Erreur: Le paramètre -m est obligatoire"
    usage
fi

# Vérification du mode
if [ "$mode" != "insee" ] && [ "$mode" != "postal" ] && [ "$mode" != "api" ]; then
    echo "Erreur: Le mode doit être 'insee', 'postal' ou 'api'"
    usage
fi

# Traitement spécifique au mode API
if [ "$mode" = "api" ]; then
    if [ -z "$code" ]; then
        echo "Erreur: En mode 'api', le paramètre -c (code postal) est obligatoire"
        usage
    fi

    # Utilisation du code postal comme valeur par défaut pour q si ville n'est pas spécifiée
    if [ -z "$ville" ]; then
        echo "Interrogation de l'API pour le code postal ${code}..."
        curl -s "https://api-adresse.data.gouv.fr/search/?q=${code}&postcode=${code}&type=municipality" | \
        jq '.features[] | {citycode: .properties.citycode, commune: .properties.city}'
    else
        # Encodage de la ville pour URL
        encoded_ville=$(echo "$ville" | sed 's/ /+/g')

        echo "Interrogation de l'API pour la ville '${ville}' (code postal: ${code})..."
        curl -s "https://api-adresse.data.gouv.fr/search/?q=${encoded_ville}&postcode=${code}&type=municipality" | \
        jq '.features[] | {citycode: .properties.citycode, commune: .properties.city}'
    fi

    exit 0
fi

# Vérification des autres paramètres obligatoires pour modes CSV
if [ -z "$departement" ] || [ -z "$code" ]; then
    echo "Erreur: Les paramètres -d et -c sont obligatoires en modes 'insee' et 'postal'"
    usage
fi

# Suite du traitement pour les modes CSV (identique à l'original)
filename="adresses-${departement}.csv"
gzfile="${filename}.gz"
url="https://adresse.data.gouv.fr/data/ban/adresses/latest/csv/${gzfile}"

echo "Téléchargement du fichier pour le département ${departement}..."
wget -q "$url"

echo "Décompression..."
gunzip -f "$gzfile"

# Fonction pour filtrer par commune si spécifiée
filter_by_commune() {
    if [ -z "$commune" ]; then
        cat  # Pas de filtre, on affiche tout
    else
        awk -F' *\\| *' -v commune="$commune" 'tolower($2) == tolower(commune)'
    fi
}

# Traitement selon le mode
echo "Extraction des rues pour le code ${code} en mode ${mode}..."

if [ "$mode" = "insee" ]; then
    awk -F';' -v code="$code" '$7 == code {print $5 " | " $8 " | " $6}' "$filename" | awk '{$1=$1};1' | sort -u | filter_by_commune
elif [ "$mode" = "postal" ]; then
    awk -F';' -v code="$code" '$6 == code {print $5 " | " $8 " | " $7}' "$filename" | awk '{$1=$1};1' | sort -t '|' -u -k2,2 -k1,1 | filter_by_commune
fi

# Nettoyage (optionnel)
rm "$filename"
Exemples:
  ./test.sh -d 51 -c 51454 -m insee #(affiche toutes les rues)
  ./test.sh -d 51 -c 51100 -m postal -C "Reims" #(affiche toutes les rues)
  ./test.sh -m api -c 51100 -v "Reims" #(trouve les codes insee)
  ./test.sh -m api -c 51100 #(trouve les codes insee)

data.education.gouv.fr

Obtenir les infos des établissements scolaires:

#!/bin/bash

# Aide d'utilisation
usage() {
    echo "Usage: $0 -c COMMUNE [-t TYPE_ETABLISSEMENT] [-f more|all] [-o OFFSET] [-l LIMIT]"
    echo "Recherche des établissements scolaires via l'API de l'Éducation Nationale"
    echo ""
    echo "Options:"
    echo "  -c COMMUNE           Nom de la commune (obligatoire)"
    echo "  -t TYPE_ETABLISSEMENT Type d'établissement (optionnel)"
    echo "  -f more              Affiche les champs de contact (mail,telephone,web) en JSON"
    echo "  -f all               Affiche TOUS les champs disponibles en JSON"
    echo "  -o OFFSET            Décalage pour la pagination (défaut: 0)"
    echo "  -l LIMIT             Nombre de résultats par requête (défaut: 100, max: 100)"
    echo "  -h                   Affiche cette aide"
    echo ""
    echo "Exemples:"
    echo "  $0 -c Paris -t lycee -l 50"
    echo "  $0 -c Reims -f more -o 100 -l 20"
    exit 1
}

# Variables par défaut
commune=""
type_etablissement=""
output_mode="table"
offset=0
limit=100

# Traitement des arguments
while getopts ":c:t:f:o:l:h" opt; do
    case $opt in
        c) commune="$OPTARG" ;;
        t) type_etablissement="$OPTARG" ;;
        f) case "$OPTARG" in
              more) output_mode="more" ;;
              all) output_mode="all" ;;
              *) echo "Option -f invalide: $OPTARG (utilisez 'more' ou 'all')" >&2; usage ;;
           esac ;;
        o) offset="$OPTARG"
           [[ "$offset" =~ ^[0-9]+$ ]] || { echo "Offset doit être un nombre positif" >&2; exit 1; } ;;
        l) limit="$OPTARG"
           [[ "$limit" =~ ^[0-9]+$ ]] && [ "$limit" -le 100 ] || { 
               echo "Limit doit être un nombre entre 1 et 100" >&2; exit 1; } ;;
        h) usage ;;
        \?) echo "Option invalide: -$OPTARG" >&2; usage ;;
        :) echo "Option -$OPTARG nécessite un argument." >&2; usage ;;
    esac
done

[ -z "$commune" ] && { echo "Erreur: Le paramètre -c est obligatoire"; usage; }

# Encodage URL
encoded_commune=$(echo "$commune" | sed 's/ /%20/g')
#where_clause="nom_commune%20%3D%20%22${encoded_commune}%22%20" #strictement égale
where_clause="nom_commune%20like%20%27${encoded_commune}%27" # like 'paris'
#where_clause="nom_commune%20like%20%27%25${encoded_commune}%25%27" # like '%paris%'

[ -n "$type_etablissement" ] && {
    encoded_type=$(echo "$type_etablissement" | sed 's/ /%20/g')
    where_clause+="%20AND%20type_etablissement%20like%20%27%25${encoded_type}%25%27"
}

# Construction de la requête API
api_url="https://data.education.gouv.fr/api/explore/v2.1/catalog/datasets/fr-en-annuaire-education/records?&order_by=identifiant_de_l_etablissement&where=${where_clause}&limit=${limit}&offset=${offset}"

# Affichage des paramètres de recherche
echo "Recherche des établissements à '$commune'" >&2
[ -n "$type_etablissement" ] && echo "Filtre : type '$type_etablissement'" >&2
[ "$output_mode" = "more" ] && echo "Affichage des champs de contact" >&2
[ "$output_mode" = "all" ] && echo "Affichage de tous les champs disponibles" >&2
[ "$offset" -gt 0 ] && echo "Décalage des résultats : $offset" >&2
[ "$limit" -ne 100 ] && echo "Nombre de résultats par page : $limit" >&2
echo "" >&2

case "$output_mode" in
    "table")
        # Mode tableau standard
        echo "N° | Établissement | Type | Adresse | Coordonnées GPS" >&2
        echo "---------------------------------------------------------------" >&2
        
        curl -s "$api_url" | \
        jq -r --argjson offset "$offset" '.results | to_entries[] | 
        "\($offset + .key + 1)|\(.value.nom_etablissement)|\(.value.type_etablissement)|\(.value.adresse_1)|\(.value.position.lat),\(.value.position.lon)"' | \
        while IFS='|' read -r num etablissement type adresse coord; do
            printf "%3d | %-30s | %-15s | %-25s | %s\n" \
                   "$num" \
                   "$(echo "$etablissement" | cut -c -30)" \
                   "$(echo "$type" | cut -c -15)" \
                   "$(echo "$adresse" | cut -c -25)" \
                   "$coord"
        done
        ;;
    "more")
        # Mode JSON avec champs de contact
        curl -s "$api_url" | \
        jq --argjson offset "$offset" '
        .results | to_entries | map({
            numero: ($offset + .key + 1),
            nom_etablissement: .value.nom_etablissement,
            type_etablissement: .value.type_etablissement,
            adresse: .value.adresse_1,
            position: .value.position,
            telephone: .value.telephone,
            mail: .value.mail,
            web: .value.web
        } | with_entries(select(.value != null)))
        '
        ;;
    "all")
        # Mode JSON complet avec tous les champs
        curl -s "$api_url" | \
        jq --argjson offset "$offset" '
        .results | to_entries | map(
            .value | del(.datasetid, .recordid, .record_timestamp, .geometry) | 
            . + {numero: ($offset + .key + 1)} |
            with_entries(select(.value != null))
        )
        '
        ;;
esac

echo "" >&2
echo "Nombre de résultats affichés: $limit" >&2
[ "$offset" -gt 0 ] && echo "Prochain offset possible: $((offset + limit))" >&2
echo "Recherche terminée." >&2

Exemple

./ecole.sh -c Reims -t lycee 
Recherche des établissements à 'Reims'
Filtre : type 'lycee' | Établissement | Type | Adresse | Coordonnées GPS
---------------------------------------------------------------
  1 | Lycée Clemenceau              | Lycée          | 46 avenue Georges Clemenc | 49.25073432345288,4.046330326900803
  2 | Lycée professionnel Joliot-Cu | Lycée          | 4 rue Joliot Curie        | 49.23178325933544,4.003450480308607
  3 | Lycée polyvalent Georges Bri� | Lycée          | 2 rue Vauban              | 49.22398519953693,4.027090434385106
  4 | Lycée Sacré-Coeur            | Lycée          | 86 rue de Courlancy       | 49.238931122233176,4.025220635034403
  5 | Ecole des Métiers Artistiques | Lycée          | 28 BIS RUE DE COURCELLES  | 49.26107885865763,4.019019722186755
  6 | Lycée professionnel Raymond K | Lycée          | Allée de l'alouette      | 49.24965875528182,4.058829555724916
  7 | Lycée polyvalent Saint-Michel | Lycée          | 39 rue Martin Peller      | 49.2466954607039,4.014050539836219
  8 | Lycée polyvalent François Ar | Lycée          | 1 rue François Arago     | 49.22940166227636,4.0064656531151535
  9 | Lycée professionnel Jeanne d' | Lycée          | 94 avenue de Laon         | 49.26657628358237,4.026469785977506
 10 | Lycée Saint-Joseph            | Lycée          | 177 rue des Capucins      | 49.247044020034096,4.035980624193684
 11 | Lycée polyvalent Saint-Jean-B | Lycée          | 20 rue de Contrai         | 49.25063607358897,4.037199400980221
 12 | Lycée Saint-Jean XXIII        | Lycée          | 18 rue Andrieux           | 49.25926423819655,4.035949497933112
 13 | Section d'Enseignement Profess | Lycée          | 2 rue Vauban              | 49.22398519953693,4.027090434385106
 14 | Section d'Enseignement Profess | Lycée          | 39 rue MARTIN PELLER      | 49.24635162125739,4.013670264788377
 15 | Micro Lycée du Lycée Polyval | Lycée          | 2 rue Vauban              | 49.22369097053217,4.027750337502952
 16 | Lycée Jean Jaurès            | Lycée          | 17 rue Ruinart de Brimont | 49.25832684426352,4.045500552009885
 17 | Lycée professionnel Gustave E | Lycée          | 34 rue de Neufchatel      | 49.275232133479086,4.026901461730458
 18 | Lycée Colbert                 | Lycée          | 56 rue du Docteur Schweit | 49.282828421582906,4.024210541012452
 19 | Lycée professionnel Europe    | Lycée          | 71 avenue de l'Europe     | 49.24844732482777,4.066120515816653
 20 | Lycée Marc Chagall            | Lycée          | 60 chaussée Saint Martin | 49.24255560070805,4.0268702906229885
 21 | Lycée Roosevelt               | Lycée          | 10 rue Roosevelt          | 49.263238315726255,4.026660366516108
 22 | Lycée Libergier               | Lycée          | 55 rue Libergier          | 49.251152445191394,4.027709929823115
 23 | Section d'Enseignement Profess | Lycée          | 1  RUE FRANCOIS ARAGO     | 49.22831497165282,4.0073999655912145
 24 | Section d'Enseignement Profess | Lycée          | 20  RUE DE CONTRAI        | 49.25063607358897,4.037199400980221

Nombre de résultats affichés: 100
Recherche terminée.


Obtenir les infos d'un établissement précis (11ème de la liste)
ex:

./ecole.sh -c Reims -t lycee -o 10 -l 1 -f all

ou

./ecole.sh -c Reims -t lycee -o 10 -l 1 -f more

Résultat:

Recherche des établissements à 'Reims'
Filtre : type 'lycee'
Affichage des champs de contact
Décalage des résultats : 10
Nombre de résultats par page : 1
[
  {
    "numero": 11,
    "nom_etablissement": "Lycée polyvalent Saint-Jean-Baptiste de La Salle",
    "type_etablissement": "Lycée",
    "adresse": "20 rue de Contrai",
    "position": {
      "lon": 4.037199400980221,
      "lat": 49.25063607358897
    },
    "telephone": "03 26 77 17 00",
    "mail": "contact@gdls-reims.com",
    "web": "https://www.groupedelasalle-reims.com"
  }
]
Nombre de résultats affichés: 1
Prochain offset possible: 11
Recherche terminée.