Tips WebGadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Deuxième exemple d'Auto Login sur un Forum, ce code est plus complet, tout d'abord avant de faire une recherche sur les champs à remplir, il vérifie que la page présente un formulaire et que celui-ci correspond bien à ce qu'il attend, si c'est le cas alors il remplit les champs et valide.

;----------------------------------------------------------------------------------
; Auto Login Forum
; PureBasic Version 4.10
; Ce code montre comment procéder pour remplir un formulaire
; de connexion d'accès à un Forum automatiquement
; Ce code n'est pas optimisé pour fonctionner sur des pages contenant des Frames
;----------------------------------------------------------------------------------
; Fonctionnement:
; Si l'URL de navigation correspond à un élément de la liste AutoLogin()
; on compte le nombre de <FORM> dans la page, puis
; pour chaque <FORM>, on comptabilise le nombre d'éléments ci dessous:
; <INPUT> de type text
; <INPUT> de type password
; <INPUT> de type submit
; Une <FORM> est considérée comme apte à recevoir les données si
; elle comptabilise ces 3 types mais une seule fois pour chacun d'entre eux
; et si le submit est placé à la fin de cette séquence
; La première <FORM> qui correspond à ces critères est alors remplie des données
; d'enregistrement et validée.
;----------------------------------------------------------------------------------

Enumeration
#Main
#Web
#Status
#Panel
#Progress
EndEnumeration

Structure VARIANT_SPLIT
StructureUnion
Variant.VARIANT
Split.l[4]
EndStructureUnion
EndStructure

Interface IHTMLElementCollection_FIXED
QueryInterface(a,b)
AddRef()
Release()
GetTypeInfoCount(a)
GetTypeInfo(a,b,c)
GetIDsOfNames(a,b,c,d,e)
Invoke(a,b,c,d,e,f,g,h)
toString(a)
put_length(a)
get_length(a)
get__newEnum(a)
item(a1,a2,a3,a4,b1,b2,b3,b4,c)
tags(a1,a2,a3,a4,b)
EndInterface

Interface IHTMLFormElement_Fixed
QueryInterface(a, b)
AddRef()
Release()
GetTypeInfoCount(a)
GetTypeInfo(a, b, c)
GetIDsOfNames(a, b, c, d, e)
Invoke(a, b, c, d, e, f, g, h)
put_action(a.p-bstr)
get_action(a)
put_dir(a.p-bstr)
get_dir(a)
put_encoding(a.p-bstr)
get_encoding(a)
put_method(a.p-bstr)
get_method(a)
get_elements(a)
put_target(a.p-bstr)
get_target(a)
put_name(a.p-bstr)
get_name(a)
put_onsubmit(a.p-Variant)
get_onsubmit(a)
put_onreset(a.p-Variant)
get_onreset(a)
submit()
reset()
put_length(a)
get_length(a)
get__newEnum(a)
item(a1,a2,a3,a4,b1,b2,b3,b4,c)
tags(a.p-Variant, b)
EndInterface

Structure Login
Url.s
Nom.s
Password.s
EndStructure

Global NewList AutoLogin.Login()
Global UserName.s,Password.s,WebBrowser.IWebBrowser2

AddElement (AutoLogin())
AutoLogin()\Url= "http://www.developpez.net/forums/forumdisplay.php?f=911"
AutoLogin()\Nom= " ;<--- A remplir
AutoLogin()\Password= " ;<--- A remplir

Procedure ProcessInputElement(*pFormElement.IHTMLFormElement_Fixed, Valid.l)
Protected *pElemDisp.IDispatch = #Null
Protected *pInputElement.IHTMLInputElement = #Null
Protected *pElement.IHTMLElement= #Null
Protected a.l,Number.l,varIndex.VARIANT_SPLIT
Protected NbText.l,NbPassword.l,NbSubmit.l
Protected hr.l,Submit.l

varIndex\Variant\vt = #VT_I4

If *pFormElement\get_length(@Number)= #S_OK
For a= 0 To Number-1
varIndex\Variant\lVal= a

