Newer
Older
api-wos / WosRetrieve.sh
@besagni besagni on 21 Feb 2022 4 KB Mise à jour des scripts
#!/bin/bash


# Initialisation des variables pour les options
programme=$(basename $0)
substitut=$(echo $programme | sed 's/./ /g')
version='1.1.2'
modif='121/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>$qid</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>(.+?)</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