Chklinx est un programme, plus précisément un script bash, qui permet de vérifier les URL de la forme "http://un.domaine/..." ou "https://un.domaine/..." des liens contenus dans les ancres <a href=... > dans un fichier quelconque. Ce fichier peut être un fichier htm(l) ou n'importe quel autre fichier (javascript par exemple), du moment que les ancres y apparaissent bien sous la forme :
<a href="http://url_cible" ... > ou <a href="https://url_cible" ... >
Il faut souligner que la version ci-dessous du script teste la validité des seules url commençant par http(s) et non les liens ftp, par exemple.
Le W3C offre bien un service de validation des liens mais l'auteur de cheklinx trouve sa solution complémentaire.
Le script est très court. Il repose essentiellement sur des outils GNU/Linux® de base : wget, bien sûr, utilisé en mode spider pour tester les liens, et les outils de manipulation de chaînes sed et grep. Il comporte deux parties.
La liste des instructions du script est donnée dans le fichier pdf chklinx07.pdf.
Le script à jour est le fichier sh libre : chklinx07.sh.
Pour utiliser le script, le plus commode est de le télécharger et de l'enregistrer dans un dossier propre (dont le nom importe peu, par exemple chklinx). Ensuite, il ne faut pas oublier de le rendre exécutable en utilisant la commande chmod ou l'interface graphique.
Pour les besoins de l'explication, le fichier test.htm est pris comme exemple. Il comporte 10 liens provoquant plusieurs types d'erreurs. Par facilité, ce fichier est copié dans le dossier du script dont le lancement s'effectue alors simplement par :
~/chklinx$ ./chklinx07.sh test.htm
dans un terminal mais, attention, le programme ne vérifie pas l'orthographe du nom de fichier ni sa présence, il teste seulement que le script reçoit bien un argument en entrée !
Par ailleurs, le nom de fichier donné comme argument à l'appel du script ne peut pas être l'URL d'un fichier distant. C'est nécessairement le nom d'un fichier local.
Bien entendu, l'ordinateur doit être connecté à l'internet avant de lancer le script, sinon les erreurs obtenues ne traduisent que l'absence de connexion.
Le script affiche d'abord le nombre de liens qu'il trouve puis la progression du travail, lien par lien, et enfin les erreurs obtenues. Parfois, sur certains liens, la progression semble se figer mais c'est simplement dû aux tentatives et attentes de connexions. D'ailleurs, dans le script donné plus haut, les durées d'attente (paramètres timeout et T de wget, voir le manuel du programme) sont assez courtes et peuvent être allongées pour avoir des résultats plus fiables, au prix d'une plus grande durée d'exécution de chklinx (qui paraît déjà longue quand on attend de manière répétée la fin d'une minute de délai…). Exemple de sortie obtenue avec test.htm :
=========================================
Script bash chklinx de test de liens hypertextuels.
Logiciel libre sous licence CeCILL (voir le texte source du script).
=========================================
Lancement du script du script.
Nombre de liens dans le fichier : 10
1 / 10
=> Erreur n° 1 !
2 / 10
=> Erreur n° 2 !
3 / 10
=> Erreur n° 3 !
4 / 10
=> Erreur n° 4 !
5 / 10
=> Erreur n° 5 !
6 / 10
=> Erreur n° 6 !
7 / 10
=> Erreur n° 7 !
8 / 10
=> Erreur n° 8 !
9 / 10
=> Erreur n° 9 !
10 / 10
=> Erreur n° 10 !
Les fichiers dans ce dossier sont les suivants:
chklinx07.sh erreurs.txt liens.txt messages.txt test.htm
Les messages entiers sont dans le fichier message.txt
=========================================
10 anomalies survenues:
30-octobre-2016_16:24:36
▉ Lien 1: http://www.legrenelle-environnement.gouv.fr/grenelle-environnement/ - Résolution de www.legrenelle-environnement.gouv.fr
(www.legrenelle-environnement.gouv.fr)… échec : Nom ou service inconnu.
▉ Lien 2: http://www2.ademe.fr/ - requête HTTP transmise, en attente de la réponse… 301 Moved Permanently requête HTTP transmise,
en attente de la réponse… 200 OK
▉ Lien 3: http://www.environnnement.ccip.fr/ - Résolution de www.environnnement.ccip.fr (www.environnnement.ccip.fr)… échec : Nom ou service
inconnu.
▉ Lien 4: http://www.developpementdurable.be/portaal.cgi?taal=_fr&id_teksten=25 - requête HTTP transmise, en attente de la réponse… 404 Not Found
▉ Lien 5: http://www.cidd.be/ - requête HTTP transmise, en attente de la réponse… 301 Moved Permanently requête HTTP transmise, en attente de la
réponse… 301 Moved Permanently requête HTTP transmise, en attente de la réponse… 200 OK
▉ Lien 6: http://mineco.fgov.be/energy/sustainable_development/home_fr.htm - requête HTTP transmise, en attente de la réponse… 302 Found requête
HTTP transmise, en attente de la réponse… 301 Moved Permanently requête HTTP transmise, en attente de la réponse… 302 Moved
TemporarilyEmplacement : http://economie.live.pr.belgium.be/nl/errorpages/404.jsp [suivant] --2016-10-18 11:44:33--
http://economie.live.pr.belgium.be/nl/errorpages/404.jsp --2016-10-18 11:45:34-- (essai : 2)
http://economie.live.pr.belgium.be/nl/errorpages/404.jsp
▉ Lien 7: http://www.cqdd.qc.ca/infolettre/CQDDmemoirestrap.pdf - requête HTTP transmise, en attente de la réponse… 404 Not Found
▉ Lien 8: http://www.ospar.org/fr/html/welcome.html - requête HTTP transmise, en attente de la réponse… 404 Page Not Found
▉ Lien 9: http://www.gimp-fr.org/telecharger_windows.php - requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise,
en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse…
302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP
transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de
la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found
requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en
attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302
Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP
transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de la réponse… 302 Found requête HTTP transmise, en attente de
la réponse… 302 Found
▉ Lien 10: http://www.exalead.fr/ - requête HTTP transmise, en attente de la réponse… 301 Moved Permanently requête HTTP transmise, en attente de
la réponse… 200 OK
=========================================
Fin du script.
=========================================
Noter que le programme signale aussi une anomalie dans le cas d'une redirection, même si celle-ci conduit à une connexion finalement effective produisant in fine une réponse "200 OK". Dans un tel cas, il est en effet préférable de corriger le lien pour pointer directement vers l'adresse actuelle.
S'il n'y a pas d'erreur, la date et un message signalant l'absence d'erreur sont affichés en fin d'exécution.
=========================================
18-octobre-2016_13:51:47
Pas de retours anormaux
=========================================
Fin du script.
=========================================
Les résultats se trouvent dans les fichiers erreurs.txt et messages.txt dans le dossier du programme. ATTENTION : ils seront remplacés à la prochaine exécution ; pour les conserver, il faut donc les renommer ou les déplacer.
Pour terminer, la conduite à tenir dépend des erreurs obtenues. Le message ERREUR 403: Forbidden est l'indication que le site n'autorise par ce type d'interrogation et ne signale donc pas une vraie erreur. De même, le message ERREUR 503: Service Temporarily Unavailable peut être une simple réponse de protection. Pour les autres, il ne reste plus qu'à retrousser ses manches, essayer de se connecter aux sites pour en savoir plus et corriger les liens.
D'après la Request for Comments : 3986 de janvier 2005, les caractères que l'on peut trouver dans une url sont les réservés et les autorisés non réservés.
:/?#[]@!$&'()*+,;=
-._~
De plus, certains caractères peuvent apparaitre sous une forme codée comme %20.
Ceci conduirait à écrire la classe regexp des caractères d'url de la façon suivante :
[a-zA-Z0-9-._~:/?#[]@!$&'()*+,;=%]
cependant, certains de ces caractères sont spéciaux au sens des regexp avec, éventuellement, un traitement spécial dans les classes, défini par les règles suivantes.
Les caractères (, ), [, ], ., *, ?, +, |, ^ et $ sont utilisés comme caractères spéciaux et il convient de les faire
précéder du signe d'échappement \ si l'on souhaite les utiliser dans un sens littéral. L'antislash \ devient donc lui même un
caractère spécial, que l'on peut lui aussi faire précéder de \ pour le prendre au sens littéral.
Trois caractères n'ont pas besoin de l'échappement quand ils sont placés dans
certaines positions d'une classe de caractères:
Pour emploi dans une expression rationnelle, l'ensemble "caractères d'url" est donc en définitive :
[][a-zA-Z0-9._~:/?#@!$&'()*+,;=%-]
L'auteur de ce script a produit ses meilleurs efforts pour obtenir un bon fonctionnement mais il ne garantit pas qu'il est sans erreurs ni qu'il sera compatible avec la configuration de l'utilisateur. Ce dernier doit donc s'assurer de la satisfaction de ses besoins par le logiciel et de l'absence de risques pour ses biens. En cohérence avec cet état de fait, le script chklinxnn.sh est un logiciel libre diffusé sous licence CeCILL (voir le code source du script).