Réseau - Web - GNU/Linux

2018 29 août

Script de réservation de serveur kimsufi

Rédigé par Marc GUILLAUME | 5 commentaires

Utilité

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.json

On 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.

5 commentaires

#1  - IB a dit :

Merci pour ce script !!
Facile à adapter pour OSX et à l'air de fonctionner nickel ;)

Répondre
#2  - Marc GUILLAUME a dit :

Je ne connais pas beaucoup OSX, mais en fait ça doit fonctionner avec n'importe quel système capable d'utiliser php en ligne de commande et ayant la bibliothèque cURL. Et comme OSX est, d'après mes souvenirs, basé sur FreeBSD beaucoup de commandes et bibliothèques UNIX doivent fonctionner.

Répondre
#3  - bidouiller.fr a dit :

Bonjour et merci pour le script.
Je suis sous OSX et j'ai juste modifié la ligne :
shell_exec('/usr/bin/firefox --new-window https://www.kimsufi.com/fr/commande/kimsufi.xml?reference='.$s->reference.'&quantity=1');
par
shell_exec('open /Applications/Safari.app/ https://www.kimsufi.com/fr/commande/kimsufi.xml?reference='.$s->reference.'&quantity=1');

j'espere que cela va fonctionner. pour le moment je suis bien dans la phase "Caramba, encore raté ! ;(" mais je ne désespère pas ;-)

Répondre
#4  - seb a dit :

Bonjour

J'ai trouvé ce billet très intéressant, tellement que j'ai fini par développer un script équivalent en python (je suis pas fan de php :) ) qui pourra peut être être utile à quelqu'un d'autre que moi:
https://github.com/essembeh/kimsufi-checker

++

Répondre
#5  - Marc GUILLAUME a dit :

Bonjour,
je ne suis pas non plus un inconditionnel de php, mais c'est répandu, et je n'ai pas encore eu le temps de vraiment me pencher sur les "nouveaux" langages comme Python. Pour ce que j'ai vu sur votre page github votre script semble beaucoup plus ambitieux que ce simple petit bout de code.
En tout cas tant mieux si ce petit billet a pu faire avancer le schmilblik !

Répondre

Écrire un commentaire

Quelle est la deuxième lettre du mot ygfrjf ?

Fil RSS des commentaires de cet article

À propos

Yakati.com - Réseau - Web - GNU/Linux © 2017

Généré par PluXml en 0.029s  Compression GZIP activée - Administration

Mes coordonnées

Marc Guillaume
contact[at]yakati.com
79150 ÉTUSSON

Crédits

Pour la gestion du contenu

Généré par PluXml, le Blog ou Cms sans base de données

Pour le contenu

Licence Creative Commons
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.

Pour le thème

Thème SOLID de blacktie.co adapté pour PluXml