hr= *pFormElement\item(varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], @*pElemDisp)
If hr=0 And *pElemDisp>0
hr=*pElemDisp\QueryInterface(?IID_IHTMLInputElement, @*pInputElement)
If hr=0 And *pInputElement>0
hr=*pInputElement\get_type(@*bstr)
If hr=0 And *bstr>0
Propriete.s= PeekS (*bstr,-1, #PB_Unicode )
SysFreeString_ (@*bstr)

If Valid=0
If Propriete= "text"
NbText=NbText+1
ElseIf Propriete= "password"
NbPassword=NbPassword+1
ElseIf Propriete= "submit" And NbText=1 And NbPassword=1
NbSubmit=NbSubmit+1
EndIf
Else
If Propriete= "text"
*pInputElement\put_value(AutoLogin()\Nom)
ElseIf Propriete= "password"
*pInputElement\put_value(AutoLogin()\Password)
ElseIf Propriete= "submit"
If *pElemDisp\QueryInterface(?IID_IHTMLElement, @*pElement.IHTMLElement)= #S_OK
*pElement\Click()
*pElement\Release()
Submit= 1
a= Number
EndIf
EndIf
EndIf
EndIf
*pInputElement\Release()
EndIf
*pElemDisp\Release()
EndIf
Next a
EndIf

If NbSubmit=1 And NbText=1 And NbPassword=1
ProcedureReturn ProcessInputElement(*pFormElement,1)
EndIf

If Submit
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure

Procedure ProcessFormsCollection(*pElemColl.IHTMLElementCollection_FIXED)
Protected *pElemDisp.IDispatch = #Null
Protected *pFormElement.IHTMLFormElement_Fixed = #Null
Protected a.l,Number.l,*bstr,varIndex.VARIANT_SPLIT
Protected hr.l,Ret.l

varIndex\Variant\vt = #VT_I4

If *pElemColl\get_length(@Number)= #S_OK
For a=0 To Number-1
varIndex\Variant\lVal= a

hr= *pElemColl\item(varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], @*pElemDisp.IDispatch)
If hr=0 And *pElemDisp>0
hr= *pElemDisp\QueryInterface(?IID_IHTMLFormElement, @*pFormElement)
If hr=0 And *pFormElement>0
If ProcessInputElement(*pFormElement,0)
a=Number
Ret=1
EndIf
*pFormElement\Release()
EndIf
*pElemDisp\Release()
EndIf
Next a
EndIf

If Ret
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure

Procedure ProcessDocument(*pDoc.IHTMLDocument2)
Protected *pElemColl.IHTMLElementCollection_FIXED = #Null
Protected hr.l,Ret.l

hr= *pDoc\get_forms(@*pElemColl)
If hr=0 And *pElemColl>0
Ret=ProcessFormsCollection(*pElemColl)
*pElemColl\Release()
EndIf

If Ret
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure

Procedure Auto_Login(Url.s)
Protected *pDispatch.IDispatch,*pDocument2.IHTMLDocument2
Protected hr.l,Ret.l,message.s


ForEach AutoLogin()
If AutoLogin()\Url=Url
Ret=1
Break
EndIf
Next

If Ret
hr= WebBrowser\get_document(@*pDispatch)
If hr=0 And *pDispatch>0
hr=*pDispatch\QueryInterface(?IID_IHTMLDocument2, @*pDocument2)
If hr=0 And *pDocument2>0
If ProcessDocument(*pDocument2)
message= "Le programme à rempli ce formulaire pour vous ; )" + Chr (13)
message+ "Si vos informations de Login sont correctes, vous serez connecté!"
MessageRequester ( "Info" ,message)
EndIf
*pDocument2\Release()
EndIf
*pDispatch\Release()
EndIf
EndIf
EndProcedure

