PHP: igalerie - scan automatique des albums (ftp)

igalerie est une application php qui permet de créer des galeries d'images en ligne.

L'ajout d'images dans la galerie peut se faire via ftp (très pratique) mais il faut obligatoirement exécuter une fonction pour que les images soient affichées dans la galerie.

Cette fonction est disponible via un bouton accessible uniquement dans la section administration du site.

Il est donc nécessaire d'être authentifié pour exécuter cette fonction.

Pour effectuer ce scan automatiquement à intervalle régulière, j'ai donc mis au point le script php suivant avec l'extension curl.

Ce script est disponible ici .

$ nl curl.igalerie.php
     1    <?php
     2    session_start();
       
     3    $site = "https://adresse.de.mon.site.igalerie.fr";
     4    $lien = "/login";
     5    $lien3 = "/admin/?q=ftp";
       
     6    $path_cookie = '/tmp/cookie.'.session_id().'.txt';
     7    if (file_exists(realpath($path_cookie))) unlink($path_cookie);
     8    if (!file_exists(realpath($path_cookie))) touch($path_cookie);
       
     9    $curl = curl_init();
       
    10    $postfields = array();
       
    11    $postfields['auth_login'] = 'mon.user';
    12    $postfields['auth_password'] = 'mon.password';
    13    $postfields['submit'] = 'Valider';
       
    14    $postfields = http_build_query($postfields);
       
    15    curl_setopt($curl, CURLOPT_URL, $site.$lien);
    16    curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($path_cookie));
    17    curl_setopt($curl, CURLOPT_COOKIEJAR, realpath($path_cookie));
    18    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    19    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    20    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    21    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    22    curl_setopt($curl, CURLOPT_HEADER, true);
    23    curl_setopt($curl, CURLOPT_POST, true);
    24    curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
    25    curl_setopt($curl, CURLOPT_COOKIESESSION, true);
       
    26    $return = curl_exec($curl);
    27    $headers = curl_getinfo($curl);
       
    28    if (!$headers['http_code'] == '200'){
    29        echo "Erreur Step 1";
    30        exit(1);
    31    }
       
    32    curl_setopt($curl, CURLOPT_URL, $site.$lien3);
    33    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    34    curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($path_cookie));
    35    curl_setopt($curl, CURLOPT_COOKIEJAR, realpath($path_cookie));
    36    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    37    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    38    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    39    curl_setopt($curl, CURLOPT_HEADER, true);
    40    curl_setopt($curl, CURLOPT_COOKIESESSION, true);
       
    41    $return = curl_exec($curl);
    42    $headers = curl_getinfo($curl);
       
    43    if (!$headers['http_code'] == '200'){
    44        echo "Erreur Step 2";
    45        exit(1);
    46    }
       
    47    $dom = new DOMDocument;
    48    @$dom->loadHTML($return);
    49    $inputs = $dom->getElementsByTagName('input');
    50    foreach ($inputs as $input) {
    51        $cle = $input->getAttribute('name');
    52        $valeur = "";
    53        if($cle=="anticsrf"){
    54            $valeur = $input->getAttribute('value');
    55        }
    56        if(!$valeur=="") break;
    57    }
       
    58    $postfields = array();
       
    59    $postfields['publish_images'] = 'on';
    60    $postfields['anticsrf'] = "$valeur";
    61    $postfields['action'] = 'scan';
       
    62    $postfields = http_build_query($postfields);
       
    63    curl_setopt($curl, CURLOPT_URL, $site.$lien3);
    64    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    65    curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($path_cookie));
    66    curl_setopt($curl, CURLOPT_COOKIEJAR, realpath($path_cookie));
    67    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    68    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    69    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    70    curl_setopt($curl, CURLOPT_HEADER, true);
    71    curl_setopt($curl, CURLOPT_COOKIESESSION, true);
    72    curl_setopt($curl, CURLOPT_POST, true);
    73    curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
       
    74    $return = curl_exec($curl);
    75    $headers = curl_getinfo($curl);
       
    76    if (!$headers['http_code'] == '200'){
    77        echo "Erreur Step 3";
    78        exit(1);
    79    }
       
    80    @$dom->loadHTML($return);
    81    $div = $dom->getElementById('ftp_report');
    82    $ps = $div->getElementsByTagName('p');
       
    83    foreach ($ps as $p => $value) {
    84        echo "$value->nodeValue\n";
    85    }
       
    86    curl_close($curl);
       
    87    exit(0);

Quelques petites explications :

Ligne 4 : adresse http(s) de la galerie.

Ligne 5 : lien qui permet d'accéder à la page d'authentification.

Ligne 6 : lien qui permet d'accéder à la page du scan ftp.

Ligne 8 à 10 : initialisation du cookie de session.

Ligne 12 : initialisation de l'extension curl.

Ligne 14 à 20 : initialisation du formulaire d'authentification.

Ligne 22 à 35 : validation du formulaire d'authentification.

Le formulaire permettant le scan des albums étant protégé par un champ anti-csrf wikipedia, il est nécessaire de récupérer la valeur de ce champ avant de poster le formulaire.

Ligne 42 à 53 : récupération du contenu de la page contenant le formulaire permettant le scan des albums.

Ligne 60 à 70 : on parse le contenu de la page afin de récupérer la valeur du champ "anticsrf".

Ligne 72 à 78 : initialisation du formulaire de scan.

Ligne 80 à 93 : validation du formulaire de scan.

Ligne 100 à 106 : on parse le contenu de la page, après validation du formulaire, afin de récupérer le rapport du scan et on l'affiche sur la sortie standard.

Ligne 108 à 110 : on ferme la connexion curl et on quitte le script.

Pour l'exécuter :

$ php curl.igalerie.php

Pour ne pas afficher le rapport :

$ php curl.igalerie.php >/dev/null

Pour envoyer le rapport par mail :

$ php curl.igalerie.php | mail -s "Rapport Scan Auto Igalerie" moi@domain.com

info Une entrée crontab pour l'automatisation.