La MSA (mutalité sociale agricole) a mis en place un service en ligne pour déclarer les salariés.
Pour chaque salarié il y a 4 formulaires à remplir. Si vous avez 10 vendangeurs
vous y passé la nuit.
J'ai cherché un truc pour automatiser tout cela.
Au début j'ai pensé à Perl avec WWW::Mechanize ou LWP, mais ça marche pas avec HTTPS et Javascript sous Linux.
De plus avant d'envoyer le formulaire je veux le vérifier.
Et la je suis tombé sur MozRepl .
C'est une extention Firefox qui permet de controler le navigateur en lui envoyant du code Javascrit par le port 4242 avec un client type telnet ou netcat.
Il existe bien sur un module Perl qui utilise cette extension WWW::Mechanize::Firefox.
Mais je le trouve incomplet. Pour remplir des formulaires il manque des fonctions
pour les TextArea ou les SelectList. Du moins j'y suis pas arrivé, et Perl j'aime pas trop.
Par chance il existe Fresno
Introduction
Fresno provides unix command line access to the Javascript interpreter of your running Firefox instance.
It is a complement to MozRepl, so you will need to have that installed and running in your firefox.
C'est un script shell qui utilise Expect et Telnet.
Mais j'arrive pas à lui faire exécuter du code Javascript contenue dans un fichier.
Dans le script suivant, je crée un fichier /tmp/test.js, que je fait exécuter sucessivement
par ma fonction moz_script et fresno.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
cat > /tmp/test.js <<EOF
repl.whereAmI()
repl.print(this)
repl.print(this.window)
repl.print(this.document)
repl.print(this.document.title)
EOF
moz_script () { # $1: URL d'un fichier javascript
expect <<EOF
log_user 0
spawn netcat localhost 4242
expect "repl>"; log_user 1; send "repl.load(\"$1\")\r"
expect "repl>"; send "repl.quit()\r"
EOF
}
moz_script file:///tmp/test.js
echo -e "\n---------------------------------------------------"
fresno -l /tmp/test.js |
Et voila ce que j'obtient
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
repl.load("file:///tmp/test.js")
[object ChromeWindow] - Document title: "lemouv - direct - Mercredi 5 Decembre 10:51:53 - Iceweasel"
[object ChromeWindow]
[object ChromeWindow]
[object XULDocument]
lemouv - direct - Mercredi 5 Decembre 10:51:53 - Iceweasel
repl>
---------------------------------------------------
[object ChromeWindow] - Document title: "lemouv - direct - Mercredi 5 Decembre 10:51:53 - Iceweasel"
[object Object]
!!! TypeError: this.document is undefined
Details:
fileName: chrome://mozrepl/content/repl.js -> file:///tmp/test.js
lineNumber: 10 |
J'ai essayer plusieurs options mais rien n'y fait.
Par contre la commande:
1 2 3 4
|
bash: ./fresno -j "repl.print(this.document)"
[object XULDocument] |
elle marche c'est à ne rien y comprendre.
Aprés tous ces echecs j'ai écrit un sript shell mozrepl.sh qui contient la fonction moz_script et toutes les fonctions pour remplir des formulaires.
Le début ressemble à ça:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
moz_cmd () { # $1: commande javascript
expect <<EOF
spawn nc localhost 4242
expect "repl>"; send "$*\r"
expect "repl>"; send "repl.quit()\r"
EOF
}
moz_script () { # $1: URL d'un fichier javascript
expect <<EOF
log_user 0
spawn nc localhost 4242
expect "repl>"; send "repl.enter(content)\r"
expect "repl>"; log_user 1; send "repl.load(\"$1\")\r"
expect "repl>"; send "repl.quit()\r"
EOF
}
moz_getURL () { # $1: URL
moz_cmd "content.location.href = '$1'"
}
moz_waitURL () { # $1: URL
while ! moz_cmd "repl.print(content.location.href)" | grep "$1"
do
echo "WAIT URI: $1"
sleep 1
done
sleep 1
}
moz_setInput () { # $1: nom $2: valeur
cat > /tmp/setInput.js <<EOF
var c = this.document.getElementsByTagName("input"); // [object HTMLCollection]
// [object HTMLInputElement] .type=text .name=q .value=Shakira
for ( var i=0; i<c.length; i++ ) {
if ( c[i].type == "text" || c[i].type == "password" )
if ( c[i].name == "$1") {
c[i].value = "$2";
}
}
EOF
moz_script file:///tmp/setInput.js
}
moz_submitFormByName () { # $1: nom formulaire
cat > /tmp/submitForm.js <<EOF
var c = this.document.getElementsByTagName("form");
for ( var i=0; i<c.length; i++ ) {
if ( c[i].name == "$1" )
c[i].submit();
}
EOF
moz_script file:///tmp/submitForm.js
} |
Pour l'utiliser il suffit d'ajouter la ligne source ./mozrepl.sh dans le script.
Exemple pour s'identifier sur le site MSA:
1 2 3 4 5 6 7 8 9 10 11
|
# MSA Login
moz_getURL 'http://www.msagrandsud.fr'
moz_waitURL 'http://www.msagrandsud.fr'
moz_setInput "identifiant" "1690611069043"
moz_setInput "motDePasse" "*************"
moz_submitFormByName "_58_fm"
moz_waitURL "https://monespaceprive.msa.fr/enligne/Login/Login.do" |
Et pour remplir un formulaire:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
# MSA Information emploi salarié
while [ ! $(moz_getInput 'page') ] || [ $(moz_getInput 'page') -ne 3 ]; do sleep 1; done
sleep 1
moz_setInput "dateEmbauche" ${data["DATE EMBAUCHE"]}
moz_setInput "heureEmbauche" ${data["HEURE EMBAUCHE"]}
moz_setInput "dureeMinCDD" ${data["CDD MIN"]}
moz_setInput "emploiOccupe" ${data["EMPLOI"]}
if expr match "${data["CONTRAT"]}" '.*VENDANGE'
then
v=$(moz_listSelectValues "typeContrat" | grep -i "vendange" | cut -f1)
moz_setSelect "typeContrat" $v
else
v=$(moz_listSelectValues "typeContrat" | grep -i "saisonnier" | cut -f1)
moz_setSelect "typeContrat" $v
moz_setInput "travaux" ${data["EMPLOI"]}
fi
moz_setInputCheckbox "typeTravailleur" 1
moz_setInput "salaireHeureBrut" ${data["BRUT"]}
moz_setInput "conventionColl" "Viticulture"
moz_setInput "caisseComp" "Humanis"
zenity --info --text "Vérifiez le formulaire. Validez-le pour continuer."
[ $? != 0 ] && exit |
Toutes les infos sur le salarié sont dans le tableau data.
Le plus dur c'est de savoir si la page demandée est bien affichée.
On peut vérifier l'adresse, mais des pages différente peuvent avoir la même adresse ou on peut avoir été redirigé sur une autre page. On peut également vérifier le titre de la page. Ou la précence d'un élément de formulaire.
C'est ce que fait l'instruction:
while [ ! $(moz_getInput 'page') ] || [ $(moz_getInput 'page') -ne 3 ]; do sleep 1; done
Au final j'ai un truc qui marche mais ça resemble à un horrible bricolage.
Et ce qui me désole le plus c'est de pas utiliser fresno et de pas comprendre pourquoi ?
Partager