OpenWindow ( #Main ,0,0,800,600, "Auto Login" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )

If CreateStatusBar ( #Status , WindowID ( #Main ))
AddStatusBarField (600)
AddStatusBarField (200)
EndIf

StatusBarText ( #Status , 0, "" )
StatusBarText ( #Status , 1, "" )

CreateGadgetList ( WindowID ( #Main ))
PanelGadget ( #Panel , 2, 24, 798, 550)
AddGadgetItem ( #Panel , -1, "" )
WebGadget ( #Web ,2,2,788,520, "http://www.developpez.net/forums/forumdisplay.php?f=911" )
CloseGadgetList ()

ProgressBarGadget ( #Progress , 10, 4, 200, 10, 0, 100)

WebBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )

Repeat
Event= WaitWindowEvent ()
Select Event
Case #PB_Event_Gadget
Select EventGadget ()
Case #Web
Select EventType ()

Case #PB_EventType_TitleChange
Title.s= GetGadgetItemText ( #Web , #PB_Web_PageTitle )
SetGadgetItemText ( #Panel , 0, Title, 0)

Case #PB_EventType_StatusChange
StatusTexte.s= GetGadgetItemText ( #Web , #PB_Web_StatusMessage )
StatusBarText ( #Status , 0, StatusTexte)

Case #PB_EventType_DownloadProgress
Progress= GetGadgetAttribute ( #Web , #PB_Web_Progress )
ProgressMax= GetGadgetAttribute ( #Web , #PB_Web_ProgressMax )

If Progress<>ProgressMax
HideGadget ( #Progress ,0)
SetGadgetState ( #Progress , Progress)
Else
HideGadget ( #Progress ,1)
EndIf

Case #PB_EventType_DownloadEnd
Url.s= GetGadgetText ( #Web )
Auto_Login(Url)
EndSelect
EndSelect

Case #WM_CLOSE
quit.l=1
EndSelect
Until quit=1
End

DataSection
IID_IHTMLElement:
Data.l $3050F1FF
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B

IID_IHTMLInputElement:
Data.l $3050F5D2
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B

IID_IHTMLFormElement:
Data.l $3050F1F7
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B

IID_IHTMLDocument2:
Data.l $332C4425
Data.w $26CB, $11D0
Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
EndDataSection

Dernière modification par nico le dim. 09/mars/2008 14:27, modifié 6 fois.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

je vais tester ça tout de suite :)

Tu as laissé ton mot de passe dans le code ,c'est volontaire ?

[EDIT]
Je viens de tester, je n'y comprends rien ... mais ça fonctionne bien.
Je vais l'ajouter dans la page sources, merci.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

La boulette :lol:
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

j'ai pas tout compris mais c'est sympa
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

; Voici une partie du code source de la page de connexion au Forum Français:

<form action="login.php" method="post" target="_top">

<table width="100%" cellspacing="2" cellpadding="2" border="0" align="center">
<tr>
<td align="left" class="nav"><a href="index.php" class="nav">PureBasic Index du Forum</a></td>
</tr>

</table>

<table width="100%" cellpadding="4" cellspacing="1" border="0" class="forumline" align="center">
<tr>
<th height="25" class="thHead" nowrap="nowrap">Veuillez entrer votre nom d'utilisateur et votre mot de passe pour vous connecter.</th>
</tr>
<tr>
<td class="row1"><table border="0" cellpadding="3" cellspacing="1" width="100%">
<tr>
<td colspan="2" align="center">&nbsp;</td>

</tr>
<tr>
<td width="45%" align="right"><span class="gen">Nom d'utilisateur:</span></td>
<td>
<input type="text" class="post" name="username" size="25" maxlength="40" value="" />
</td>
</tr>
<tr>

<td align="right"><span class="gen">Mot de passe:</span></td>
<td>
<input type="password" class="post" name="password" size="25" maxlength="32" />
</td>
</tr>
<tr align="center">
<td colspan="2"><span class="gen">Se connecter automatiquement à chaque visite: <input type="checkbox" name="autologin" /></span></td>
</tr>

<tr align="center">
<td colspan="2"><input type="hidden" name="redirect" value="" /><input type="submit" name="login" class="mainoption" value="Connexion" /></td>
</tr>
<tr align="center">
<td colspan="2"><span class="gensmall"><a href="profile.php?mode=sendpassword" class="gensmall">J'ai oublié mon mot de passe</a></span></td>
</tr>
</table></td>
</tr>

</table>

</form>

; Dans la procédure ProcessDocument(*pDoc.IHTMLDocument2)
; *pDoc\get_forms(@*pElemColl.IHTMLElementCollection_FIXED)me permet d'obtenir un pointeur
; sur les parties du code HTML qui constituent un formulaire qui commence par <form et finit par </form>
; Pour connaitre le nombre de formulaire de cette collection, j'appelle cette interface *pElemColl\get_length(@Number)
; ensuite *pElemColl\item(...) permet d'obtenir un pointeur sur l'interface Idispatch pour chaque formulaire,
; grâce à ce pointeur j'appelle une autre interface *pElemDisp\QueryInterface(?IID_IHTMLFormElement, @*pFormElement)
; pour avoir accès aux éléments contenu dans le formulaire
; *pFormElement\get_length(@Number) me donne le nombre d'éléments de ce formulaire
; *pFormElement\item(...) permet d'obtenir un pointeur sur l'interface Idispatch pour chaque élément,
; j'appelle ensuite *pElemDisp\QueryInterface(?IID_IHTMLInputElement, @*pInputElement)
; et j'obtiens un nouveau pointeur sur l'élément en question qui me permet d'entrer des données ou en extraire.
; Cela fonctionne quel que soit le langage de la page.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Merci pour les explications ,c'est déjà moins mystérieux :D
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Dans le code précédent, je faisais un Get_all et je listais tous les tags à la recherche des INPUT, c'était plus simple mais moins efficace et moins rapide finalement.

Il y a toute une panoplie d'interface pour traiter une page web (le problème c'est de connaitre la hiérarchie, quelle interface me permet d'en appeller une autre!)

Par exemple avec IHTMLDocument3::getElementsByTagName, on a directement un pointeur sur une collection par Tag, ce qui permettrait de réduire le code, après c'est une question de compatibilité de version d'Internet Explorer.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai ré-éditer le code précédent avec les fonctions de PureBasic qui gère les évènements de navigation.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai modifié le premier exemple d'Auto Login, il fonctionne aussi bien que le deuxième exemple.

La différence, c'est que si vous mettez en lien la page de votre profil sur le Forum, le premier exemple va remplir les premier champs input text et password et valider, alors que le second identifiera cette page comme étant non valide pour une inscription sur un Forum.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Avec ce troisième exemple, il n'est plus nécessaire de remplir les informations de Login pour se connecter automatiquement. Le programme vérifie à chaque chargement d'une page si un formulaire est disponible et lance un event sur celui-ci. Toutes les données que vous saisissez pour le remplissage de ce formulaire sont alors capturées, à la prochaine connection sur le même forum, le programme vous propose de remplir le formulaire à votre place.

Code : Tout sélectionner

;----------------------------------------------------------------------------------
; Auto Login Forum
; Exemple N°3
; PureBasic Version 4.10
; Ce code montre comment procéder pour remplir un formulaire
; de connexion d'accès à un Forum automatiquement
; Ce code n'est pas optimisé pour fonctionner sur des pages contenant des Frames
; ---------------------------------------------------------------------------------
; Cette version permet de capturer et d'enregistrer vos données de Login que 
; vous soumettez dans un formulaire et ainsi vous permettre de vous logger 
; automatiquement à la prochaine session
;----------------------------------------------------------------------------------

Enumeration
    #Main
    #Web
    #Status
    #Panel
    #Progress
    #Check
EndEnumeration

Structure DispatchFunctions
    QueryInterface.l
    AddRef.l
    Release.l
    GetTypeInfoCount.l
    GetTypeInfo.l
    GetIDsOfNames.l
    Invoke.l
EndStructure

Structure DispatchObject
    *IDispatch.IDispatch
    ObjectCount.l
EndStructure

Structure VARIANT_SPLIT
    StructureUnion
    Variant.VARIANT
    Split.l[4]
    EndStructureUnion
EndStructure

Interface IHTMLElementCollection_FIXED
    QueryInterface(a,b)
    AddRef()
    Release()
    GetTypeInfoCount(a)
    GetTypeInfo(a,b,c)
    GetIDsOfNames(a,b,c,d,e)
    Invoke(a,b,c,d,e,f,g,h)
    toString(a)
    put_length(a)
    get_length(a)
    get__newEnum(a)
    item(a1,a2,a3,a4,b1,b2,b3,b4,c)
    tags(a1,a2,a3,a4,b)
EndInterface

Interface IHTMLFormElement_Fixed
    QueryInterface(a, b)
    AddRef()
    Release()
    GetTypeInfoCount(a)
    GetTypeInfo(a, b, c)
    GetIDsOfNames(a, b, c, d, e)
    Invoke(a, b, c, d, e, f, g, h)
    put_action(a.p-bstr)
    get_action(a)
    put_dir(a.p-bstr)
    get_dir(a)
    put_encoding(a.p-bstr)
    get_encoding(a)
    put_method(a.p-bstr)
    get_method(a)
    get_elements(a)
    put_target(a.p-bstr)
    get_target(a)
    put_name(a.p-bstr)
    get_name(a)
    put_onsubmit(a.p-Variant)
    get_onsubmit(a)
    put_onreset(a.p-Variant)
    get_onreset(a)
    submit()
    reset()
    put_length(a)
    get_length(a)
    get__newEnum(a)
    item(a1,a2,a3,a4,b1,b2,b3,b4,c)
    tags(a.p-Variant, b)
EndInterface

Structure Login
    Url.s
    Nom.s
    Password.s
EndStructure

Declare.l process(Option.l)

Global NewList AutoLogin.Login()
Global NewList dispatchObject.DispatchObject()
Global WebBrowser.IWebBrowser2

; AddElement (AutoLogin())
; AutoLogin()\Url= "http://www.developpez.net/forums/forumdisplay.php?f=911"
; AutoLogin()\Nom="        ;<--- A remplir
; AutoLogin()\Password="    ;<--- A remplir

Procedure.l AddRef(*THIS.DispatchObject)
    *THIS\ObjectCount + 1
    ProcedureReturn *THIS\ObjectCount
EndProcedure

Procedure.l QueryInterface(*THIS.DispatchObject, *iid.GUID, *Object.Long)
    Protected *THIS_.IDispatch
    
    If CompareMemory(*iid,?DIID_HTMLFormElementEvents2,16)Or CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID))
        *Object\l = *THIS
        *THIS_=*THIS.DispatchObject
        *THIS_\AddRef()
        ProcedureReturn #S_OK
    EndIf
    
    If CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
        *Object\l = *THIS
        *THIS_=*THIS.DispatchObject
        *THIS_\AddRef()
        ProcedureReturn #S_OK
    EndIf
    
    *Object\l = 0
    ProcedureReturn #E_NOINTERFACE
EndProcedure

Procedure.l Release(*THIS.DispatchObject)
    *THIS\ObjectCount - 1
    ProcedureReturn *THIS\ObjectCount
EndProcedure

Procedure GetTypeInfoCount(*THIS.DispatchObject, pctinfo)
    ProcedureReturn #E_NOTIMPL
EndProcedure

Procedure GetTypeInfo(*THIS.DispatchObject, iTInfo, lcid, ppTInfo )
    ProcedureReturn #E_NOTIMPL
EndProcedure

Procedure GetIDsOfNames(*THIS.DispatchObject, riid, rgszNames, cNames, lcid, rgDispId) : EndProcedure

Procedure Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, *pDispParams.DISPPARAMS, *pVarResult.VARIANT, *pExcepInfo, *puArgErr)
    Protected *pEvtObj.IHTMLEventObj=#Null
    Protected *pElem.IHTMLElement=#Null
    Protected *pDispElem.IDispatch=#Null
    Protected *params1.VARIANT=#Null
    Protected AttributeValue.VARIANT,Propriete.s,Ret.l,message.s,hr.l,Url.s,Pos.l
    Static Nom.s,Password.s
    
    ;Debug "dispIdMember= "+Str(dispIdMember)
    If dispIdMember= 1049   ;DISPID_ONFOCUSOUT
        *params1.VARIANT=*pDispParams\rgvarg
        *pDispElem.IDispatch = *params1\pdispVal
        If *pDispElem
            hr= *pDispElem\QueryInterface(?IID_IHTMLEventObj, @*pEvtObj)
            If hr=0 And *pEvtObj>0
                hr= *pEvtObj\get_srcElement(@*pElem.IHTMLElement)
                If hr=0 And *pElem>0
                    If *pElem\getAttribute("type",0,@AttributeValue)=#S_OK
                        If AttributeValue\vt=#VT_BSTR And AttributeValue\bstrVal>0
                            Propriete=PeekS(AttributeValue\bstrVal,-1,#PB_Unicode)
                            SysFreeString_(@AttributeValue\bstrVal)
                            If Propriete="text"                                                      
                                *pElem\GetAttribute("value",0,@AttributeValue)
                                If AttributeValue\bstrVal
                                    Nom= PeekS(AttributeValue\bstrVal,-1,#PB_Unicode)
                                    Debug "Perte de focus --> Nom= "+Nom
                                    Debug "------------------------------"
                                    SysFreeString_(@AttributeValue\bstrVal)
                                EndIf 
                            ElseIf Propriete="password"
                                *pElem\GetAttribute("value",0,@AttributeValue)
                                If AttributeValue\bstrVal
                                    Password= PeekS(AttributeValue\bstrVal,-1,#PB_Unicode) 
                                    Debug "Perte de focus --> Password= "+Password
                                    Debug "------------------------------"
                                    SysFreeString_(@AttributeValue\bstrVal)
                                EndIf 
                            EndIf
                        EndIf
                    EndIf
                    *pElem\Release()
                EndIf
                *pEvtObj\Release()
            EndIf
        EndIf 
    EndIf 
    If dispIdMember= 1007 ;DISPID_ONSUBMIT
        If Nom<>"" And Password<>""    
            message.s= "Souhaitez-vous que le programme sauvegarde vos données pour un enregistrement automatique à la prochaine session?"
            Ret=MessageRequester("Info" ,message,#PB_MessageRequester_YesNo)
            If Ret=6
                Pos=FindString(GetGadgetText(#Web),"?",1)
                If Pos
                  Url=Left(GetGadgetText(#Web),Pos-1)
                Else
                  Url=GetGadgetText(#Web)
                EndIf
                Debug "----Nouvelle données enregistrées----"
                Debug "Url= "+Url
                Debug "Nom= "+Nom
                Debug "Password= "+Password
                Debug "-------------------------------------"
                AddElement (AutoLogin())
                AutoLogin()\Url= Url
                AutoLogin()\Nom= Nom
                AutoLogin()\Password= PassWord
            EndIf
            Nom="":Password=""
        EndIf 
    EndIf 
EndProcedure

Procedure ConnectEvent(*pElemDisp.IDispatch)
    Protected *pElement.IHTMLElement=#Null
    Protected *pCPC.IConnectionPointContainer=#Null
    Protected *pCP.IConnectionPoint=#Null
    Protected hr.l,Ret.l
    
    hr= *pElemDisp\QueryInterface(?IID_IHTMLElement, @*pElement)
    If hr=0 And *pElement>0
        hr= *pElement\QueryInterface(?IID_IConnectionPointContainer, @*pCPC)
        If hr=0 And *pCPC>0
            hr= *pCPC\FindConnectionPoint(?DIID_HTMLFormElementEvents2, @*pCP)
            If hr=0 And *pCP>0
                AddElement(DispatchObject())
                DispatchObject()\IDispatch = ?dispatchFunctions
                If *pCP\Advise(@DispatchObject(), @dwCookie)=#S_OK
                    Debug "Prêt à recevoir les évènements liés à ce formulaire!"
                    Debug "------------------------------"
                    Ret=1
                Else
                    DeleteElement(DispatchObject())
                EndIf
                *pCP\Release()   
            EndIf
        EndIf
        *pCPC\Release() 
    EndIf
    
    ProcedureReturn Ret 
EndProcedure

Procedure ProcessInputElement(*pFormElement.IHTMLFormElement_Fixed, Option.l)
    Protected *pElemDisp.IDispatch = #Null
    Protected *pInputElement.IHTMLInputElement = #Null
    Protected *pElement.IHTMLElement= #Null
    Protected a.l,Number.l,varIndex.VARIANT_SPLIT
    Protected NbText.l,NbPassword.l,NbSubmit.l
    Protected hr.l,Submit.l,Ret.l,message.s,Propriete.s
    
    varIndex\Variant\vt = #VT_I4
    
    If *pFormElement\get_length(@Number)= #S_OK
        For a= 0 To Number-1
            varIndex\Variant\lVal= a
            
            hr= *pFormElement\item(varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], @*pElemDisp)
            If hr=0 And *pElemDisp>0
                hr=*pElemDisp\QueryInterface(?IID_IHTMLInputElement, @*pInputElement)
                If hr=0 And *pInputElement>0
                    hr=*pInputElement\get_type(@*bstr)
                    If hr=0 And *bstr>0
                        Propriete= PeekS (*bstr,-1, #PB_Unicode )
                        SysFreeString_ (@*bstr)
                        
                        If Option=0 Or Option=1
                            If Propriete= "text"
                                NbText=NbText+1
                            ElseIf Propriete= "password"
                                NbPassword=NbPassword+1
                            ElseIf Propriete= "submit" And NbText=1 And NbPassword=1
                                NbSubmit=NbSubmit+1
                            EndIf
                            
                        ElseIf Option=2
                            If Propriete= "text"
                                *pInputElement\put_value(AutoLogin()\Nom)
                            ElseIf Propriete= "password"
                                *pInputElement\put_value(AutoLogin()\Password)
                            ElseIf Propriete= "submit"
                                hr= *pElemDisp\QueryInterface(?IID_IHTMLElement, @*pElement.IHTMLElement)
                                If hr=0 And *pElement>0
                                    *pElement\Click()
                                    *pElement\Release()
                                    Submit= 1
                                    a= Number
                                EndIf
                            EndIf 
                        EndIf
                    EndIf
                    *pInputElement\Release()
                EndIf
                *pElemDisp\Release()
            EndIf
        Next a
    EndIf
    
    
    If NbSubmit=1 And NbText=1 And NbPassword=1
        If Option=1
            ProcedureReturn 2
        Else
            message.s= "Souhaitez-vous que le programme remplisse ce formulaire pour vous?"
            Ret=MessageRequester ( "Info" ,message ,#PB_MessageRequester_YesNo)
            If Ret=6 ;OUI
                ProcessInputElement(*pFormElement,2)
            Else
                message.s= "Souhaitez-vous supprimer les informations d'enregistrement liées à ce formulaire?"
                Ret=MessageRequester ( "Info" ,message ,#PB_MessageRequester_YesNo) 
                If Ret=6 ;OUI
                    Debug "----Destruction des données enregistrées----"
                    Debug "Url= "+AutoLogin()\Url
                    Debug "Nom= "+AutoLogin()\Nom
                    Debug "Password= "+AutoLogin()\Password
                    Debug "-------------------------------------"
                    DeleteElement(AutoLogin())
                    ProcedureReturn 2
                EndIf   
            EndIf
            ProcedureReturn 0 
        EndIf 
    EndIf
    
    If Submit
        ProcedureReturn 1
    EndIf
    
    ProcedureReturn 0
EndProcedure

Procedure ProcessFormsCollection(*pElemColl.IHTMLElementCollection_FIXED, Option.l)
    Protected *pElemDisp.IDispatch = #Null
    Protected *pFormElement.IHTMLFormElement_Fixed = #Null
    Protected a.l,Number.l,varIndex.VARIANT_SPLIT
    Protected hr.l,Ret.l
    
    varIndex\Variant\vt = #VT_I4
    
    If *pElemColl\get_length(@Number)= #S_OK
        For a=0 To Number-1
            varIndex\Variant\lVal= a
            
            hr= *pElemColl\item(varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], varIndex\Split[0], varIndex\Split[1], varIndex\Split[2], varIndex\Split[3], @*pElemDisp.IDispatch)
            If hr=0 And *pElemDisp>0
                hr= *pElemDisp\QueryInterface(?IID_IHTMLFormElement, @*pFormElement)
                If hr=0 And *pFormElement>0
                    
                    Select  ProcessInputElement(*pFormElement,Option)
                        Case 1
                            a=Number
                            Ret=1
                            
                        Case 2
                            If ConnectEvent(*pElemDisp)
                                a=Number
                                Ret=1  
                            EndIf 
                    EndSelect 
                    
                    *pFormElement\Release()
                EndIf
                *pElemDisp\Release()
            EndIf
        Next a
    EndIf
    
    ProcedureReturn Ret
EndProcedure

Procedure ProcessDocument(*pDoc.IHTMLDocument2, Option.l)
    Protected *pElemColl.IHTMLElementCollection_FIXED = #Null
    Protected hr.l,Ret.l
    
    hr= *pDoc\get_forms(@*pElemColl)
    If hr=0 And *pElemColl>0
        Ret=ProcessFormsCollection(*pElemColl, Option.l)
        *pElemColl\Release()
    EndIf
    
    ProcedureReturn Ret
EndProcedure

Procedure Process(Option.l)
    Protected *pDispatch.IDispatch=#Null
    Protected *pDocument2.IHTMLDocument2=#Null
    Protected hr.l
    
    hr= WebBrowser\get_document(@*pDispatch)
    If hr=0 And *pDispatch>0
        hr=*pDispatch\QueryInterface(?IID_IHTMLDocument2, @*pDocument2)
        If hr=0 And *pDocument2>0
            ProcessDocument(*pDocument2, Option)
            *pDocument2\Release()
        EndIf
        *pDispatch\Release()
    EndIf
EndProcedure

Procedure Auto_Login(Url.s, Option.l)
    Protected Ret.l
    
    ForEach AutoLogin()
        If FindString(Url,AutoLogin()\Url,1)
            Ret=1
            Break
        EndIf
    Next
    
    If Ret
        Debug "----Url enregistrée contenant des données de Login----"
        Debug "Url= "+AutoLogin()\Url
        Debug "Nom= "+AutoLogin()\Nom
        Debug "Password= "+AutoLogin()\Password
        Debug "------------------------------------------------------"
        Process(0)
    ElseIf Option
        Process(1)
    EndIf
EndProcedure

OpenWindow ( #Main ,0,0,800,600, "Auto Login" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )

AddKeyboardShortcut(#Main,#PB_Shortcut_Control | #PB_Shortcut_D, 1)
  
If CreateStatusBar ( #Status , WindowID ( #Main ))
    AddStatusBarField (600)
    AddStatusBarField (200)
EndIf

StatusBarText ( #Status , 0, "" )
StatusBarText ( #Status , 1, "" )

CreateGadgetList ( WindowID ( #Main ))
PanelGadget ( #Panel , 2, 24, 798, 550)
    AddGadgetItem ( #Panel , -1, "" )
    WebGadget ( #Web ,2,2,788,520, "http://www.purebasic.fr/french/login.php")
CloseGadgetList ()

ProgressBarGadget ( #Progress , 10, 4, 200, 10, 0, 100)
CheckBoxGadget(#Check, 300, 4, 300, 20, "Autoriser l'enregistrement automatique des saisies de Login")
SetGadgetState(#Check,1)

WebBrowser.IWebBrowser2 = GetWindowLong_ ( GadgetID ( #Web ), #GWL_USERDATA )

Repeat
    Event= WaitWindowEvent ()
    Select Event
        Case #PB_Event_Menu
            Select EventMenu() 
                Case 1
                    process(3)
            EndSelect 
            
        Case  #PB_Event_Gadget 
            Select EventGadget() 
                Case #Check
                  If GetGadgetState(#Check)
                    SetGadgetState(#Web,#PB_Web_Refresh)
                  EndIf 
                
                Case #Web
                    Select EventType()
                        Case #PB_EventType_DownloadStart
                            HideGadget (#Progress ,0)
                           
                        Case #PB_EventType_TitleChange  
                            Title.s=GetGadgetItemText(#Web,#PB_Web_PageTitle)
                            SetGadgetItemText (#Panel , 0, Title, 0)
                            
                        Case #PB_EventType_StatusChange 
                            StatusTexte.s=GetGadgetItemText(#Web,#PB_Web_StatusMessage)
                            StatusBarText (#Status , 0, StatusTexte)
                            
                        Case #PB_EventType_DownloadProgress
                            Progress.f=GetGadgetAttribute(#Web,#PB_Web_Progress)
                            ProgressMax.f=GetGadgetAttribute(#Web,#PB_Web_ProgressMax)
  
                            DownloadProgress.l=Int((Progress/ProgressMax)*100)
                            SetGadgetState (#Progress ,DownloadProgress)
                            
                        Case #PB_EventType_DownloadEnd 
                            HideGadget (#Progress ,1)
                            Url.s=GetGadgetText(#Web)
                            SetWindowTitle(#Main,"Auto Login "+"[ "+url+" ]")
                            Option.l=GetGadgetState(#Check)
                            Auto_Login(Url,Option)
                    EndSelect   
            EndSelect
            
        Case #WM_CLOSE
            quit.l=1
    EndSelect
Until quit=1
End

DataSection
    dispatchFunctions:
    Data.l @QueryInterface(),@AddRef(),@Release(),@GetTypeInfoCount()
    Data.l @GetTypeInfo(),@GetIDsOfNames(),@Invoke()
    
    IID_IUnknown:
    Data.l $00000000
    Data.w $0000, $0000
    Data.b $C0, $00, $00, $00, $00, $00, $00, $46
    
    IID_IDispatch:
    Data.l $00020400
    Data.w $0000, $0000
    Data.b $C0, $00, $00, $00, $00, $00, $00, $46
    
    IID_IHTMLElement:
    Data.l $3050F1FF
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
    
    IID_IHTMLInputElement:
    Data.l $3050F5D2
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
    
    IID_IConnectionPointContainer:
    Data.l $B196B284
    Data.w $BAB4, $101A
    Data.b $B6, $9C, $00, $AA, $00, $34, $1D, $07 
    
    DIID_HTMLFormElementEvents2:
    Data.l $3050F614
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
    
    IID_IHTMLFormElement:
    Data.l $3050F1F7
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
    
    IID_IHTMLDocument2:
    Data.l $332C4425
    Data.w $26CB, $11D0
    Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
    
    IID_IHTMLEventObj:
    Data.l $3050F32D
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
EndDataSection
Dernière modification par nico le jeu. 13/mars/2008 12:24, modifié 1 fois.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Il doit manquer un morceau...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Voilà, trop long pour le mettre en couleur! :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Une API à connaitre: DeleteUrlCacheEntry

Pour être sûr charger une page Web si l'url est déjà dans le cache d'internet, on serait tenter de faire:

Code : Tout sélectionner

SetGadgetText(#Web,Url)
SetGadgetState(#Web,#PB_Web_Refresh)
Mais ça ne marche qu'un coup sur deux, la première fois la page actuelle est rechargée et la deuxième fois on a enfin la nouvelle url qui est rechargée ?
En plus, ça fait toujours deux chargement, une par le cache et une actualisée.

Avec cet API, ça fonctionne très bien, un seul chargement:

Code : Tout sélectionner

DeleteUrlCacheEntry_(Url)
SetGadgetText(#Web,Url)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Merci pour ce joli code
Ces codes sont excellents nico
Slt Nico, tu fais du trés bon boulot.... Continue comme ca

Merci. :)


Si vous souhaitez réaliser quelque chose en particulier avec un WebGadget, et que vous avez besoin d'un petit coup de main, n'hésiter pas à m'en faire la demande, j'essayrais de vous aider...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Un truc qui vient du Forum Anglais qui permet d'afficher les contrôles avec les thèmes:
http://www.purebasic.fr/english/viewtop ... 898#242898

Pour tester, il suffit de reprendre le code mettant en place l'interface IDocHostUIHandler au début de ce topic, que j'ai mis à jour dont voici les modifications:

Code : Tout sélectionner

#DOCHOSTUIFLAG_THEME = $40000

Structure DOCHOSTUIINFO
    cbSize.l
    dwFlags.l
    dwDoubleClick.l
    *pchHostCss.l
    *pchHostNS.l
EndStructure

Procedure GetHostInfo(*THIS.IDocHost, *pInfo.DOCHOSTUIINFO)
   *pInfo\dwFlags = *pInfo\dwFlags | #DOCHOSTUIFLAG_THEME
   ProcedureReturn #S_OK
EndProcedure

Il y a une autre façon, c'est en utilisant:
SetGadgetAttribute(0, #PB_Web_BlockPopupMenu, 1)

Le fait de bloquer le Popup menu active les thèmes, bizzarre, non?

:)
Répondre