Page 1 sur 1
[..] Tester la présence d'une variable ou d'un cookies?
Posté : mer. 15 avr. 2009 11:26
par evilmouss
Bonjour, voilà je vous expose mon problème.
J'ai actuellement un script qui permet de se logguer sur un site distant et de s'authentifier sur celui-ci en remplissant les champs login et mot de passe d'un formulaire de manière automatique. Ce que je voudrais, c'est que le lancement du .exe généré avec autoit se fasse seulement et seulement si l'utilisateur est connecté au préalable via une page de mon site.
En gros pour résumer, l'exécution du .exe doit se faire DEPUIS mon site ( car j'historise tous les accès ) et je veux empêcher que l'utilisateur fasse un simple enregistrez sous...et lance l'exe depuis le bureau ( ce qui m'empêcherai de savoir qui s'est connecté ). Il est donc impératif qu'il soit identifiez sur mon site pour pouvoir lancer cet .exe.
Question : y'a t'il un moyen de tester avec autoit la présence ou non d'une variable $_SESSION dans une fenêtre IE ouverte ou alors la présence d'un cookies? ( qui serait créer lors du lancement du .exe depuis mon site puis aussitôt supprimé par la suite après par exemple un timer de 20s )
Merci pour vos réponses, je ne suis pas encore très très familier avec autoit, c'est pour cela que je fais appel à vous =)
Re: Tester la présence d'une variable $_SESSION ou d'un cookies?
Posté : mer. 15 avr. 2009 18:25
par GaRydelaMer
Bonjour
wahoo beaucoup de question pointu en 1 seul post
Alors, pour les coockies Oui c'est possible avec AutoIt.
La mise en oeuvre est pas très simple. Je travaille dessus en ce moment d'ailleur, je viens de faire une fenêtre en AutoIt pour Uploader un fichier sur un serveur Web Disponible dans le Forum sous exemple de script.
J'ai entièrement revu le code mais pas terminé encore en utilisant l'UDF WinHTTP du site anglais, avec cette version la je récupère deja les entête HTTP envoyé par le serveur, et d'apres la doc de MicroSoft on peut également récupperer les Cockies échangé dans les 2 sens entre le serveur et le client web.
Pour la variables $_Session, comme son nom le suggère c'est pas du AutoIt, mais du PHP donc éxécuter coter serveur. En développement web, il y a 2 facons de l'utiliser soit 1 coockie soit par l'adresse de la page.
Voila en gros ma fonction en l'état actuel pour te donner une idée du style de code.
Pour toi les fonctions à utiliser:
WinHttpQueryHeaders($hRequest), _WinHttpQueryOption($hRequest, $WINHTTP_OPTION_URL)
► Afficher le texte
Code : Tout sélectionner
Func _Post_Files()
Local $hOpen = _WinHttpOpen()
Local $URL = _WinHttpCrackUrl("http://dl.free.fr/index_nojs.pl")
Local $hConnect = _WinHTTPConnect($hOpen, $URL[2], $URL[3])
Local $hRequest = _WinHttpOpenRequest($hConnect, "GET", $URL[6] & $URL[7], "HTTP/1.1", "http://" & $URL[2])
_WinHttpSendRequest($hRequest)
_WinHttpReceiveResponse($hRequest)
Local $html[3] = ["", _WinHttpQueryHeaders($hRequest), _WinHttpQueryOption($hRequest, $WINHTTP_OPTION_URL)]
If _WinHttpQueryDataAvailable($hRequest) Then
Local $temp
While 1
$temp = _WinHttpReadData($hRequest)
If $temp = "" Then ExitLoop
$html[0] &= $temp
WEnd
$temp = ""
EndIf
_Debug($html[1] & $html[2] & @LF)
_IEDocWriteHTML($oIE, $html[0])
;~ Return
_ScreenCapture_Capture("capture.jpg", 100, 100, 100, 100, False)
Local $oForm = _IEFormGetCollection($oIE, 1)
Local $URL = _WinHttpCrackUrl("http://dl.free.fr" & $oForm.action)
_Debug2Console($URL)
If MsgBox(1 , "", "On y va !!!" & @LF & @LF & "http://dl.free.fr" & $oForm.action, 20) > 1 Then Return
;~ $hConnect,
;~ $sVerb = "GET",
;~ $sObjectName = "",
;~ $sVersion = "HTTP/1.1",
;~ $sReferrer = $WINHTTP_NO_REFERER,
;~ $sAcceptTypes = $WINHTTP_DEFAULT_ACCEPT_TYPES,
;~ $iFlags = $WINHTTP_FLAG_ESCAPE_DISABLE
Local $Referrer = "http://" & $URL[2]
Local $QueryString = $URL[6] & $URL[7]
Local $hRequest = _WinHttpOpenRequest($hConnect, "POST", $QueryString, "HTTP/1.1", $Referrer)
Local $form_files[1][2] = [["ufile", "capture.jpg"]]
Local $form_fields [7][2] = [ _
["mail1", "xXxXx.XxXxX@gmail.com"], _
["mail2", ""], _
["mail3", ""], _
["mail4", ""], _
["message", "Test AutoIt"], _
["password", ""], _
["submit", "Envoyer"]]
Local $FormDatas = Encode_MultiPart_FormData($form_fields, $form_files)
Local $content_type = 'Content-Type: ' & $FormDatas[0] & @CRLF
_WinHttpSendRequest($hRequest, $content_type, $WINHTTP_NO_REQUEST_DATA, StringLen($FormDatas[1]))
_WinHTTPWriteData($hRequest, StringToBinary($FormDatas[1]), 1)
_WinHttpReceiveResponse($hRequest)
Local $post[3] = ["", _WinHttpQueryHeaders($hRequest), _WinHttpQueryOption($hRequest, $WINHTTP_OPTION_URL)]
If _WinHttpQueryDataAvailable($hRequest) Then
;~ Local $temp
;~ While 1
;~ $temp = _WinHttpReadData($hRequest)
;~ If $temp = "" Then ExitLoop
;~ $html[0] &= $temp
;~ WEnd
;~ $temp = ""
_IENavigate($oIE, $post[2])
EndIf
;~ _IEDocWriteHTML($oIE, $html[0])
_Debug($post[1])
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
EndFunc ;==>_Post_Files
Pour la suite :
http://www.autoitscript.fr/forum/viewto ... f=6&t=2747
Re: [..] Tester la présence d'une variable ou d'un cookies?
Posté : jeu. 16 avr. 2009 23:12
par evilmouss
Merci pour ta réponse Gary

