Bonjour,
Je partage ci-dessous une version améliorée du code publié sur l’ancien forum
permettant de récupérer les informations sur le site Infoclimat.
Dans un scénario :
- définir une programmation => regarder quand les données sont actualisées et ne pas mettre trop court, il y a une sécurité le site quand il y trop de demandes
- créer un bloc code
- y insérer le code suivant en changeant :
– l’url de la page
– les noms des commandes (il faut créer un virtuel et ses commandes avec le plugin virtuel) - éventuellement, dans l’objet virtuel, aller dans Configuration avancée, descendre à la liste des commandes et aller dans les propriétés de Rafraichir et dans l’onglet Configuration > Action après exécution de la commande ajouter un appel à votre scenario avec dans Tags maj=1 (cela permet de forcer le rafraîchissement quand on clique sur la double flèche)
// On récupère les tags du scénario
$tags = $scenario->getTags();
// On extrait l'éventuel tag maj
$maj = $tags['#maj#'];
// Carpentras
$url = "https://www.infoclimat.fr/observations-meteo/temps-reel/carpentras/07586.html";
$data = file_get_contents($url);
@$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($data);
libxml_use_internal_errors(false);
$xpath = new DomXPath($dom);
$j1 = 0;$j2 = 0;
$s = 1; // 1 si colonne avec liens vers stations météo
//$node = $xpath->query("//*[@id=\"tableau-releves\"]/thead/tr/th[2]/a");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/thead/tr/th[3]/a");
$val = $node[0]->nodeValue;
$scenario->setLog("Colonne 'Temps' ? : ".$val);
if ($val === "Temps") {
$j1 = 1;//Ajout d'une colonne dans le tableau
}
$scenario->setLog("Valeur de j1 : ".$j1);
//$node = $xpath->query("//*[@id=\"tableau-releves\"]/thead/tr/th[".(3+$j)."]/a");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/thead/tr/th[".(6+$s+$j1)."]/a");
$val = $node[0]->nodeValue;
if ($val === "Bio-météo") {
$j2 = 1;//Ajout d'une colonne dans le tableau
}
$scenario->setLog("Valeur de j2 : ".$j2);
//Heure
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/th/span");
$nouvelle_heure = preg_replace ('#h$#','h00',$node[0]->nodeValue);
$cmd = cmd::byString("#[Météo][Carpentras][Heure]#");
$ancienne_heure = $cmd->execCmd();
$scenario->setLog("Carpentras ".$ancienne_heure. " vs ".$nouvelle_heure);
//Température
$i = 1 + $s;
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span[1]");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
$nouvelle_temp = $node[0]->nodeValue;
$scenario->setLog("Carpentras - Température ".$nouvelle_temp);
if ( ($nouvelle_heure != $ancienne_heure || $maj) && ($nouvelle_heure != "") && ($nouvelle_temp != "") ) {
//Mise à jour heure et température
$scenario->setLog("=> Mise à jour Carpentras");
$cmd->event($nouvelle_heure);
cmd::byString("#[Météo][Carpentras][Température]#")->event($nouvelle_temp);
//Pluie
$i = 2 + $s + $j1;
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span/text()");
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]");
cmd::byString("#[Météo][Carpentras][Pluie]#")->event($node[0]->nodeValue);
//Humidité
$i = 4 + $s + $j1;
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
cmd::byString("#[Météo][Carpentras][Humidité]#")->event($node[0]->nodeValue);
//Point de rosée
$i = 5 + $s + $j1 + $j2;
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
cmd::byString("#[Météo][Carpentras][Point de rosée]#")->event($node[0]->nodeValue);
//Vent
$i = 3 + $s + $j1;
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span[1]");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
cmd::byString("#[Météo][Carpentras][Vent]#")->event($node[0]->nodeValue);
//Rafales
$i = 3 + $s + $j1;
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[4]");
$valeur = $node[0]->nodeValue;
//$tmp1 = strrchr($valeur, '(');$valeur = substr($tmp1, 1, strpos($tmp1, ')') -1); // On récupère la valeur entre parenthèses
cmd::byString("#[Météo][Carpentras][Rafales]#")->event($valeur);
//Pression
$i = 6 + $s + $j1 + $j2;
//$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/text()");
$node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]");
cmd::byString("#[Météo][Carpentras][Pression]#")->event($node[0]->nodeValue);
//Précipitations
$precipitations = 0;
for ($k = 3; $k <= 12; $k++) {
$node = $xpath->query("//*[contains(@class, \"recap-clim-resp\")]/tr[".$k."]/td[1]");
$texte = $node[0]->nodeValue;
$scenario->setLog("Libellé : $texte");
if (stripos($texte, 'Cumul 24h glissantes') !== FALSE) {
$scenario->setLog("Match trouvé");
$node = $xpath->query("//*[contains(@class, \"recap-clim-resp\")]/tr[".$k."]/td[2]/div");
$precipitations = $node[0]->nodeValue;
}
}
cmd::byString("#[Météo][Carpentras][Précipitations 24h]#")->event($precipitations);
}
Attention, l’affichage des informations n’est pas toujours exactement le même selon les stations météo et certains colonnes sont ajoutées / supprimées dynamiquement => il faudra peut-être adapter un peu le code.
Edit : code mis à jour suite changement d’affichage avril 2020