#!/bin/bash # Initialisation des variables pour les options programme=$(basename $0) substitut=$(echo $programme | sed 's/./ /g') version='1.01.0' modif='17/02/2022' function usage { echo "Usage : $programme -s sid -q queryId -n nb_notices -r résultat " echo " $substitut [ -o offset ] [ -c cookies ] " echo " $programme -h " } function aide { cat << EOT Usage ===== $programme -s sid -q queryId -n nb_notices -r résultat $substitut [ -o offset ] [ -c cookies.txt ] $programme -h Options ======= -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 problème de connexion (1 par défaut) -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 le tiret “-” comme argument de l’option) -s indique le jeton d’authentification “SID” obtenu avec le programme d’authentification à l'API WoS EOT exit 0 } function nettoie { if [[ -f retrieve$$.xml ]] then rm -f retrieve$$.xml fi } # Déclaration explicite du tableau “liste” declare -a liste # Options while getopts c:hn:o:q:r:s: i do case $i in c) cookie=$OPTARG;; h) aide;; n) nb=$OPTARG;; o) offset=$OPTARG;; q) qid=$OPTARG;; r) sortie=$OPTARG;; s) sid=$OPTARG;; \?) echo >&2 usage >&2 exit 1;; esac done # Vérification des options if [[ -z $sid || -z $qid || -z $nb || -z $sortie ]] then echo "Erreur : option(s) manquante(s)" >&2 echo "" >&2 usage >&2 echo "" >&2 exit 2 fi if [[ $sortie = '-' ]] then sortie='/dev/fd/1' fi if [[ -z $cookie ]] then cookie='cookies.txt' fi if [[ ! $nb =~ ^[1-9][0-9]*$ ]] then echo "Erreur : le nombre de notices (option “-n”) doit être un entier positif non nul" >&2 exit 2 fi if [[ -z $offset ]] then offset=1 else if [[ $offset =~ ^[1-9][0-9]*$ ]] then if [[ $offset -gt $nb ]] then echo "Erreur : offset supérieur au nombre de notices" >&2 exit 2 fi else echo "Erreur : l’offset (option “-o”) doit être un entier positif non nul" >&2 exit 2 fi fi # Vérification de la présence des programmes # “curl” et “xmllint” for i in curl xmllint do prog=$(which $i 2> /dev/null) if [[ -z $prog ]] then echo "" >&2 echo "Erreur : programme “$i” introuvable. Vérifier \$PATH." >&2 echo "" >&2 exit 2 fi done # Nettoyage en cas d’arrêt prématuré trap nettoie HUP INT QUIT TERM # Définition des fichiers de sortie out='WosApiOut.txt' err='WosApiErr.txt' # fonction “cherche” function cherche { end=$(( $1 + $2 - 1 )) printf " -> %d - %d " $1 $end >&2 cat << EOT > retrieve$$.xml <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:retrieve xmlns:ns2="http://woksearch.v3.wokmws.thomsonreuters.com"> <queryId>$queryId</queryId> <retrieveParameters> <firstRecord>$1</firstRecord> <count>$2</count> </retrieveParameters> </ns2:retrieve> </soap:Body> </soap:Envelope> 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 printf " \r" >&2 } # Itération max=100 total=$(( $nb - $offset + 1 )) while [[ $total -gt 0 ]] do if [[ $total -lt $max ]] then max=$total fi cherche "$offset" "$max" rc=$(grep -c '<return>' $out 2> /dev/null) if [[ $rc -gt 0 ]] then cat $out >> $sortie else msg=$(perl -ne 'print "$1" if m|<faultstring>(\w+)</faultstring>|;' $out) if [[ -n $msg ]] then echo " " >&2 echo "Erreur : $msg ">&2 echo " " >&2 else echo " " >&2 echo "Erreur indéterminée. " >&2 echo "Voir fichier “$err”. " >&2 echo " " >&2 fi nettoie exit 3 fi total=$(( $total - $max )) offset=$(( $offset + $max )) done printf " \r" >&2 nettoie exit 0