Même si elle ne m'a pas trop aidé sur le coup ( j'ai trouvé comment faire d'une autre manière avant ton post ) je suis sûr que cela pourra en mettre quelques uns qui auraient le même problème sur la piste. Comme je le disais j'ai pallier mon problème de cette façon : en fait, lorsque l'utilisateur clique sur le bouton de connexion pour lancer le .exe généré avec autoit, cela affiche en javascript dans une simple <div> un champ caché input qui contient comme valeur la date et l'heure à laquelle l'utilisateur à cliqué. Afin de savoir si le lancement du .exe se fait bien à partir de mon site, je compare cette date avec la date locale récupéré depuis autoit. VOici le code ( certes pas très propre et certainement nettement améliorable.. mais fonctionnel ^^ ) pour ceux que cela pourrait intéressé :
► Afficher le texte
Code : Tout sélectionner
;~ ********************************************************
#include <IE.au3>
#include <GuiConstantsEx.au3>
#include <Date.au3>
#include <WindowsConstants.au3>
Opt("WinTitleMatchMode", 2)
$h=WinGetHandle("Internet Explorer")
$oIE = _IEAttach($h, "HWND")
; On teste si la fenêtre IE lancée est celle attendue
If Not WinExists("- Titre de ma page -") Then
msgbox(0,"Accès refusé","Vous devez lancez l'executable depuis le site")
Exit
; Si fenêtre IE lancée avec la bonne page détectée alors, ..
Else
$url = _IEPropertyGet($oIE, "locationurl") ; Vérification de l'URL
If ($url <> "http://www.monsite.com/page_de_connexion.php" ) Then ; Si on n'est pas sur la page de connexion > EXIT
MsgBox(0,"Accès refusé","Vous devez lancez l'executable depuis le site")
Exit
Else ; Sinon on est sur la page de connexion aux applications NG,
$sHTML = _IEDocReadHTML ($oIE) ; On capture la page
If Not StringInStr(_IEDocReadHTML($oIE),"AUTH") Then ; On cherche le champ caché rajouté lors du clic sur le bouton de connexion
MsgBox(64,"Accès refusé","Vous devez lancez l'executable depuis le site") ; S'il n'existe pas > EXIT
Exit
Else ; Sinon on récupère sa valeur
$array=StringRegExp($sHTML, "(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/([0-9]{4}) ([01][0-9]|2[0-3]):([0-5][0-9])",1)
$date_distante1= $array[0]&'/'&$array[1]&'/'&$array[2]&' '&$array[3]&':'&$array[4]
$date_distante2= $array[0]&'/'&$array[1]&'/'&$array[2]&' '&$array[3]&':'&$array[4]+1 ;15/04/2009 13:28 --> 15/04/2009 13:29 ; on laisse 1min de plus pr le lancement de l'exe
$date_distante3= $array[0]&'/'&$array[1]&'/'&$array[2]&' '&$array[3]&':0'&$array[4]+1 ;15/04/2009 13:05 --> 15/04/2009 13:6 ( pour éviter que le zéro disparaisse )
;IMPORTANT : date_distante doit être sous la forme : jj/mm/aaaa hh:mm
; On compare la date courante ( dans autoit ) avec la date distante ( sur le site )
$date_courante=_NowDate()&" "&_NowTime(4)
If ( $date_courante = $date_distante1 or $date_courante = $date_distante2 or $date_courante = $date_distante3 ) Then
;MsgBox(64,"OK","$date_courante = $date_distante")
; ****************************** SCRIPT DE CONNEXION URL DISTANTE *************************************
$oIE = _IECreate ("http://ackmat.ovh.org/")
_IELoadWait($oIE)
$oForm = _IEFormGetObjByName ($oIE, "connect")
$oQuery = _IEFormElementGetObjByName ($oForm, "login")
_IEAction ($oQuery, "focus")
_IEFormElementSetValue($oQuery, "toto")
$oSubmit = _IEGetObjByName ($oIE, "password")
_IEAction ($oSubmit, "focus")
_IEFormElementSetValue($oSubmit, "titi")
sleep(500)
$hwnd = _IEPropertyGet($oIE, "hwnd")
ControlSend($hwnd, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "{Enter}")
; ***********************************************************************************************
Else
MsgBox(0,"Accès refusé","Vous devez lancez l'executable depuis le site") ;
;MsgBox(64,"OK","$date_courante='"&$date_courante&"' $date_distante='"&$date_distante&"'")
Endif
Endif
EndIf
EndIf
Voilà si vous voyez de grosses bourdes ou des énormités, n'hésitez pas à m'en faire part, je suis ouvert à toute critique et je ne demande qu'à apprendre

