Script de réservation de serveur kimsufi
Rédigé par Marc GUILLAUME | 5 commentairesUtilité
Script pour rechercher automatiquement les serveurs kimsufi disponibles. Surtout intéressant pour les serveurs premier prix (KS1) qui sont pris dès que créés et n'apparaissent jamais ou peu de temps sur la page web de commande.
Il utilise la bibliothèque cURL (l'installer si elle n'est pas dispo sur le système) et l'extension php-cli. Il ne permet pas de choisir le datacenter OVH (Gravelines, Roubaix etc.), il serait facile de le modifier pour cela, mais du coup il sera plus difficile d'avoir un KS1. Pour la recherche efficace d'un serveur KS1, le mieux est de ne laisser que ce serveur et commenter tous les autres.
OVH change régulièrement ses références serveur, donc il est bon de jeter un oeil sur la page web (en survolant les liens et regardant les références envoyées dans l'url) pour voir si les désignations de serveur saisies en dur dans le script sont encore valables, ou mieux encore en regardant le fichier json qui figure en début de script. Les serveurs kimsufi ont en général un nom du genre 1801ks et des chiffres, aujourd'hui (septembre 2018) les noms sont 1801ks12 pour le KS1 et 1801ks13 pour le KS2. La réservation des serveurs d'entrée de gamme est seule problématique, les autres ne posent pas de problèmes de réservation.
Utilisation
On lance le script en console avec la commande php ./kimsufi.php
, en supposant qu'on a sauvegardé le script sous le nom kimsufi.php dans le répertoire courant et qu'on lui a bien entendu donné les droits d'exécution, par exemple avec la commande chmod u+x kimsufi.php
.
Les résutats s'affichent sur la sortie standard. Si l'on veut en garder un log on peut rediriger la sortie vers un fichier php ./kimsufi.php > kimsufi.log
, ou avec la redirection >> si l'on veut rajouter au fichier sans le vider à chaque fois.
On peut bien entendu utiliser la commande tee pour à la fois afficher sur la sortie standard et logger dans un fichier : php ./kimsufi.php | tee -a kimsufi.log
, avec l'option -a pour ajouter au fichier (équivalent de >>) ou sans elle pour vider le fichier de log à chaque lancement. Il est en effet probable que vous devrez lancer ce script plusieurs jours de suite les mises à disposition des ks1 se produisant visiblement seulement une ou deux fois par semaine.
ÉDIT DE MAI 2019 : L'url pour obtenir la liste des serveurs a changé. En fait on peut avoir des serveurs kimsufi ou des serveurs soyoustart ou ovh dans cette liste. La nouvelle url est :
https://www.kimsufi.com/fr/js/dedicatedAvailability/availability-data-ca.jsonOn peut obtenir la même liste avec soyoustart au lieu de kimsufi dans l'url. Par contre il faudra changer l'url pour lancer la commande selon que l'on veut du soYouStart ou du Kimsufi.
ÉDIT DE FÉVRIER 2020 : La structure du document json ayant un peu changée je corrige dans le script la ligne conservée (l'ancienne est mise en commentaire). On parcours maintenant le fichier json par :
$dispo = $a->availability;
Le script en lui-même
Comme vous pouvez le voir le script en lui-même n'a rien de très complexe, il télécharge les données au format Json et les parcours à la recherche de la disponibilité du serveur. Pour connaître les noms de variables il suffit de regarder la structure du fichier Json, par exemple en décommentant // print_r($a);
.
<?php /* © Copyright 2017 Marc GUILLAUME This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. Script pour rechercher automatiquement les serveurs kimsufi disponibles. Surtout intéressant pour les serveurs premier prix (KS1) qui sont pris dès que créés et n'apparaissent jamais ou peu de temps sur la page web de commande. Il utiliser la bibliothèque cURL (l'installer si elle n'est pas dispo sur le système) et l'extension php-cli. Il ne permet pas de choisir le datacenter OVH (Gravelines, Roubaix etc.), il serait facile de le modifier pour cela, mais du coup il sera plus difficile d'avoir un KS1. Pour la recherche efficace d'un serveur KS1, le mieux est de ne laisser que ce serveur et commenter tous les autres (état d'origine du script). OVH change régulièrement ses références serveur, donc il est bon de jeter un oeil sur la page web (en survolant les liens et regardant les références envoyées dans l'url) pour voir si les désignations de serveur saisies en dur dans le script sont encore valables. Les serveurs saisis sont à jour le 04 février 2018 et ne concernent que les serveurs d'entrée de gamme, les autres ne posent pas de problèmes de réservation. On lance le script en console avec la commande "php ./kimsufi.php", en supposant qu'on a sauvegardé le script sous le nom kimsufi.php dans le répertoire courant et qu'on lui a bien entendu donné les droits d'exécution, par exemple avec la commande chmod u+x kimsufi.php. Les résutats s'affichent sur la sortie standard. Si l'on veut en garder un log on peut rediriger la sortie vers un fichier "php ./kimsufi.php > kimsufi.log", ou avec la redirection >> si l'on veut rajouter au fichier sans le vider à chaque fois. On peut bien entendu utiliser la commande tee pour à la fois afficher sur la sortie standard et logger dans un fichier : "php ./kimsufi.php | tee -a kimsufi.log", ave l'option -a pour ajouter au fichier (équivalent de >>) ou sans elle pour vider le fichier de log à chaque changement. */ // URL OVH affichant les disponibilités des serveurs kimsufi au format Json $url = "https://www.kimsufi.com/fr/js/dedicatedAvailability/availability-data-ca.json"; // On lance le script en boucle, qui s'arrêtera lorsque un serveur disponible aura été trouvé while (1) { $exec = false; fwrite(STDOUT, " --- Lancement du script de disponibilité serveurs Kimsufi --- ".date('d-m-Y H:i:s').PHP_EOL); // Création d'une ressource cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // On initialise une variable pour stocker la réponse au format Json $json = ''; // On détecte une éventuelle erreur cURL if (($json = curl_exec($ch)) === false) { fwrite(STDOUT, 'Curl error: ' . curl_error($ch).PHP_EOL); } else { $a = json_decode($json); // print_r($a); // Choisir les serveurs à rechercher $ref = [ '1801sk12',// KS-1 '1801sk13' // KS-2 ]; //$dispo = $a->answer->availability; $dispo = $a->availability; // On parcours la section "availability" du tableau généré depuis lé réponse Json foreach ($dispo as $s) { // Si l'on trouve une des références de serveur recherchées if (in_array($s->reference, $ref)) { fwrite(STDOUT,'Référence : '.$s->reference.PHP_EOL); // On parcours les zones pour voir où un serveur serait disponible $z = $s->zones; foreach ($z as $zone) { fwrite(STDOUT,'Disponibilité : '.$zone->availability.' dans la zone '.$zone->zone.PHP_EOL); // Si on a une disponibilité dans une zone on va afficher la page de commande if ($zone->availability!=='unavailable' && $zone->availability!=='unknown') { // Choisir un autre navigateur que firefox si nécessaire shell_exec('/usr/bin/firefox --new-window https://www.kimsufi.com/fr/commande/kimsufi.xml?reference='.$s->reference.'&quantity=1'); // On affiche le message de réussite dans le shell pour faire joli ! fwrite(STDOUT, 'BINGO !!! '.$s->reference.' Dispo.'.PHP_EOL); $exec = true; break;// Avec ce break on s'arrête au premier serveur trouvé. Ceci implique //qu'on accepte n'importe quelle zone. Sinon il faudrait encore filtrer par les noms de zone. } } } } } // Si l'on n'a rien trouvé on s'arrête et on affiche le message suivant if (!$exec) { fwrite(STDOUT,'Caramba, encore raté ! ;('.PHP_EOL); } fwrite(STDOUT, " --- --------------------------------- --- ".PHP_EOL); // met une petite temporisation avant de recommencer la recherche ($exec) ? sleep(300) : sleep(30); } ?>
Si aucun serveur n'est disponible vous allez voir s'afficher à l'écran quelque chose comme :
--- Lancement du script de disponibilité serveurs Kimsufi --- 01-09-2017 20:04:22 Référence : 1801sk12 Disponibilité : unavailable dans la zone fra Disponibilité : unavailable dans la zone syd Disponibilité : unavailable dans la zone sbg Disponibilité : unavailable dans la zone vin Disponibilité : unavailable dans la zone rbx Disponibilité : unavailable dans la zone bhs Disponibilité : unavailable dans la zone hil Disponibilité : unavailable dans la zone gra Disponibilité : unavailable dans la zone waw Disponibilité : unavailable dans la zone rbx-hz Disponibilité : unavailable dans la zone lon Disponibilité : unavailable dans la zone sgp Référence : 1801sk13 Disponibilité : unavailable dans la zone fra Disponibilité : unavailable dans la zone syd Disponibilité : unavailable dans la zone sbg Disponibilité : unavailable dans la zone vin Disponibilité : unavailable dans la zone rbx Disponibilité : unavailable dans la zone bhs Disponibilité : unavailable dans la zone hil Disponibilité : unavailable dans la zone gra Disponibilité : unavailable dans la zone waw Disponibilité : unavailable dans la zone rbx-hz Disponibilité : unavailable dans la zone lon Disponibilité : unavailable dans la zone sgp Caramba, encore raté ! ;( --- --------------------------------- ---
et le script va se relancer toutes les 30 secondes, jusqu'à ce que vous puissiez lire :
--- Lancement du script de disponibilité serveurs Kimsufi --- 02-09-2017 20:04:57 Référence : 1801sk12 Disponibilité : unavailable dans la zone fra Disponibilité : unavailable dans la zone syd Disponibilité : unavailable dans la zone sbg Disponibilité : unavailable dans la zone vin Disponibilité : 1H-low dans la zone rbx BINGO !!! 1801sk12 Dispo. Référence : 1801sk13 Disponibilité : unavailable dans la zone fra Disponibilité : unavailable dans la zone syd Disponibilité : unavailable dans la zone sbg Disponibilité : unavailable dans la zone vin Disponibilité : unavailable dans la zone rbx Disponibilité : unavailable dans la zone bhs Disponibilité : unavailable dans la zone hil Disponibilité : unavailable dans la zone gra Disponibilité : unavailable dans la zone waw Disponibilité : unavailable dans la zone rbx-hz Disponibilité : unavailable dans la zone lon Disponibilité : unavailable dans la zone sgp --- --------------------------------- ---
et que la page de votre navigateur s'ouvre pour finaliser la commande ! :)
Pour ceux qui préfèrent Python, un script écrit par Paul-Louis NECH disponible sur Github, sous licence GPL v3, qui fait en gros la même chose, mais que je n'ai pas testé : BuyKim
Et toujours sur GitHub, un autre script python (que je n'ai pas non plus testé) et qui est disponible à l'url : https://git.pofilo.fr/pofilo/kimsufi et présenté à la page https://www.pofilo.fr/post/20180811-kimsufi/.
Et encore, signalé par seb dans les commentaires de ce billet, un autre sript sur GitHub en python (que je n'ai pas non plus testé) et qui est disponible à l'url : https://github.com/essembeh/kimsufi-checker.