diff --git a/REST/README.md b/REST/README.md index 191f33e..bdaee7f 100644 --- a/REST/README.md +++ b/REST/README.md @@ -1,10 +1,10 @@ -REST +DOIREST ========== -Scripts pour se connecter à l’API WoS (Web of Science) pour l’interroger et télécharger un corpus de notices, au format JSON ou au format XML, en utilisant -le protocole [REST](https://fr.wikipedia.org/wiki/Representational_state_transfer). Il n’y a pas de session à proprement parler, mais se passe en 2 étapes -avec un script `bash` dédié pour chacune de ces étapes : +Scripts pour se connecter à l’API WoS (Web of Science) pour l’interroger et télécharger un corpus de notices, au format JSON ou au format XML, en utilisant +le protocole [REST](https://fr.wikipedia.org/wiki/Representational_state_transfer). Il n’y a pas de session à proprement parler, mais se passe en 2 étapes +avec un script `bash` dédié pour chacune de ces étapes : | Étapes | Scripts | @@ -13,7 +13,7 @@ | Téléchargement des notices | `rWosRetrieve.sh` | -Dans le cas particulier d’une recherche à partir d’une liste de DOIs, on utilise le script `rWosSearchByDoi.sh` qui fait à la fois l’interrogation de l’API et le téléchargement des notices, remplaçant ainsi les scripts `rWosQuery.sh` et `rWosRetrieve.sh`. +Dans le cas particulier d’une recherche à partir d’une liste de DOI, on utilise le script `rWosSearchByDoi.sh` qui fait à la fois l’interrogation de l’API et le téléchargement des notices, remplaçant ainsi les scripts `rWosQuery.sh` et `rWosRetrieve.sh`. Ces scripts ont besoin pour fonctionner de trois programmes qui sont généralement présents dans les distributions Unix/Linux : @@ -21,17 +21,17 @@ - `jq` - `xmllint` -Pour tous ces scripts, toutes les informations renvoyées par le programme `curl` sur la sortie standard ou sur l’erreur standard sont conservées dans deux fichiers, +Pour tous ces scripts, toutes les informations renvoyées par le programme `curl` sur la sortie standard ou sur l’erreur standard sont conservées dans deux fichiers, respectivement `WosApiOut.json` ou `WosApiOut.xml` (suivant le format des notices), et `WosApiErr.txt`. ## rWosQuery.sh -Ce script permet l’interrogation de l’API WoS à l’aide d'une clé chiffrée. Par souci de sécurité, il n’y a pas d’option pour la clé en ligne de commande. -Elle sera demandé par la suite de façon plus sûre. Par défaut, l’interrogation se fait sur l’ensemble des bases WoS et retourne un numéro de requête (*queryId*), -le nombre de notices trouvées, le nombre total de notices dans les bases WoS interrogées ainsi que 5 notices complètes. -Il est possible de limiter la recherche à certaines bases WoS avec l’option “-b”, on peut choisir de ne garder que certains champs dans les notices grâce à l’option “-f” -et on peut modifier l’ordre de tri des notices avec l’option `-t`. +Ce script permet l’interrogation de l’API WoS à l’aide d'une clé chiffrée. Par souci de sécurité, il n’y a pas d’option pour la clé en ligne de commande. +Elle sera demandé par la suite de façon plus sûre. Par défaut, l’interrogation se fait sur l’ensemble des bases WoS et retourne un numéro de requête (*queryId*), +le nombre de notices trouvées, le nombre total de notices dans les bases WoS interrogées ainsi que 5 notices complètes. +Il est possible de limiter la recherche à certaines bases WoS avec l’option “-b”, on peut choisir de ne garder que certains champs dans les notices grâce à l’option “-f” +et on peut modifier l’ordre de tri des notices avec l’option `-t`. ### Usage @@ -44,8 +44,8 @@ rWosQuery.sh -h ``` -À noter que les options `-c`, `-l`, `-m` et `-p` be sont pas compatibles entre elles et on ne peut en utiliser -au plus qu'une seule. Les valeurs possibles pour les options `-b`, `-f` et `-t` sont données dans les [tables WoS](https://gitbucket.inist.fr/tdm/api-wos#tables-wos) +À noter que les options `-c`, `-l`, `-m` et `-p` be sont pas compatibles entre elles et on ne peut en utiliser +au plus qu'une seule. Les valeurs possibles pour les options `-b`, `-f` et `-t` sont données dans les [tables WoS](https://gitbucket.inist.fr/tdm/api-wos#tables-wos) de la page rincipale. @@ -97,13 +97,13 @@ ## rWosRetrieve.sh -Ce script permet de télécharger les notices trouvées lors de l’interrogation de l’API WoS en utilisant la clé d’identification -(demandée hors ligne de commande, par sécurité) et le numéro de requête (*queryId*) obtenu à l’étape précédente. -En cas d’interruption du transfert, il est possible de reprendre le téléchargement là où il s'est arrêté en indiquant un nouveau numéro de départ (option “-o”). -Si vous avez utilisé les options `-f` et/ou `-t` lors de l’interrogation de l’API, vous devez utiliser les mêmes options avec les mêmes valeurs pour +Ce script permet de télécharger les notices trouvées lors de l’interrogation de l’API WoS en utilisant la clé d’identification +(demandée hors ligne de commande, par sécurité) et le numéro de requête (*queryId*) obtenu à l’étape précédente. +En cas d’interruption du transfert, il est possible de reprendre le téléchargement là où il s'est arrêté en indiquant un nouveau numéro de départ (option “-o”). +Si vous avez utilisé les options `-f` et/ou `-t` lors de l’interrogation de l’API, vous devez utiliser les mêmes options avec les mêmes valeurs pour décharger le corpus de notices -Si vous recevez un message signalant une limitation de la bande passante (*bandwidth throttling*), vous pouvez modifier le délai entre deux itérations -(1 seconde par défaut) avec la variable d’environnement `WOS_DELAY`. Par exemple, pour passer à un délai de 3 secondes : +Si vous recevez un message signalant une limitation de la bande passante (*bandwidth throttling*), vous pouvez modifier le délai entre deux itérations +(1 seconde par défaut) avec la variable d’environnement `WOS_DELAY`. Par exemple, pour passer à un délai de 3 secondes : ```bash export WOS_DELAY=3 @@ -113,7 +113,7 @@ ### Usage ```bash - rWosRetrieve.sh -q queryId -n nb_notices -r (résultats|-) [ -o offset ] + rWosRetrieve.sh -q queryId -n nb_notices -r (résultats|-) [ -o offset ] [ -f champs ]* [ -t CH:(A|D)[,CH:(A|D)]* ] [ -j cookie_jar ] [ -ix ] rWosRetrieve.sh -h @@ -147,29 +147,31 @@ ``` -## rWosSearchByDoi.sh +## rWosSearchByDoi.sh -Ce script permet à la fois l’interrogation de l’API WoS à partir d’une liste de DOIs et le téléchargement des notices trouvées en utilisant la clé d’identification. -Contrairement au script `rWosQuery.sh`, on n’a pas d’options pour limiter la recherche par période ou par base. On n’a pas non plus d’option de tri parce que la -recherche se fait par paquet de 100 DOI maximum et le tri se ferait au sein de chaque paquet au lieu de se faire sur l’ensemble du corpus. -En fait, on récupère les notices dans l’ordre des DOI. +Ce script permet à la fois l’interrogation de l’API WoS à partir d’une liste de DOI ou d’identifiants WoS (“UT”) et le téléchargement des notices trouvées en utilisant la clé d’identification. +Contrairement au script `rWosQuery.sh`, on n’a pas d’options pour limiter la recherche par période ou par base. On n’a pas non plus d’option de tri parce que la +recherche se fait par paquet de 100 DOI maximum et le tri se ferait au sein de chaque paquet au lieu de se faire sur l’ensemble du corpus. +En fait, on récupère les notices dans l’ordre des DOI. -Par défaut, chaque itération se fait avec 90 DOI parce qu’on est limité à 100 notices par requête et il arrive qu’un DOI ramène plusieurs notices. -En l’occurrence, il s’agit du même document, mais vu à différentes étapes comme une prépublication (“*preprint*”) et la version définitive. +Par défaut, chaque itération se fait avec 90 DOI parce qu’on est limité à 100 notices par requête et il arrive qu’un DOI ramène plusieurs notices. +En l’occurrence, il s’agit du même document, mais vu à différentes étapes comme une prépublication (“*preprint*”) et la version définitive. + +**Attention** : la liste des identifiants, DOI ou UT, ne doit pas comporter de [retour chariot](https://fr.wikipedia.org/wiki/Retour_chariot) (typique des fins de ligne sous Windows), ni de [BOM](https://fr.wikipedia.org/wiki/Indicateur_d%27ordre_des_octets). Il est possible sur certains éditeurs de texte, comme [Notepad++](https://notepad-plus-plus.org/), de vérifier et modifier l’encodage (ANSI ou UTF-8 sans BOM) et le saut de ligne (format Unix LF) de votre fichier. ### Usage ```bash rWosSearchByDoi.sh -d (fichier|-) -r (résultats|-) [ -f champs ]* - [ -T taille ] [ -j cookie_jar ] [ -ix ] + [ -T taille ] [ -j cookie_jar ] [ -ixw ] rWosSearchByDoi.sh -h ``` -### Options principales +### Options principales ```txt - -d indique le nom du fichier avec la liste des DOIs à chercher. Si on - a un tiret “-” en argument, la liste de DOIs est lue sur l’entrée + -d indique le nom du fichier avec la liste des DOI à chercher. Si on + a un tiret “-” en argument, la liste de DOI est lue sur l’entrée standard -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) @@ -183,7 +185,6 @@ avec un maximum de 100) -x indique que les notices doivent être en XML au lieu de JSON, le format par défaut + -w indique que la recherche se fait avec les identifiants WoS (“UT”) au + lieu des DOI ``` - - - diff --git a/REST/rWosSearchByDoi.sh b/REST/rWosSearchByDoi.sh index 128b393..6d1e18c 100755 --- a/REST/rWosSearchByDoi.sh +++ b/REST/rWosSearchByDoi.sh @@ -4,13 +4,13 @@ # Initialisation des variables pour les options programme=$(basename $0) substitut=$(echo $programme | sed 's/./ /g') -version='0.3.1' -modif='25/07/2022' +version='1.2.1' +modif='10/11/2022' function usage { echo "Usage : $programme -d (fichier|-) -r (résultats|-) [ -f champs ]* " -echo " $substitut [ -T taill ] [ -j cookie_jar ] [ -ix ] " +echo " $substitut [ -T taille ] [ -j cookie_jar ] [ -ixw ] " echo " $programme -h " } @@ -21,7 +21,7 @@ Usage ===== $programme -d (fichier|-) -r (résultats|-) [ -f champs ]* - $substitut [ -j cookie_jar ] [ -ix ] + $substitut [ -T taille ] [ -j cookie_jar ] [ -ixw ] $programme -h Options @@ -41,6 +41,8 @@ avec un maximum de 100) -x indique que les notices doivent être en XML au lieu de JSON, le format par défaut + -w indique que la recherche se fait avec les identifiants WoS (“UT”) au + lieu des DOI EOT @@ -50,10 +52,11 @@ # Déclaration explicite des tableaux “bases” et “champs” declare -a champs +tag='DO' format='json' # Options -while getopts d:f:hij:r:T:x i +while getopts d:f:hij:r:T:xw i do case $i in d) dois=$OPTARG;; @@ -64,6 +67,7 @@ r) sortie=$OPTARG;; T) taille=$OPTARG;; x) format='xml';; + w) tag='UT';; \?) echo >&2 usage >&2 exit 1;; @@ -92,6 +96,8 @@ if [[ $sortie = '-' ]] then sortie='/dev/fd/1' +else + touch $sortie fi if [[ -z $cookiejar ]] @@ -168,12 +174,25 @@ extra="$extra, \"optionOther\": \"RI+On\"" fi +function nettoie +{ +if [[ -f tmpWos$$.json ]] +then + rm -f tmpWos$$.json +fi + +if [[ -f tmpWos$$.txt ]] +then + rm -f tmpDoi$$.txt +fi +} + function requete { end=$(( $3 + $2 - 1 )) printf " -> %d - %d " $3 $end >&2 -cat << EOT > tee search.json +cat << EOT > search.json { "databaseId": "WOS", "lang": "en", @@ -198,7 +217,7 @@ echo "" echo "Erreur : la réponse de l‘API est incorrecte [code jq = $cr]" >&2 echo "" - # nettoie + nettoie exit 6 fi @@ -215,7 +234,7 @@ echo " " echo "Erreur : “$msg” " echo " " - # nettoie + nettoie exit 5 else @@ -230,7 +249,7 @@ echo " " echo "Erreur : le nombre de réponses ($rec) est supérieur au maximum autorisé (100)" echo " " - # nettoie + nettoie exit 7 fi @@ -317,36 +336,41 @@ SECONDS=0 +# Nettoyage des données d’entrée +perl -pe 's/\x{EF}\x{BB}\x{BF}//go; s/\r//go;' $dois > tmpDoi$$.txt + while read x do - nb=$(( $nb + 1 )) +nb=$(( $nb + 1 )) - if [[ $nb -eq 1 ]] - then - liste="\\\"$x\\\"" - else - liste="$liste OR \\\"$x\\\"" - fi +if [[ $nb -eq 1 ]] +then + liste="\\\"$x\\\"" +else + liste="$liste OR \\\"$x\\\"" +fi - if [[ $nb -eq $max ]] - then - requete "DO=($liste)" "$nb" "$offset" - offset=$(( $offset + $nb )) - liste="" - nb=0 +if [[ $nb -eq $max ]] +then + requete "$tag=($liste)" "$nb" "$offset" + offset=$(( $offset + $nb )) + liste="" + nb=0 - while [[ $SECONDS -lt $delai ]] - do - sleep 0.5 - done - SECONDS=0 + while [[ $SECONDS -lt $delai ]] + do + sleep 0.5 + done + SECONDS=0 - fi -done < $dois +fi +done < tmpDoi$$.txt + +rm -f tmpDoi$$.txt if [[ $nb -gt 0 ]] then - requete "DO=($liste)" "$nb" "$offset" + requete "$tag=($liste)" "$nb" "$offset" fi nb=$(( $offset + $nb - 1 )) @@ -375,18 +399,26 @@ }' $sortie | (echo '{"Records": {"records": {"REC": ['; cat; echo ']}}}') | jq . > tmpWos$$.json + if [[ $? -eq 0 ]] + then + mv tmpWos$$.json $sortie + else + echo "Erreur détectée par “jq” : vérifiez les données dans le fichier \"tmpWos$$.json\"." >&2 + fi - mv tmpWos$$.json $sortie -# offset=$(perl -ne '$nb ++ if /"UID": /o;}{print $nb;' $sortie) else perl -ne 'foreach $rec (m|()|go) { print "$rec\n"; }' $sortie | (echo ''; cat; echo '') | xmllint -format - > tmpWos$$.xml + if [[ $? -eq 0 ]] + then + mv tmpWos$$.json $sortie + else + echo "Erreur détectée par “xmllint” : vérifiez les données dans le fichier \"tmpWos$$.json\"." >&2 + fi - mv tmpWos$$.xml $sortie -# offset=$(perl -ne 'foreach $r (m|(