une contribution d'un script car l'API Transilien va être bientôt décomissionnée (en mars normalement) et remplacée par l'API d'IDF Mobilité.
Il faut tout d'abord une clé API en s'inscrivant sur le site:
https://prim.iledefrance-mobilites.fr/
(explication: https://prim.iledefrance-mobilites.fr/content/files/2023/02/Documentation-fonctionnelle-PRIM--Fevrier2023--5.pdf)
Puis prendre le script ci-dessous
- Code : Tout sélectionner
<?
// appel de eedomus http://localhost/script/script_transilien_new.php&APIkey=[VAR1]&lignestation=[VAR2]&mission=[VAR3]
// lignestation est le code de la ligne et le code de la station séparés par ":" (ex: C01728:412815 -> RERD:Chatelet )
// reference code: https://prim.iledefrance-mobilites.fr/content/files/2023/02/Documentation-fonctionnelle-PRIM--Fevrier2023--5.pdf
// reference des codes STIF lignes: https://data.iledefrance-mobilites.fr/explore/dataset/referentiel-des-lignes/table/?disjunctive.transportmode&disjunctive.transportsubmode&disjunctive.operatorname&disjunctive.networkname
// reference des codes STIF stations/gares: ??? trouvé une référence annexe, plus compréhensible: https://github.com/kalon33/GtfsToSql/blob/master/perimetre_tr_plateforme_stif.txt
// v1
// v1.1: meilleur traitement des suppressions et des retards, integration CET (merci opa95)
// v1.2: intégration "pas de trains prévus (màj $heure)"
// v1.3: 31/05/2023 résolution d'un bug des trains affichés en double
$APIkey = getArg('APIkey');
$lignestation = getArg('lignestation');
$parcours = explode(":",$lignestation);
$ligne = "STIF:Line::".$parcours[0].":"; //ref STIF de la ligne recherchée (ex: )
$station = "STIF:StopPoint:Q:".$parcours[1].":"; // ref STIF de la gare recherchée (ex: STIF:StopPoint:Q:412815 = Chatelet)
$request= getArg('mission'); //mission 4 lettres (ex: DICA) ou 2 dernières lettres (ex: CA pour inclure DICA, FACA, UACA...)
$CET = 1+date('I'); //heure d'hiver 1 ou heure d'éte 2 car horaires en GMT
//pour filtre des horaires et des missions
$heure_actuelle= intval(date("H",time()));
$minute_actuelle =intval(date("m",time()));
$request_length = strlen($request);
//construction requête
$header = array(
"Accept: application/json" . "\r\n" .
"apikey: ". $APIkey. "\r\n"
);
$url="https://prim.iledefrance-mobilites.fr/marketplace/stop-monitoring?MonitoringRef=".$station."&LineRef=".$ligne;
$http_result = httpQuery($url, 'GET', NULL, NULL, $header);
$sortie = jsonToXML($http_result);
//construction réponse xml
@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;
$xmlvide = $xml;
$comparaisonold = $request;
for($i=1;$i<100;$i++){
$mission = xpath($sortie,"/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/JourneyNote/StopMonitoringDelivery/value/text()");
if ($request_length == 2){
if (substr($mission, -2) == $request) {
$horaire = xpath($sortie,"substring-before(substring-after(/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/AimedDepartureTime/text(),'T'),'.')");
$calcul = explode(":", $horaire);
$delai = xpath($sortie,"/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/ArrivalStatus/text()");
if(intval(($calcul[0])+intval($CET) >= $heure_actuelle) && (intval($calcul[1]) >= $minute_actuelle)){
$comparaison = substr($mission,0,2).($calcul[0]+intval($CET)).":".$calcul[1];
if ($comparaison <> $comparaisonold) {
$xml .= '<train>'.'<mission>'." ".substr($mission,0,2).'</mission>'.PHP_EOL;
$xml .= '<horaire>'.($calcul[0]+intval($CET)).":".$calcul[1].'</horaire>'.PHP_EOL;
if(($delai <> "onTime") && $delai <> "0"){
if($delai == "cancelled"){
$xml .= '<delai>'."Sup".'</delai>'.PHP_EOL;
} else {
$xml .= '<delai>'."R".$delai." ".'</delai>'.PHP_EOL;
}
}
$xml .= '</train>'.PHP_EOL;
$comparaisonold = $comparaison;
}
}
}
}elseif ($request_length == 4){
if ($mission == $request) {
$horaire = xpath($sortie,"substring-before(substring-after(/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/AimedDepartureTime/text(),'T'),'.')");
$calcul = explode(":", $horaire);
$delai = xpath($sortie,"/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/ArrivalStatus/text()");
if(intval(($calcul[0])+intval($CET) >= $heure_actuelle) && (intval($calcul[1]) >= $minute_actuelle)){
$comparaison = $mission.($calcul[0]+intval($CET)).":".$calcul[1];
if ($comparaison <> $comparaisonold) {
$xml .= '<train>'.'<mission>'.$mission.'</mission>'.PHP_EOL;
$xml .= '<horaire>'.($calcul[0]+intval($CET)).":".$calcul[1].'</horaire>'." ".PHP_EOL;
if(($delai <> "onTime") && $delai <> "0"){
if($delai == "cancelled"){
$xml .= '<delai>'."Sup".'</delai>'.PHP_EOL;
} else {
$xml .= '<delai>'."R".$delai." ".'</delai>'.PHP_EOL;
}
}
$xml .= '</train>'.PHP_EOL;
$comparaisonold = $comparaison;
}
}
}
}
}
if ($xml == $xmlvide){$xml .="pas de trains prévus (màj ".date("H:m",time()).")";} //sortie vide donc pas de trains
$xml .= '</root>'.PHP_EOL;
echo $xml;
//echo $sortie; // debug
?>
Pour l'utiliser, il faut créer un capteur http (texte) avec les paramètres suivant:
- Code : Tout sélectionner
http://localhost/script/?exec=script_transilien_new.php&APIkey=[VAR1]&lignestation=[VAR2]&mission=[VAR3]
- en VAR1= votre clé API ou Token
- en VAR2= le code de la ligne et le code de la station séparés par ":" (ex: C01728:412815 -> RERD:Chatelet(RER)) (cf. commentaires en début du script pour trouver votre code gare et code ligne, attention le code gare Gare du nord - RER D n'est pas le même que le code Gare du Nord - métro)
- en VAR3= la mission du train demandé (exemple pour les RERs: soit "CA" qui va inclure FACA, DICA, UACA, ou soit directement le nom complet de la mission "FACA")
Avec une mission en CO (incluant ZACO, ZICO, ZUCO.. tout en *CO) on obtient le résultat suivant:
ZA 19:06 ZI 19:12 0 ZA 19:21 ZA 19:36 ZA 19:51 ZA 20:06 ZA 20:21 ZA 20:36 ZA 20:51
Avec une mission unique ZICO on obtient le résultat suivant:
ZICO 19:12
(ici parce qu'il n'y a plus qu'un seul ZICO de prévu, sinon cela affiche tous les ZICO)
En théorie ce script doit pouvoir marcher pour les métros, les bus et tous les transports exploités par IDFM mais je n'ai testé qu'avec les RER.
Cela doit pouvoir donner une bonne base pour un développement plus général
v1: 14/02/2023 version initiale
v1.1: 15/02/2023 : meilleur traitement des suppressions et des retards, integration CET (merci opa95)
v1.2: 07/03/2023 intégration "pas de trains prévus"
v1.3: 31/05/2023 résolution d'un bug des trains affichés en double
++
F.