Trafic_Paris / app.py
tyriaa
Initial deployment 2
0d0c101
raw
history blame
4.65 kB
# -*- coding: utf-8 -*-
from flask import Flask, render_template, jsonify
import requests
import json
import re
import os
from dotenv import load_dotenv
# Charger les variables d'environnement
load_dotenv()
app = Flask(__name__)
TOMTOM_API_KEY = os.getenv("TOMTOM_API_KEY")
API_KEY = os.getenv("IDFM_API_KEY")
BASE_URL_API = "https://prim.iledefrance-mobilites.fr/marketplace/v2/navitia/line_reports/physical_modes/physical_mode%3A"
CATEGORIES = {
"Métro": "Metro",
"RER": "RapidTransit",
"Bus": "Bus",
"Transilien": "LocalTrain",
"Tram": "Tramway"
}
# Fonction pour récupérer les perturbations
def fetch_disruptions(category, api_value):
url = f"{BASE_URL_API}{api_value}/line_reports?"
headers = {"accept": "application/json", "apiKey": API_KEY}
try:
response = requests.get(url, headers=headers, timeout=5)
response.raise_for_status()
data = response.json()
return data.get("disruptions", [])
except requests.exceptions.RequestException as e:
print(f"Erreur API pour {category}: {e}")
return []
# Normaliser le nom des lignes
def normalize_line_name(line_name):
line_name = line_name.lower()
line_name = re.sub(r"\b(ratp|sncf)\b", "", line_name)
line_name = re.sub(r"\s+", " ", line_name).strip()
return line_name.capitalize()
# Générer le HTML des perturbations
def generate_traffic_html():
all_disruptions = {}
for category, api_value in CATEGORIES.items():
disruptions = fetch_disruptions(category, api_value)
active_disruptions = [
{
"id": disruption.get("id"),
"cause": disruption.get("cause", "Inconnue"),
"severity": disruption.get("severity", {}).get("name", "N/A"),
"message": disruption["messages"][0]["text"] if disruption.get("messages") else "No message",
"impacted_lines": [
obj.get("pt_object", {}).get("name", "Unknown Line")
for obj in disruption.get("impacted_objects", [])
if obj.get("pt_object", {}).get("embedded_type") == "line"
]
}
for disruption in disruptions if disruption.get("status") == "active"
]
all_disruptions[category] = active_disruptions
# Récapitulatif des lignes impactées
summary_data = []
seen_lines = set()
for category, disruptions in all_disruptions.items():
for d in disruptions:
for line in d["impacted_lines"]:
norm_line = normalize_line_name(line)
if norm_line not in seen_lines:
summary_data.append({
"category": category,
"line": norm_line,
"cause": d["cause"],
"severity": d["severity"],
"message": d["message"]
})
seen_lines.add(norm_line)
return summary_data
@app.route('/')
def home():
return render_template('index.html')
@app.route('/api/incidents', methods=['GET'])
def get_incidents():
"""
Récupère les incidents depuis l'API TomTom Traffic.
"""
try:
# Zone géographique pour Paris
bounding_box = "1.79804455,48.52917947,2.88843762,49.24075760"
url = f"https://api.tomtom.com/traffic/services/5/incidentDetails?bbox={bounding_box}&fields=%7Bincidents%7Btype%2Cgeometry%7Btype%2Ccoordinates%7D%2Cproperties%7BiconCategory%7D%7D%7D&language=en-GB&categoryFilter=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C14&timeValidityFilter=present&key={TOMTOM_API_KEY}"
response = requests.get(url)
response.raise_for_status()
data = response.json()
incidents = data.get("incidents", [])
return jsonify({"status": "success", "data": incidents}), 200
except requests.exceptions.RequestException as e:
return jsonify({"status": "error", "message": str(e)}), 500
@app.route('/api/ratp_disruptions', methods=['GET'])
def ratp_disruptions():
data = generate_traffic_html()
return jsonify({"status": "success", "data": data})
@app.route('/api/traffic-disruptions', methods=['GET'])
def get_traffic_disruptions():
"""
Récupère les perturbations de trafic pour tous les modes de transport.
"""
try:
summary_data = generate_traffic_html()
return jsonify({"status": "success", "data": summary_data}), 200
except Exception as e:
return jsonify({"status": "error", "message": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)