arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou

Log | Files | Refs |

index.sh (8066B)


      1 #! page
      2 title: Comment j\'ai volé les 407 128 mot valides au scrabble francophone à la Fédération Française de Scrabble
      3 author: Arthur Pons
      4 description: et implémenté un service qui vérifie si un mot est valide sur bebou
      5 publication: 2025-05-10
      6 
      7 section: main
      8 
      9 Article pas relu
     10 
     11 ## Si vous voulez simplement l'utiliser
     12 
     13 La liste complète par taille et ordre alphabétique des mots valides au scrabble
     14 francophone le 10 mai 2025 (1,2Mo) :
     15 http://bebou.netlib.re/scrabble/mots-valides-scrabble.gz
     16 
     17 Pour le dezipper faire `gunzip mots-valides-scrabble.gz`.
     18 
     19 Pour vérifier si un mot est valide en ligne accédez au lien suivant en modifiant
     20 le mot recherché : http://bebou.netlib.re/scrabble/mot  
     21 Si le site vous fait télécharger un truc c'est qu'il est valide, sinon il ne
     22 l'est pas.
     23 
     24 Sinon si vous voulez un formulaire vous pouvez utiliser la version CGI :
     25 http://bebou.netlib.re/cgi-bin/scrabble.cgi
     26 
     27 Si vous avez le fichier en local pour vérifier si un mot existe vous pouvez
     28 lancer la commande :
     29 
     30 	< mots-valides-scrabble grep "^mot$"
     31 
     32 ## Introduction
     33 
     34 [Timothée](https://timothee.goguely.com/) a récemment joué au scrabble et s'est
     35 plaint des sites depuis lesquels on peut vérifier si un mot est valide. J'en
     36 fais donc ma mission de trouver un moyen de rendre cela plus facile.
     37 
     38 ## Trouver la liste des mots
     39 
     40 Comme d'habitude le plus difficile est de trouver la source des données. Il
     41 semblerait que le dictionnaire du scrabble ne soit pas équivalent aux
     42 dictionnaires français "classiques" puisqu'il existe un dictionnaire dédié
     43 nommé l'[Officiel Du
     44 Scrabble](https://www.fisf.net/officiel-du-scrabble/presentation.html) (ODS).
     45 Ce dictionnaire est le résultat d'une collaboration entre Larousse dont le
     46 dictionnaire faisait référence jusqu'en 89 et la Fédération Internationale du
     47 Scrabble Francophone (FISF). La [page au sujet de la sortie de la neuvième
     48 édition du
     49 dictionnaire](https://www.fisf.net/fisf/dernieres-actualites/10284-l-ods-9-vient-de-paraitre.html)
     50 m'a permis de confirmer que le jeux de donnée que j'ai constitué est bien à
     51 jour entre autre parce qu'il ne contient plus certaines insultes
     52 homophobes, raciste et sexistes. La FISF, ces dangereux wokistes.
     53 
     54 J'ai cherché sur le site de la FISF si le dictionnaire était disponible sans
     55 succès. Il y a bien des applications mobiles qui fonctionnent sans internet et
     56 qui donc contiennent la base d donnée en locale [un peu à la manière du
     57 DES](/crisco-des/) mais ne connaissant rien en appli mobile j'ai évité.
     58 
     59 ## Le vérificateur de mots de la FFS
     60 
     61 En cherchant sur le site de la Fédération Française de Scrabble j'ai trouvé
     62 leur [vérificateur de mot](https://www.ffscrabble.fr/verificateur-de-mots/). Ce
     63 vérificateur fonctionne en récupérant ce qui est inscrit dans la boite de
     64 dialogue et en appelant une api REST que l'on peut appeler de la sorte et qui
     65 nous renvoie de l'HTML :
     66 
     67     $ curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \
     68            -H  'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \
     69            --data-raw 'action=verifier_mot&mot=manger'
     70 
     71     <span class="answer right-answer">
     72         Le mot <b>"manger"</b> est valide
     73         <img class="valid-invalid" src="https://www.ffscrabble.fr/wp-content/uploads/2024/02/check_circled_button_background.png" />
     74         <br>
     75         Le joueur qui a contesté reçoit une pénalité de 5 points
     76     </span>
     77 
     78 Super. Sauf que pour avoir la liste des mots valides il faudrait tester tous
     79 les mots existants auprès de cet API. Ce n'est pas raisonnable. J'ai eu
     80 l'intuition qu'il devait exister une "action" du type "recuperer_mot" qui
     81 permette d'obtenir une liste. J'ai utilisé le débogueur des outils de
     82 développement de Firefox pour lire le JS fourni avec le site. J'ai cherché
     83 la chaîne "action:" puis je suis tombé sur [ce
     84 fichier](https://www.ffscrabble.fr/wp-content/plugins/ffsc-jeux-mots/js/jeu-mots.js)
     85 contenant une action `get_mots` très prometteuse :
     86 
     87 
     88     $ curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \
     89            -H  'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \
     90            --data-raw 'action=get_mots&longueur=2&nombre=2'
     91 
     92     <div class="mot-item">
     93         <span class="mot-affiche" data-mot="PU">PU</span>
     94         <input type="text" class="mot-saisi">
     95     </div>
     96     <div class="mot-item">
     97         <span class="mot-affiche" data-mot="IL">IL</span>
     98         <input type="text" class="mot-saisi">
     99     </div>
    100 
    101 ## Le vol
    102 
    103 ### La collection
    104 
    105 Ce script permet de successivement demander 1 millions de mots des
    106 longueurs de 2 à 15 :
    107 
    108     for i in $(seq 2 15); do
    109         curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \
    110              -H 'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \
    111              --data-raw "action=get_mots&longueur=${i}&nombre=1000000" > "$i"
    112     done
    113 
    114 ### Le nettoyage
    115 
    116 On se retrouve avec 14 fichiers numérotés de 2 à 15. remplis d'HTML. On peut
    117 les parser de la sorte :
    118 
    119     for i in $(seq 2 15);do
    120         < "$i" sed -E 's/<[^>]+>/\n/g' | #on retire l'html
    121                grep . > "$i.parsed"      # et les lignes vides
    122     done
    123 
    124 Et constituer un fichier global en faisant :
    125 
    126     for i in $(seq 2 15);do
    127         < "$i.parsed" sort       #on trie par ordre alpha
    128     done |
    129         sed -E 's/.*/\L&/' > res #et on met tout en minuscule
    130 
    131 ## Le service
    132 
    133 Maintenant à notre tour d'imaginer un service équivalent. En local si nos mots
    134 sont dans le fichier `res` le plus simple reste de faire :
    135 
    136     $ < res grep "^mot$"
    137     mot
    138 
    139 Si la commande renvoie quelque chose c'est bon, sinon c'est pas bon.
    140 On peu éventuellement le rendre un peu plus explicite en faisant :
    141 
    142     < res grep -q "^mot$" && echo "valide" || echo "non valide"
    143 
    144 Avec Timothée on a fait [une version
    145 CGI](http://bebou.netlib.re/cgi-bin/scrabble.cgi) mais je voulais aussi tester
    146 autre chose.  Et si l'on s'amusait à créer un fichier texte par mot valide. On
    147 pourrait ensuite tenter d'accèder à une url. Si on a une 404 le mot n'est pas
    148 valide, si on a un retour le mot l'est.
    149 
    150 Pour créer les fichiers on peut faire :
    151 
    152     $ sed 's/^/echo "oui" > /g' res | sh
    153 
    154 Cela va créer pour chaque ligne (mot) une commande :
    155 
    156     $ echo "oui" > mot
    157 
    158 Attention, cela génère +400 mille mots dans le dossier courant. Sur des
    159 systèmes modernes ce n'est pas un souci, et même étonnament rapide, mais sur
    160 des systèmes plus vieux ou avec un disque lent je suppose que cela est une
    161 assez mauvaise idée.
    162 
    163 Reste que l'on aimerait y accéder en faisant `site.com/scrabble/mot` et que par
    164 défaut en absence d'extension le navigateur va nous faire télécharger le
    165 fichier plutôt que d'afficher "oui" à l'écran. J'en suis resté là, j'ai un peu
    166 la flemme de modifier la conf du serveur pour lui faire dire que dans ce
    167 dossier spécifiquement les fichier sans extension sont à traiter comme des
    168 fichiers texte. Si vuos savez comment le faire sous nginx je suis preneur.
    169 
    170 ## Discussion
    171 
    172 Si j'aime bien cette solution puisqu'elle n'implique aucun code (ça c'est du
    173 vrai no code) je pense qu'elle n'est pas possible avec du matériel et/ou des OS
    174 et/ou des systèmes de fichier assez vieux ayant mal optimisé la création de
    175 fichier. Sur le serveur il y a 3,7 millions d'inodes dont 600 milles utilisés
    176 après avoir créé nos 400 milles fichiers :
    177 
    178     Sys. de fichiers  Inœuds IUtil.  ILibre IUti% Monté sur
    179     /dev/mmcblk0p2   3786960 599438 3187522   16% /
    180     [...]
    181 
    182 Autrement dit l'existance de ce service sous cette forme occupe un peu plus de
    183 10% de la totalité des fichiers disponibles sur le rasp et 66% des fichiers
    184 existants.
    185 
    186 Question performance le serveur web n'a aucun mal, le fait que le dossier soit
    187 blindé de fichiers n'est pas un souci pour trouver le bon.
    188 
    189 Pour vérifier si effectivement le luxe de ne pas avoir besoin de code n'est
    190 abordable que dans la mesure où l'on a une carte sd relativement grosse et
    191 performante, un système de fichier et un os moderne il faudrait tenter
    192 d'héberger le même service sur un OS ancien. Peut-être un article pour une
    193 prochaine fois.