« Api gouv » : différence entre les versions
Apparence
Aucun résumé des modifications |
|||
| Ligne 223 : | Ligne 223 : | ||
./test.sh -m api -c 51100 -v "Reims" #(trouve les codes insee) | ./test.sh -m api -c 51100 -v "Reims" #(trouve les codes insee) | ||
./test.sh -m api -c 51100 #(trouve les codes insee) | ./test.sh -m api -c 51100 #(trouve les codes insee) | ||
</syntaxhighlight> | |||
=== data.education.gouv.fr === | |||
Obtenir les infos des établissements scolaires: | |||
<syntaxhighlight lang="bash" copy> | |||
#!/bin/bash | |||
# Aide d'utilisation | |||
usage() { | |||
echo "Usage: $0 -c COMMUNE [-t TYPE_ETABLISSEMENT] [-f more|all] [-o OFFSET]" | |||
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 (par défaut: 0)" #si les résultats sont superieurs à la limite de 100, permet d'afficher le reste des infos à partir de l'offset | |||
echo " -h Affiche cette aide" | |||
echo "" | |||
echo "Exemples:" | |||
echo " $0 -c Paris -t lycee" | |||
echo " $0 -c Reims -t ecole -0 100" | |||
echo " $0 -c Reims -f more -o 100" | |||
echo " $0 -c Lyon -t college -f all -o 100" | |||
exit 1 | |||
} | |||
# Variables par défaut | |||
commune="" | |||
type_etablissement="" | |||
output_mode="table" # table|more|all | |||
offset=0 | |||
# Traitement des arguments | |||
while getopts ":c:t:f:o: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" | |||
if ! [[ "$offset" =~ ^[0-9]+$ ]]; then | |||
echo "L'offset doit être un nombre positif" >&2 | |||
exit 1 | |||
fi ;; | |||
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%20like%20%27%25${encoded_commune}%25%27" | |||
[ -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 avec offset | |||
api_url="https://data.education.gouv.fr/api/explore/v2.1/catalog/datasets/fr-en-annuaire-education/records?where=${where_clause}&limit=100&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 | |||
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: 100" >&2 | |||
[ "$offset" -gt 0 ] && echo "Prochain offset possible: $((offset + 100))" >&2 | |||
echo "Recherche terminée." >&2 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
[[category:Divers]] [[category:api]] | [[category:Divers]] [[category:api]] | ||
Version du 29 mai 2025 à 22:41
Ressources
Adresse
Autres
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]"
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 (par défaut: 0)" #si les résultats sont superieurs à la limite de 100, permet d'afficher le reste des infos à partir de l'offset
echo " -h Affiche cette aide"
echo ""
echo "Exemples:"
echo " $0 -c Paris -t lycee"
echo " $0 -c Reims -t ecole -0 100"
echo " $0 -c Reims -f more -o 100"
echo " $0 -c Lyon -t college -f all -o 100"
exit 1
}
# Variables par défaut
commune=""
type_etablissement=""
output_mode="table" # table|more|all
offset=0
# Traitement des arguments
while getopts ":c:t:f:o: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"
if ! [[ "$offset" =~ ^[0-9]+$ ]]; then
echo "L'offset doit être un nombre positif" >&2
exit 1
fi ;;
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%20like%20%27%25${encoded_commune}%25%27"
[ -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 avec offset
api_url="https://data.education.gouv.fr/api/explore/v2.1/catalog/datasets/fr-en-annuaire-education/records?where=${where_clause}&limit=100&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
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: 100" >&2
[ "$offset" -gt 0 ] && echo "Prochain offset possible: $((offset + 100))" >&2
echo "Recherche terminée." >&2