- Si vous voulez simplement l’utiliser
- Introduction
- Trouver la liste des mots
- Le vérificateur de mots de la FFS
- Le vol
- Le service
- Discussion
Article pas relu
Si vous voulez simplement l’utiliser
La liste complète par taille et ordre alphabétique des mots valides au scrabble francophone le 10 mai 2025 (1,2Mo) : http://bebou.netlib.re/scrabble/mots-valides-scrabble.gz
Pour le dezipper faire gunzip mots-valides-scrabble.gz
.
Pour vérifier si un mot est valide en ligne accédez au lien suivant en modifiant
le mot recherché : http://bebou.netlib.re/scrabble/mot
Si le site vous fait télécharger un truc c’est qu’il est valide, sinon il ne
l’est pas.
Sinon si vous voulez un formulaire vous pouvez utiliser la version CGI : http://bebou.netlib.re/cgi-bin/scrabble.cgi
Si vous avez le fichier en local pour vérifier si un mot existe vous pouvez lancer la commande :
< mots-valides-scrabble grep "^mot$"
Introduction
Timothée a récemment joué au scrabble et s’est plaint des sites depuis lesquels on peut vérifier si un mot est valide. J’en fais donc ma mission de trouver un moyen de rendre cela plus facile.
Trouver la liste des mots
Comme d’habitude le plus difficile est de trouver la source des données. Il semblerait que le dictionnaire du scrabble ne soit pas équivalent aux dictionnaires français “classiques” puisqu’il existe un dictionnaire dédié nommé l’Officiel Du Scrabble (ODS). Ce dictionnaire est le résultat d’une collaboration entre Larousse dont le dictionnaire faisait référence jusqu’en 89 et la Fédération Internationale du Scrabble Francophone (FISF). La page au sujet de la sortie de la neuvième édition du dictionnaire m’a permis de confirmer que le jeux de donnée que j’ai constitué est bien à jour entre autre parce qu’il ne contient plus certaines insultes homophobes, raciste et sexistes. La FISF, ces dangereux wokistes.
J’ai cherché sur le site de la FISF si le dictionnaire était disponible sans succès. Il y a bien des applications mobiles qui fonctionnent sans internet et qui donc contiennent la base d donnée en locale un peu à la manière du DES mais ne connaissant rien en appli mobile j’ai évité.
Le vérificateur de mots de la FFS
En cherchant sur le site de la Fédération Française de Scrabble j’ai trouvé leur vérificateur de mot. Ce vérificateur fonctionne en récupérant ce qui est inscrit dans la boite de dialogue et en appelant une api REST que l’on peut appeler de la sorte et qui nous renvoie de l’HTML :
$ curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \
-H 'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \
--data-raw 'action=verifier_mot&mot=manger'
<span class="answer right-answer">
Le mot <b>"manger"</b> est valide
<img class="valid-invalid" src="https://www.ffscrabble.fr/wp-content/uploads/2024/02/check_circled_button_background.png" />
<br>
Le joueur qui a contesté reçoit une pénalité de 5 points
</span>
Super. Sauf que pour avoir la liste des mots valides il faudrait tester tous
les mots existants auprès de cet API. Ce n’est pas raisonnable. J’ai eu
l’intuition qu’il devait exister une “action” du type “recuperer_mot” qui
permette d’obtenir une liste. J’ai utilisé le débogueur des outils de
développement de Firefox pour lire le JS fourni avec le site. J’ai cherché
la chaîne “action:” puis je suis tombé sur ce
fichier
contenant une action get_mots
très prometteuse :
$ curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \
-H 'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \
--data-raw 'action=get_mots&longueur=2&nombre=2'
<div class="mot-item">
<span class="mot-affiche" data-mot="PU">PU</span>
<input type="text" class="mot-saisi">
</div>
<div class="mot-item">
<span class="mot-affiche" data-mot="IL">IL</span>
<input type="text" class="mot-saisi">
</div>
Le vol
La collection
Ce script permet de successivement demander 1 millions de mots des longueurs de 2 à 15 :
for i in $(seq 2 15); do
curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \
-H 'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \
--data-raw "action=get_mots&longueur=${i}&nombre=1000000" > "$i"
done
Le nettoyage
On se retrouve avec 14 fichiers numérotés de 2 à 15. remplis d’HTML. On peut les parser de la sorte :
for i in $(seq 2 15);do
< "$i" sed -E 's/<[^>]+>/\n/g' | #on retire l'html
grep . > "$i.parsed" # et les lignes vides
done
Et constituer un fichier global en faisant :
for i in $(seq 2 15);do
< "$i.parsed" sort #on trie par ordre alpha
done |
sed -E 's/.*/\L&/' > res #et on met tout en minuscule
Le service
Maintenant à notre tour d’imaginer un service équivalent. En local si nos mots
sont dans le fichier res
le plus simple reste de faire :
$ < res grep "^mot$"
mot
Si la commande renvoie quelque chose c’est bon, sinon c’est pas bon. On peu éventuellement le rendre un peu plus explicite en faisant :
< res grep -q "^mot$" && echo "valide" || echo "non valide"
Avec Timothée on a fait une version CGI mais je voulais aussi tester autre chose. Et si l’on s’amusait à créer un fichier texte par mot valide. On pourrait ensuite tenter d’accèder à une url. Si on a une 404 le mot n’est pas valide, si on a un retour le mot l’est.
Pour créer les fichiers on peut faire :
$ sed 's/^/echo "oui" > /g' res | sh
Cela va créer pour chaque ligne (mot) une commande :
$ echo "oui" > mot
Attention, cela génère +400 mille mots dans le dossier courant. Sur des systèmes modernes ce n’est pas un souci, et même étonnament rapide, mais sur des systèmes plus vieux ou avec un disque lent je suppose que cela est une assez mauvaise idée.
Reste que l’on aimerait y accéder en faisant site.com/scrabble/mot
et que par
défaut en absence d’extension le navigateur va nous faire télécharger le
fichier plutôt que d’afficher “oui” à l’écran. J’en suis resté là, j’ai un peu
la flemme de modifier la conf du serveur pour lui faire dire que dans ce
dossier spécifiquement les fichier sans extension sont à traiter comme des
fichiers texte. Si vuos savez comment le faire sous nginx je suis preneur.
Discussion
Si j’aime bien cette solution puisqu’elle n’implique aucun code (ça c’est du vrai no code) je pense qu’elle n’est pas possible avec du matériel et/ou des OS et/ou des systèmes de fichier assez vieux ayant mal optimisé la création de fichier. Sur le serveur il y a 3,7 millions d’inodes dont 600 milles utilisés après avoir créé nos 400 milles fichiers :
Sys. de fichiers Inœuds IUtil. ILibre IUti% Monté sur
/dev/mmcblk0p2 3786960 599438 3187522 16% /
[...]
Autrement dit l’existance de ce service sous cette forme occupe un peu plus de 10% de la totalité des fichiers disponibles sur le rasp et 66% des fichiers existants.
Question performance le serveur web n’a aucun mal, le fait que le dossier soit blindé de fichiers n’est pas un souci pour trouver le bon.
Pour vérifier si effectivement le luxe de ne pas avoir besoin de code n’est abordable que dans la mesure où l’on a une carte sd relativement grosse et performante, un système de fichier et un os moderne il faudrait tenter d’héberger le même service sur un OS ancien. Peut-être un article pour une prochaine fois.