diff --git a/SOAP/WosQuery.sh b/SOAP/WosQuery.sh index a3955f1..a09d0dd 100755 --- a/SOAP/WosQuery.sh +++ b/SOAP/WosQuery.sh @@ -4,14 +4,14 @@ # Initialisation des variables pour les options programme=$(basename $0) substitut=$(echo $programme | sed 's/./ /g') -version='1.2.3' -modif='11/03/2022' +version='1.2.4' +modif='22/07/2022' function usage { echo "Usage : $programme -s sid -q requête [ -p (début:fin|[124]week) ] " -echo " $substitut [ -b [WOS:]base ]* [ -f champs ]* [ -t CH:[AD] ] " -echo " $substitut [ -n notices ] [ -c cookies ] [ -i ]" +echo " $substitut [ -b [WOS:]base ]* [ -f champs ]* [ -t CH:(A|D)[,CH:(A|D)]* ] " +echo " $substitut [ -n notices ] [ -j cookie_jar ] [ -i ]" echo " $programme -h " } @@ -42,16 +42,15 @@ -b limite la recherche à une ou plusieurs bases (e.g. “WOS:SCI”). Cette option est répétitive et “WOS:” est facultatif (par défaut, la recherche se fait sur l’ensemble du WoS) - -c indique le nom du fichier qui recevra les cookies (“cookies.txt” - par défaut) -f limite les champs présents dans les notices téléchargées. Cette option est répétitive (par défaut, tous les champs sont présents) -i ajoute dans la réponse de l’API la liste des identifiants WoS des notices retournées (5 par défaut ou valeur de l’option “-n”) + -j indique le nom du fichier qui recevra les cookies (“cookies.txt” -n indique le nombre de notices, entre 1 et 100, à retourner (5 par défaut) -t trie les résultats sur un champ (nom abrégé à 2 majuscules) de - façon croissante (A) ou décroissante (D) ou par pertinene (RS) + façon croissante (A) ou décroissante (D) ou par pertinence (RS) forcément décroissante EOT @@ -67,24 +66,25 @@ fi } -# Déclaration explicite du tableau “bases” +# Déclaration explicite des tableaux “bases”, “champs” et “tri” declare -a bases declare -a champs +declare -a tri # Options -while getopts b:c:f:hin:p:q:r:s:t: i +while getopts b:f:hij:n:p:q:r:s:t: i do case $i in b) bases+=($OPTARG);; - c) cookie=$OPTARG;; f) champs+=($OPTARG);; h) aide;; i) recid=1;; + j) cookiejar=$OPTARG;; n) nrec=$OPTARG;; p) span=$OPTARG;; q) query=$OPTARG;; s) sid=$OPTARG;; - t) tri=$OPTARG;; + t) tri+=($OPTARG);; \?) echo >&2 usage >&2 exit 1;; @@ -101,9 +101,9 @@ exit 2 fi -if [[ -z $cookie ]] +if [[ -z $cookiejar ]] then - cookie='cookies.txt' + cookiejar='cookies.txt' fi if [[ ! $nrec ]] @@ -283,10 +283,10 @@ EOT -out='WosApiOut.txt' +out='WosApiOut.xml' err='WosApiErr.txt' -curl -X POST -d @search$$.xml -b $cookie -c $cookie -v 'http://search.webofknowledge.com/esti/wokmws/ws/WokSearch?wsdl' \ +curl -X POST -d @search$$.xml -b $cookiejar -c $cookiejar -v 'http://search.webofknowledge.com/esti/wokmws/ws/WokSearch?wsdl' \ -H "Cookie: SID=$sid" 2> $err | xmllint -format - > $out qid=$(perl -ne 'print "$1" if m|(.+?)|;' $out) diff --git a/SOAP/WosSearchByDoi.sh b/SOAP/WosSearchByDoi.sh index ba7da52..1e3d0ef 100755 --- a/SOAP/WosSearchByDoi.sh +++ b/SOAP/WosSearchByDoi.sh @@ -4,14 +4,13 @@ # Initialisation des variables pour les options programme=$(basename $0) substitut=$(echo $programme | sed 's/./ /g') -version='1.3.3' -modif='21/02/2022' +version='1.6.1' +modif='21/07/2022' function usage { -echo "Usage : $programme -s sid -d (fichier|-) -r (résultats|-) " -echo " $substitut [ -p (début:fin|[124]week) ] [ -b [WOS:]base ]* " -echo " $substitut [ -f champs ]* [ -c cookies ] [ -i ] " +echo "Usage : $programme -s sid -d (fichier|-) -r (résultats|-) [ -f champs ]* " +echo " $substitut [ -T taille ] [ -j cookie_jar ] [ -i ] " echo " $programme -h " } @@ -21,9 +20,8 @@ Usage ===== - $programme -s sid -d (fichier|-) -r (résultats|-) - $substitut [ -p (début:fin|[124]week) ] [ -b [WOS:]base ]* - $substitut [ -f champs ]* [ -c cookies ] [ -i ] + $programme -s sid -d (fichier|-) -r (résultats|-) + $substitut [ -f champs ]* [ -T taille ] [ -c cookies ] [ -i ] $programme -h Options principales @@ -32,26 +30,25 @@ a un tiret “-” en argument, la liste de DOIs est lue sur l’entrée standard -h affiche cette aide - -p limite la recherche dans la base de données à la période indiquée - sous forme aaaa-mm-jj:aaaa-mm-jj (e.g., “2000-01-01:2020-07-31”) - ou sous forme “1week”, “2week” ou “4week” -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 + -T indique le nombre de notices à télécharger à chaque itération + (100 par défaut) Autres options ============== - -b limite la recherche à une ou plusieurs bases (e.g. “WOS:SCI”). - Cette option est répétitive et “WOS:” est facultatif (par défaut, - la recherche se fait sur l’ensemble du WoS) - -c indique le nom du fichier qui recevra les cookies (“cookies.txt” - par défaut) -f limite les champs présents dans les notices téléchargées. Cette option est répétitive (par défaut, tous les champs sont présents) -i ajoute dans la réponse de l’API la liste des identifiants WoS des notices retournées à chaque itération + -j indique le nom du fichier qui recevra les cookies (“cookies.txt” + 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 @@ -64,25 +61,27 @@ then rm -f search$$.xml fi +if [[ -f tmpWos$$.xml ]] +then + rm -f tmpWos$$.xml +fi } # Déclaration explicite du tableau “bases” -declare -a bases declare -a champs # Options -while getopts b:c:d:f:hip:r:s: i +while getopts d:f:hij:r:s:T: i do case $i in - b) bases+=($OPTARG);; - c) cookie=$OPTARG;; d) dois=$OPTARG;; f) champs+=($OPTARG);; h) aide;; i) recid=1;; - p) span=$OPTARG;; + j) cookiejar=$OPTARG;; r) sortie=$OPTARG;; s) sid=$OPTARG;; + T) taille=$OPTARG;; \?) echo >&2 usage >&2 exit 1;; @@ -109,9 +108,9 @@ sortie='/dev/fd/1' fi -if [[ -z $cookie ]] +if [[ -z $cookiejar ]] then - cookie='cookies.txt' + cookiejar='cookies.txt' fi # Vérification de la présence des programmes @@ -128,68 +127,7 @@ fi done -# Génération d’une liste de bases en XML -# à partir de l’option “-b” -# valeurs possibles : SCI, SSCI, AHCI, ISTP, ISSHP, IC, CCR, BSCI, BHCI et ESCI -declare -a xml1 - -if [[ ${#bases[@]} -gt 0 ]] -then - for i in ${bases[@]} - do - if [[ $i =~ ^[A-Z]+:[A-Z]+$ ]] - then - coll=${i%:*} - edit=${i#*:} - else - coll='WOS' - edit=$i - fi - xml1+=(" ") - xml1+=(" $coll") - xml1+=(" $edit") - xml1+=(" ") - done -fi - -# Génération d’une période en XML avec l’option “-p” -declare -a xml2 - -if [[ -n $span ]] -then - regex="[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])" - if [[ $span =~ ^$regex:$regex$ ]] - then - begin=${span%:*} - end=${span#*:} - # Vérification de la validité de chaque date - for i in $begin $end - do - day=$(date -d $i 2> /dev/null) - if [[ -z $day ]] - then - echo "" - echo "Erreur : date “$i” invalide" >&2 - nettoie - exit 4 - fi - done - xml2+=(" ") - xml2+=(" $begin") - xml2+=(" $end") - xml2+=(" ") - elif [[ $span =~ ^[124]week$ ]] - then - xml2=(" $span") - else - echo "" - echo "Erreur : argument incorrect pour l’option “-p”" >&2 - nettoie - exit 4 - fi -fi - -# Génération d’une période en XML avec l’option “-f” +# Génération d’une liste de champs en XML avec l’option “-f” # Valeurs possibles : # UID, pub_info, names, full_name, titles, contributor, language, doctypes, # conf_title, conf_date, conf_host, conf_locations, sponsors, keywords, @@ -223,6 +161,45 @@ max=0 total=0 +# fonction verifie +function verifie +{ +perl -ne 'if (/]*>(.+)/) { + $r = $1; + $r =~ s|.*||; + $r =~ s/<//go; + $r =~ s/&(\w+;)/&$1/go; + $r =~ s||\n|go; + $r =~ s| tmpWos$$.xml + +nr=$(cat tmpWos$$.xml | wc -l) + +(echo "" ; cat tmpWos$$.xml; echo "") | + xmllint -format - > /dev/null 2>> $err +rc=$? + +rm -f tmpWos$$.xml + +if [[ $rc -gt 0 ]] +then + echo "" + echo "Erreur : la réponse de l‘API est incorrecte [code xmllint = $rc]" >&2 + echo " $nr / $2 notices trouvées" + nettoie + exit 6 +elif [[ $nr -lt $2 ]] +then + echo "" + echo "Erreur : la réponse de l‘API est incomplète " >&2 + echo " $nr / $2 notices trouvées" + nettoie + exit 6 +fi +} + # Fonction de génération du fichier SOAP, d’interrogation # de l’API et de test de la réponse function requete @@ -245,34 +222,16 @@ DO=($1) EOT -# 2) cas des bases WoS -if [[ ${#xml1[@]} -gt 0 ]] -then - for i in "${xml1[@]}" - do - echo "$i" >> search$$.xml - done -fi - -# 3) cas de la période -if [[ ${#xml2[@]} -gt 0 ]] -then - for i in "${xml2[@]}" - do - echo "$i" >> search$$.xml - done -fi - -# 4) Nb de notices +# 2) Nb de notices cat << EOT >> search$$.xml en 1 - $2 + 100 EOT -# 5) liste des champs affichés (option “-f”) +# 3) liste des champs affichés (option “-f”) if [[ ${#xml3[@]} -gt 0 ]] then @@ -286,7 +245,7 @@ echo " " >> search$$.xml fi -# 6) Affichage des identifiants de notices retournées +# 4) Affichage des identifiants de notices retournées if [[ $recid -gt 0 ]] then echo " " >> search$$.xml fi -# 7) fin des paramètres +# 5) fin des paramètres cat << EOT >> search$$.xml