Re: [..] Tester la présence d'une variable ou d'un cookies?
Posté : sam. 25 avr. 2009 01:12
par evilmouss
Bonsoir,
Désolé de remonter ce topic, mon script marche à merveille cependant j'aurai aimé savoir s'il aurait été possible de l'améliorer, en "cachant" toute la phase d'authentification à l'utilisateur et d'afficher la page internet uniquement à la FIN de l'exécution du script ( en rendant donc invisible le remplissage des champs login et mot de passe )
Re: [..] Tester la présence d'une variable ou d'un cookies?
Posté : sam. 25 avr. 2009 01:47
par orax
Peut-être que vous pourriez cacher la fenêtre le temps de tout charger, à moins que ça pose problème de cacher la fenêtre complète.
Code : Tout sélectionner
$h=WinGetHandle("Internet Explorer")
WinSetState($h,"",@SW_HIDE)
ToolTip("Chargement...",0,0)
$oIE = _IEAttach($h, "HWND")
[...]
ToolTip("")
WinSetState($h,"",@SW_SHOW)
Re: [..] Tester la présence d'une variable ou d'un cookies?
Posté : ven. 04 sept. 2009 10:53
par evilmouss
Non cela est parfait, merci orax. Par contre est-il possible de placer le Tooltip au centre de l'écran qq soit la résolution? Je galère un peu avec les options ^^
Re: [..] Tester la présence d'une variable ou d'un cookies?
Posté : ven. 04 sept. 2009 20:42
par orax
Vous pouvez faire comme ça :
sauf que ça centre sur la première lettre, donc ce n'est pas exactement centré.