diff --git a/WosRetrieve.sh b/WosRetrieve.sh index 761b749..97ce337 100755 --- a/WosRetrieve.sh +++ b/WosRetrieve.sh @@ -4,13 +4,13 @@ # Initialisation des variables pour les options programme=$(basename $0) substitut=$(echo $programme | sed 's/./ /g') -version='1.1.2' -modif='121/02/2022' +version='1.3.6' +modif='14/03/2022' function usage { echo "Usage : $programme -s sid -q queryId -n nb_notices -r résultat " -echo " $substitut [ -o offset ] [ -c cookies ] " +echo " $substitut [ -o offset ] [ -t taille ] [ -c cookies ] " echo " $programme -h " } @@ -20,27 +20,33 @@ Usage ===== - $programme -s sid -q queryId -n nb_notices -r résultat - $substitut [ -o offset ] [ -c cookies.txt ] + $programme -s sid -q queryId -n nb_notices -r résultat + $substitut [ -o offset ] [ -t taille ] [ -c cookies.txt ] $programme -h Options ======= - -c indique le nom du fichier qui recevra les cookies (“cookies.txt” + -c indique le nom du fichier qui recevra les cookies (“cookies.txt” par défaut) -h affiche cette aide - -n indique le nombre total de notices WoS à télécharger (la valeur - maximale est donnée par le programme envoyant la requête à l’API - WoS) - -o indique à partir de quel numéro (offset) on veut télécharger les - notices, en particulier pour reprendre un téléchargement après un + -n indique le nombre total de notices WoS à télécharger (la valeur + maximale est donnée par le programme envoyant la requête à l’API + WoS) + -o indique à partir de quel numéro (offset), on veut télécharger les + notices, en particulier pour reprendre un téléchargement après un problème de connexion (1 par défaut) - -q indique le numéro de la requête “queryId” dont on veut télécharger + -q indique le numéro de la requête “queryId” dont on veut télécharger les résultats - -r indique le nom du fichier résultat (pour la sortie standard, utiliser + -r indique le nom du fichier résultat (pour la sortie standard, utiliser le tiret “-” comme argument de l’option) - -s indique le jeton d’authentification “SID” obtenu avec le programme + -s indique le jeton d’authentification “SID” obtenu avec le programme d’authentification à l'API WoS + -t indique le nombre de notices à télécharger à chaque itération + (100 par défaut) + +N.B. : la variable d‘environnement WOS_DELAY permet de modifier le délai + entre deux itérations (1 seconde par défaut). Sa valeur doit être + un entier positif supérieur à 1, par ex. : “export WOS_DELAY=3” EOT @@ -55,11 +61,8 @@ fi } -# Déclaration explicite du tableau “liste” -declare -a liste - # Options -while getopts c:hn:o:q:r:s: i +while getopts c:hn:o:q:r:s:t: i do case $i in c) cookie=$OPTARG;; @@ -69,6 +72,7 @@ q) qid=$OPTARG;; r) sortie=$OPTARG;; s) sid=$OPTARG;; + t) taille=$OPTARG;; \?) echo >&2 usage >&2 exit 1;; @@ -101,8 +105,8 @@ exit 2 fi -if [[ -z $offset ]] -then +if [[ -z $offset ]] +then offset=1 else if [[ $offset =~ ^[1-9][0-9]*$ ]] @@ -118,7 +122,7 @@ fi fi -# Vérification de la présence des programmes +# Vérification de la présence des programmes # “curl” et “xmllint” for i in curl xmllint do @@ -132,10 +136,17 @@ fi done +# Vérification de la variable '$WOS_DELAY' +if [[ -n $WOS_DELAY && ! $WOS_DELAY =~ ^[1-9][0-9]*$ ]] +then + echo "Erreur : la valeur de la variable \$WOS_DELAY doit être un entier supérieur à 1" >&2 + exit 2 +fi + # Nettoyage en cas d’arrêt prématuré trap nettoie HUP INT QUIT TERM -# Définition des fichiers de sortie +# Définition des fichiers de sortie out='WosApiOut.txt' err='WosApiErr.txt' @@ -160,15 +171,33 @@ EOT curl -X POST -d @retrieve$$.xml -b $cookie -c $cookie -v 'http://search.webofknowledge.com/esti/wokmws/ws/WokSearch?wsdl' \ - -H "Cookie: SID=$sid" 2> $err | xmllint -format - > $out + -H "Cookie: SID=$sid" 2> $err | xmllint -format - > $out 2>> $err -printf " \r" >&2 +return $? } # Itération -max=100 +max=${taille:-100} +delai=${WOS_DELAY:-1} total=$(( $nb - $offset + 1 )) +# Vérification de ces variables +if [[ $max -lt 1 ]] +then + echo "Erreur : le nombre de notices par itération doit être compris entre 1 et 100" >&2 + exit 4 +elif [[ $max -gt 100 ]] +then + echo "Erreur : le nombre de notices par itération ne peut dépasser 100" >&2 + exit 4 +fi + +if [[ $delai -lt 1 ]] +then + echo "Erreur : la variable \$WOS_DELAY ne peut pas valoir moins d‘une seconde" + exit 4 +fi + while [[ $total -gt 0 ]] do if [[ $total -lt $max ]] @@ -176,10 +205,22 @@ max=$total fi - cherche "$offset" "$max" + SECONDS=0 + + rc=$(cherche "$offset" "$max") + + if [[ $rc -gt 0 ]] + then + echo "" + echo "Erreur : la réponse de l‘API est incorrecte [code xmllint = $rc]" >&2 + echo "" + exit 4 + fi + + printf " \r" >&2 rc=$(grep -c '' $out 2> /dev/null) - if [[ $rc -gt 0 ]] + if [[ $rc -gt 0 ]] then cat $out >> $sortie else @@ -201,6 +242,12 @@ total=$(( $total - $max )) offset=$(( $offset + $max )) + + while [[ $total -gt 0 && $SECONDS -lt $delai ]] + do + sleep 0.5 + done + done printf " \r" >&2 @@ -209,7 +256,3 @@ exit 0 - - - -