Page 1 sur 1
[R] Mauvaise regex sur récupération de formulaire
Posté : sam. 08 août 2015 22:40
par Sepular
Bonjour.
But : Envoyer un formulaire
Démarche :
- Récupérer les noms ou les actions de tous les formulaires présent sur une page donné.
- Choisir le formulaire ciblé
- Récupérer le nom des input du formulaire choisi
- Remplir les inputs a remplir et envoyer
Script en rédaction :
► Afficher le texte
Code : Tout sélectionner
#include <StringConstants.au3>
#include <WinHttp.au3>
Local $aArray = 0, _
$iOffset = 1
$source = '<form name="turlututu" action="go_laba"><input name="tutu"><input name="toto"></form><form name="youyou" action="go_ici"><input name="titi"></form>'
;$source = HttpPost("http://www.enseignement.polytechnique.fr/informatique/profs/Olivier.Serre/Memos/Formulaires_CSS/index.html", "")
Func recup($choix)
While 1
$FORM = StringRegExp($source, '<form (.*?)>', $STR_REGEXPARRAYMATCH, $iOffset)
If @error Then ExitLoop
$iOffset = @extended
For $a = 0 To UBound($FORM) - 1
$FORM_NAME = StringRegExp($FORM[$a], 'name="(.*?)"', $STR_REGEXPARRAYGLOBALMATCH)
If UBound($FORM_NAME) <> 0 Then
$FORM_NAME = StringRegExp($FORM[$a], 'name="(.*?)"', $STR_REGEXPARRAYGLOBALMATCH)
Else
$FORM_NAME = StringRegExp($FORM[$a], 'action="(.*?)"', $STR_REGEXPARRAYGLOBALMATCH)
EndIf
For $b = 0 To UBound($FORM_NAME) - 1
If $choix == "" Then
; NOM DU FORMULAIRE
MsgBox(0, "", $FORM_NAME[$a])
ElseIf $FORM_NAME[$b]==$choix Then
$FORM_CONTENT = StringRegExp($source, '<form(.*?)</form>', $STR_REGEXPARRAYGLOBALMATCH)
MsgBox(0, "", UBound($FORM_CONTENT))
For $c = 0 To UBound($FORM_CONTENT) - 1
$INPUT_CONTENT = StringRegExp($FORM_CONTENT[$c], '<input(.*?)>', $STR_REGEXPARRAYGLOBALMATCH)
$tutu = StringInStr ( $FORM_CONTENT[$c], $choix)
If StringInStr ( $FORM_CONTENT[$c], $choix) then
For $d = 0 To UBound($INPUT_CONTENT) - 1
$INPUT_NAME = StringRegExp($INPUT_CONTENT[$d], 'name="(.*?)"', $STR_REGEXPARRAYGLOBALMATCH)
For $e = 0 To UBound($INPUT_NAME) - 1
; NOM DES INPUTS
MsgBox(0, "", $INPUT_NAME[$e])
Next
Next
EndIf
Next
EndIf
Next
Next
WEnd
EndFunc
recup('')
recup('turlututu')
Le script si dessus fonctionne comme je le souhaite avec la source qui n'est pas commenté. Par contre lorsque je le test avec la source commenté les regex ne font pas leur travaille.
Une idée sur le pourquoi ?
Réponse de mikell : Mauvaise regex
Quelqu'un pourrais m'aider pour corriger mes regex?
Je souhaiterais capturer le nom des formulaires ou leur action dans un premier temps puis le nom des input.
(.*?) sinifie pourtant bien : un caractére (.) trouvé 0 ou plusieurs fois (*) qui peut ou non étre présent (?) ?
Re: [..] Récupération de formulaire
Posté : sam. 08 août 2015 23:11
par mikell
D'où elle sort cette fonction HttpPost() ?
Un coup d'oeil rapide à la source montre que le problème vient des regex (la string de test n'est pas représentative)
Code : Tout sélectionner
<form action="#">
<p><i>Complétez le formulaire. Les champs marqués par </i><em>*</em> sont <em>obligatoires</em></p>
<fieldset>
<legend>Contact</legend>
<label for="nom">Nom <em>*</em></label>
<input id="nom" placeholder="Olivier Serre" autofocus required><br>
<label for="telephone">Portable</label>
<input id="telephone" type="tel" placeholder="06xxxxxxxx" pattern="06[0-9]{8}"><br>
... etc
Re: [..] Récupération de formulaire
Posté : sam. 08 août 2015 23:20
par Sepular
Ha mais en plus les input ne sont pas nommé.
Ha les regex sont pas bonne et vu que je suis une .... sur le sujet je suis pas sortit de l'auberge.
Merci.
PS: le httpost viens du WinHttp.au3
Re: [..] Récupération de formulaire
Posté : sam. 08 août 2015 23:25
par mikell
Bizarre j'ai la dernière release 1.6.3.8 de Winhttp.au3 et dedans pas de fonction HttpPost()
Tu pourrais préciser ?
Re: [..] Récupération de formulaire
Posté : sam. 08 août 2015 23:36
par Sepular
Ben je l'ai trouvé en farfouillant de partout.
le Winhttp.au3 que j'ai ne dois pas du tout du tout étre le même que le tiens, je c mm pas s'ils ont la même fonction lol.
Le miens :
► Afficher le texte
Code : Tout sélectionner
#include-once
Global Const $HTTP_STATUS_OK = 200
Func HttpPost($sURL, $sData = "")
Local $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", $sURL, False)
If (@error) Then Return SetError(1, 0, 0)
$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
$oHTTP.Send($sData)
If (@error) Then Return SetError(2, 0, 0)
If ($oHTTP.Status <> $HTTP_STATUS_OK) Then Return SetError(3, 0, 0)
Return SetError(0, 0, $oHTTP.ResponseText)
EndFunc
Func HttpGet($sURL, $sData = "")
Local $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("GET", $sURL & "?" & $sData, False)
If (@error) Then Return SetError(1, 0, 0)
$oHTTP.Send()
If (@error) Then Return SetError(2, 0, 0)
If ($oHTTP.Status <> $HTTP_STATUS_OK) Then Return SetError(3, 0, 0)
Return SetError(0, 0, $oHTTP.ResponseText)
EndFunc
et pour les regex je souhaiterais récupérer tout ce qu'il se trouve entre les balises que j'indique mais sans aide je n'y arriverais pas.
J'ai essayé plusieurs fois mais je me suis démotivé.
Re: [..] Récupération de formulaire
Posté : sam. 08 août 2015 23:39
par mikell
Hum plutôt sommaire, rien à voir avec le WinHttp.au3 que je connais
Pour ce que j'en vois, récupérer un code source irait mieux avec GET
Re: [..] Récupération de formulaire
Posté : sam. 08 août 2015 23:44
par Sepular
Oui il est vrai mais j'ai l'intention de poster le formulaire après avoir fait mon petit micmac que je pourrais faire a la main en affichant le code source.
J'avais déjà terminer mon projet final il tourné bien mais n'ayant rien a faire et aimant me compliqué la vie je me suis dis "et pourquoi je le rendrait pas un peu plus flexible" et me voila partit lol.
Bref voila lol.
Re: [..] Mauvaise regex sur récupération de formulaire
Posté : dim. 09 août 2015 21:16
par Sepular
personne pour m'aider ?
J'édite le premier sujet a chaque avancer mais la j'avance plus.
Re: [..] Mauvaise regex sur récupération de formulaire
Posté : dim. 09 août 2015 23:04
par mikell
Il y a de retours à la ligne donc tu dois utiliser l'option (?s)
Voilà un exemple de base adapté à ton url mais je vois pas bien à quoi ça peut te servir, du moins sur ce site ^^
► Afficher le texte
Code : Tout sélectionner
$source = BinaryToString(InetRead("http://www.enseignement.polytechnique.fr/informatique/profs/Olivier.Serre/Memos/Formulaires_CSS/index.html", 1))
Local $content
$forms = StringRegExp($source, '(?s)<form(.*?)</form>', 3)
For $i = 0 To UBound($forms)-1
$content &= _readform($forms[$i]) & @crlf
Next
Msgbox(0,"forms", $content)
Func _readform($form)
Local $txt
Local $action = StringRegExpReplace($form, '(?s).*action="([^"]+).*', "$1")
$txt &= "action: " & $action & @crlf & @crlf
Local $fieldsets = StringRegExp($form, '(?s)<fieldset>(.*?)</fieldset>', 3)
For $k = 0 to UBound($fieldsets)-1
$legend = StringRegExpReplace($fieldsets[$k], '(?s).*<legend>([^<]+).*', "$1")
$txt &= $legend & @crlf
$inputs = StringRegExp($fieldsets[$k], 'input id="([^"]+)', 3)
For $n = 0 to UBound($inputs)-1
$txt &= "input" & $n+1 & ": " & $inputs[$n] & @crlf
Next
$txt &= @crlf
Next
Return $txt
EndFunc
Re: [..] Mauvaise regex sur récupération de formulaire
Posté : dim. 09 août 2015 23:20
par Sepular
Bon alors votre code me sors bien les actions, mais je ne comprend toujours pas les regex utilisées et pourtant je viens de me manger une pataraphe de tuto dessus mais y'a pas moyen je pige pas tout.
Bon bref cela étant merci pour m'avoir aidé un peu même si le code n'a plus la "fonction" pour me sortir les input une fois les formulaires identifié et choisi par l'utilisateur.
Je regarde a ça mais ne passe pas encore en résolu.
PS: j'aimerai vraiment faire abstraction des fieldset et des legend pour n'utiliser que les form et les input dans le code. histoire de faire plus compatible a n'importe quel formulaire. Je ne cherche pas a utiliser la source donner, c'était juste un exemple pour moi tester le script.
Re: [..] Mauvaise regex sur récupération de formulaire
Posté : dim. 09 août 2015 23:28
par Sepular
un GRAND merci.
les (?s) mon sauver la vie LOL, mais vous m'avez surtout grandement aidé.
Merci encore.
Re: [R] Mauvaise regex sur récupération de formulaire
Posté : dim. 09 août 2015 23:33
par jchd
Le fichier d'aide sur StringRegExp présente le plus gros et
http://regex101.com/ te donne le moyen de tester, comprendre et deboguer.
Re: [R] Mauvaise regex sur récupération de formulaire
Posté : lun. 10 août 2015 00:11
par Sepular
j'ai visiter et testé plein de chose dessus
http://regex101.com
parfait d'ailleurs pour tester mais pas simple du coup lorsque l'on tâtonne
Et je ne possède pas StringRegAxp dans le fichier d'aide de autoit en tout cas.
je v m'instruire dessus car les regex sont vraiment très puissante, et je suis presque sur de pouvoir encore réduire ma fonction même si elle fonctionne très bien désormais.
Re: [R] Mauvaise regex sur récupération de formulaire
Posté : lun. 10 août 2015 00:14
par jchd
Faute de clavier : StringRegExp
Re: [R] Mauvaise regex sur récupération de formulaire
Posté : lun. 10 août 2015 00:28
par Sepular
A la oui j'ai
