Quelltext AUS Webgadget lesen [gelöst]

Für allgemeine Fragen zur Programmierung mit PureBasic.
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Also im Prinzip kann man mit dem WebGadget so ziemlich alles anstellen, man muss
nur wissen wie. Leider ist das doch ziemlich komplex, desshalb kann man das nicht
in ein paar Sätzen erklären.

Ich dachte eigentlich ich hätte sowas schonmal irgendwo gepostet,
aber ich denke das hier sollte dir helfen:

Code: Alles auswählen

DataSection

  IID_IHTMLDocument2: ; {332C4425-26CB-11D0-B483-00C04FD90119}
    Data.l $332C4425
    Data.w $26CB, $11D0        
    Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
    
  IID_IHTMLDocument3: ; {3050F485-98B5-11CF-BB82-00AA00BDCE0B}
    Data.l $3050F485
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
    
  IID_NULL: ; {00000000-0000-0000-0000-000000000000}
    Data.l $00000000
    Data.w $0000, $0000
    Data.b $00, $00, $00, $00, $00, $00, $00, $00
    
EndDataSection

; Nur eine Hilfsfunktion
;
Procedure WebGadget_Document(Gadget, *IID)
  Document = 0

  Browser.IWebBrowser2 = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
  If Browser
    If Browser\get_Document(@DocumentDispatch.IDispatch) = #S_OK And DocumentDispatch
      DocumentDispatch\QueryInterface(*IID, @Document)
      DocumentDispatch\Release()
    EndIf
  EndIf      
      
  ProcedureReturn Document
EndProcedure


; Gibt den markierten Text zurück
;
Procedure.s WebGadget_Selection(Gadget)
  Result$ = ""
              
  Document.IHTMLDocument2 = WebGadget_Document(Gadget, ?IID_IHTMLDocument2)
  If Document
    If Document\get_selection(@Selection.IHTMLSelectionObject) = #S_OK
    
      If Selection\get_type(@bstr_type) = #S_OK And bstr_type
        If LCase(PeekS(bstr_type, -1, #PB_Unicode)) = "text"            
        
          If Selection\createRange(@TextRange.IDispatch) = #S_OK And TextRange
          
            UnicodeText$ = Space(10)                
            PokeS(@UnicodeText$, "text", -1, #PB_Unicode)                
            pUnicodeText = @UnicodeText$
            If TextRange\GetIDsOfNames(?IID_NULL, @pUnicodeText, 1, #LOCALE_SYSTEM_DEFAULT, @dispid_text) = #S_OK
            
              params.DISPPARAMS\cArgs = 0
              params\cNamedArgs = 0                                 
              If TextRange\Invoke(dispid_text, ?IID_NULL, #LOCALE_SYSTEM_DEFAULT, #DISPATCH_PROPERTYGET, @params, @varResult.VARIANT, #Null, #Null) = #S_OK 
                If varResult\vt <> #VT_BSTR
                  VariantChangeType_(@varResult, @varResult, 0, #VT_BSTR)
                EndIf 
                
                If varResult\vt = #VT_BSTR
                  Result$ = PeekS(varResult\bstrVal, -1, #PB_Unicode)
                EndIf
                
                VariantClear_(@varResult)
              EndIf                  
            EndIf
            
            TextRange\Release()
          EndIf
        
        EndIf
        SysFreeString_(bstr_type)
      EndIf          
    
      Selection\Release()
    EndIf             

    Document\Release()
  EndIf          
  
  ProcedureReturn Result$
EndProcedure


; Gibt alles was innerhalb des <BODY> tags an reinem Text vorhanden ist zurück,
; also im Prinzip den ganzen Text der angezeigt wird
;
Procedure.s WebGadget_PageText(Gadget)
  Result$ = ""

  Document.IHTMLDocument2 = WebGadget_Document(Gadget, ?IID_IHTMLDocument2)
  If Document
    If Document\get_body(@Body.IHTMLElement) = #S_OK    
      If Body\get_innerText(@bstr_text) = #S_OK And bstr_text
        Result$ = PeekS(bstr_text, -1, #PB_Unicode)
        SysFreeString_(bstr_text)
      EndIf          
  
      Body\Release()  
    EndIf        
    Document\Release()
  EndIf          
  
  ProcedureReturn Result$
EndProcedure


; Gibt den kompletten HTML code zurück
;
Procedure.s WebGadget_PageHtml(Gadget)
  Result$ = ""

  Document.IHTMLDocument3 = WebGadget_Document(Gadget, ?IID_IHTMLDocument3)
  If Document
    If Document\get_documentElement(@Root.IHTMLElement) = #S_OK
      If Root\get_outerHTML(@bstr_html) = #S_OK And bstr_html
        Result$ = PeekS(bstr_html, -1, #PB_Unicode)
        SysFreeString_(bstr_html)
      EndIf
      
      Root\Release()
    EndIf                       
    Document\Release()
  EndIf          
  
  ProcedureReturn Result$
EndProcedure

; ===================================================================
; Beispiel
; ===================================================================


Enumeration
  #Web
  #Editor
  #Button1
  #Button2
  #Button3
EndEnumeration

If OpenWindow(0, 0, 0, 500, 600, "Web", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  CreateGadgetList(WindowID(0))
  
  WebGadget(#Web, 10, 10, 480, 300, "www.purebasic.com")
  ButtonGadget(#Button1, 10, 320, 120, 25, "Text")
  ButtonGadget(#Button2, 140, 320, 120, 25, "Html")
  ButtonGadget(#Button3, 270, 320, 120, 25, "Selection")
  EditorGadget(#Editor, 10, 355, 480, 235)
  
  Repeat
    Event = WaitWindowEvent()    
    
    If Event = #PB_Event_Gadget 
      Select EventGadget()
        Case #Button1: SetGadgetText(#Editor, WebGadget_PageText(#Web))
        Case #Button2: SetGadgetText(#Editor, WebGadget_PageHtml(#Web))
        Case #Button3: SetGadgetText(#Editor, WebGadget_Selection(#Web))
      EndSelect      
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
End
Für konkrete Fragen bin ich gerne offen, aber das ganze von A-Z zu erklären dauert
mir dann doch zu lange.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@roherter

so, und einen Verweis für dich, weil du die falsche Schreibweise wiederholt hast, anstatt ihm die richtige zu zeigen.


@onny

auswerten, der Wert

interessiert, das Interesse, lat. inter esse: dazwischen sein, dabei sein
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

Kaeru Gaman hat geschrieben:@roherter
so, und einen Verweis für dich, weil du die falsche Schreibweise wiederholt hast, anstatt ihm die richtige zu zeigen.
@onny
auswerten, der Wert
interessiert, das Interesse, lat. inter esse: dazwischen sein, dabei sein
hey cool, danke, hier lernt man nicht nur pb :wink:

@freak: danke, werde den code gleich nach dem essen ausprobieren :D
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Kaeru Gaman hat geschrieben:@roherter

so, und einen Verweis für dich, weil du die falsche Schreibweise wiederholt hast, anstatt ihm die richtige zu zeigen.


@onny

auswerten, der Wert

interessiert, das Interesse, lat. inter esse: dazwischen sein, dabei sein
Danke, wollte ich schon immer mal haben :freak: .
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

@freak:
erstmal danke :D
einfach zu verstehen ist dein code nicht und funktionieren will er auch nicht so richtig... ist der code für pb 4.0? bei mir kommt ein Fehler wegen dem #PB_Unicode und noch ein paar weitere... :cry:
Leider bin ich in PB noch nicht begabt genug um mit den Fehlern zurecht zu kommen :freak:
Also eigentlich brauch ich nur das mit dem makierten Text... ohne das es halt nun wirklich markiert ist. :freak: Da ich wie schon oft gesagt den Quelltext nicht auslesen kann. :?
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Ja, ist PB4 code. Für 3.94 fehlen ein paar Strukturen, und das mit dem Peek/Poke geht nicht.

> Also eigentlich brauch ich nur das mit dem makierten Text... ohne das es halt nun wirklich markiert ist.

Sorry, das kapier ich nicht. Vielleicht sagst du mal was du genau machen willst.
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

Hab ich mir gedacht :D Dann fang ich mal vom Anfang an.
1. Das Webgadget sendet ein <form ...> automatisch ab. (z.B. Login auf googlemail.com)
2. Der Quelltext kann von der aktuellen Seite nicht ausgelsen werden, da der GetGadgetText() noch die "URADRESSE" beinhaltet.
Z.B.
- http://www.web.de/login.php
Die Seite, die nach dem automatisch abgesendeten <form> kommt kann ich so nicht auslesen. Die Parameter sind meist SSL-Verschlüsselt und zu lang.
3. Jetzt gibt es ja die Methode einen makierten Text im WebGadget auszulesen. Das ist recht nützlich, da das Programm nicht auf den Sourcecode der Seite zurückgreift sondernden Text ausliest der "wirklich" darsteht.
4. Nun ist es bei einem automatischen Login-Script nicht gerade von Vorteil wenn der User immer bestimmten Text makieren muss, damit das Programm die Informationen der neuen Seite auswerten kann :D
5. So kam ich auf die Idee die PHP-Seite mit abgesendeten <form> OHNE Parameter auszuwerten....

Ich hoffe es ist nun etwas verständlicher :D
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Nein, ich hab dich nicht verstanden, bin grad aber auch leider mit nem Mathe-Problem abgelenkt, aber vielleicht hast du einfach nur ein Problem mit Frames? Oder mit Ajax, damit neuer Code auch in deinem Programm ankommt, muss dieses dann natürlich Javascript ausführen können, wenns dir aber um Googlemail geht: Da gibts ne API von Google dazu!
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

:bluescreen:
@freak: dein code vorher scheint sehr gut zu sein! kannst du ihn mir bitte (oder jemand anderes) in eine alte pb version konvertieren? bittööö :cry:
das ist auch das letzte was ich zu diesem thema frage :praise:
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

dieser code funktioniert bei mir, aber wie wende ich ihn an?

Code: Alles auswählen

;
; Get HTML Text In WebGadget
;
; NOT COMPATIBLE WITH FREAK'S WebGadgetExtras.pb
;
Interface IHTMLDocument2_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)
  get_Script(a)
  get_all(a)
  get_body(a)
  get_activeElement(a)
  get_images(a)
  get_applets(a)
  get_links(a)
  get_forms(a)
  get_anchors(a)
  put_title(a)
  get_title(a)
  get_scripts(a)
  put_designMode(a)
  get_designMode(a)
  get_selection(a)
  get_readyState(a)
  get_frames(a)
  get_embeds(a)
  get_plugins(a)
  put_alinkColor(a)
  get_alinkColor(a)
  put_bgColor(a)
  get_bgColor(a)
  put_fgColor(a)
  get_fgColor(a)
  put_linkColor(a)
  get_linkColor(a)
  put_vlinkColor(a)
  get_vlinkColor(a)
  get_referrer(a)
  get_location(a)
  get_lastModified(a)
  put_URL(a)
  get_URL(a)
  put_domain(a)
  get_domain(a)
  put_cookie(a)
  get_cookie(a)
  put_expando(a)
  get_expando(a)
  put_charset(a)
  get_charset(a)
  put_defaultCharset(a)
  get_defaultCharset(a)
  get_mimeType(a)
  get_fileSize(a)
  get_fileCreatedDate(a)
  get_fileModifiedDate(a)
  get_fileUpdatedDate(a)
  get_security(a)
  get_protocol(a)
  get_nameProp(a)
  write(a)
  writeln(a)
  open(a,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4,e)
  close()
  clear()
  queryCommandSupported(a,b)
  queryCommandEnabled(a,b)
  queryCommandState(a,b)
  queryCommandIndeterm(a,b)
  queryCommandText(a,b)
  queryCommandValue(a,b)
  execCommand(a,b,c,d)
  execCommandShowHelp(a,b)
  createElement(a,b)
  put_onhelp(a1,a2,a3,a4)
  get_onhelp(a)
  put_onclick(a1,a2,a3,a4)
  get_onclick(a)
  put_ondblclick(a1,a2,a3,a4)
  get_ondblclick(a)
  put_onkeyup(a1,a2,a3,a4)
  get_onkeyup(a)
  put_onkeydown(a1,a2,a3,a4)
  get_onkeydown(a)
  put_onkeypress(a1,a2,a3,a4)
  get_onkeypress(a)
  put_onmouseup(a1,a2,a3,a4)
  get_onmouseup(a)
  put_onmousedown(a1,a2,a3,a4)
  get_onmousedown(a)
  put_onmousemove(a1,a2,a3,a4)
  get_onmousemove(a)
  put_onmouseout(a1,a2,a3,a4)
  get_onmouseout(a)
  put_onmouseover(a1,a2,a3,a4)
  get_onmouseover(a)
  put_onreadystatechange(a1,a2,a3,a4)
  get_onreadystatechange(a)
  put_onafterupdate(a1,a2,a3,a4)
  get_onafterupdate(a)
  put_onrowexit(a1,a2,a3,a4)
  get_onrowexit(a)
  put_onrowenter(a1,a2,a3,a4)
  get_onrowenter(a)
  put_ondragstart(a1,a2,a3,a4)
  get_ondragstart(a)
  put_onselectstart(a1,a2,a3,a4)
  get_onselectstart(a)
  elementFromPoint(a,b,c)
  get_parentWindow(a)
  get_styleSheets(a)
  put_onbeforeupdate(a1,a2,a3,a4)
  get_onbeforeupdate(a)
  put_onerrorupdate(a1,a2,a3,a4)
  get_onerrorupdate(a)
  toString(a)
  createStyleSheet(a,b,c)
EndInterface

Interface IHTMLElement_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)
  setAttribute(a,b,c)
  getAttribute(a,b,c)
  removeAttribute(a,b,c)
  put_className(a)
  get_className(a)
  put_id(a)
  get_id(a)
  get_tagName(a)
  get_parentElement(a)
  get_style(a)
  put_onhelp(a1,a2,a3,a4)
  get_onhelp(a)
  put_onclick(a1,a2,a3,a4)
  get_onclick(a)
  put_ondblclick(a1,a2,a3,a4)
  get_ondblclick(a)
  put_onkeydown(a1,a2,a3,a4)
  get_onkeydown(a)
  put_onkeyup(a1,a2,a3,a4)
  get_onkeyup(a)
  put_onkeypress(a1,a2,a3,a4)
  get_onkeypress(a)
  put_onmouseout(a1,a2,a3,a4)
  get_onmouseout(a)
  put_onmouseover(a1,a2,a3,a4)
  get_onmouseover(a)
  put_onmousemove(a1,a2,a3,a4)
  get_onmousemove(a)
  put_onmousedown(a1,a2,a3,a4)
  get_onmousedown(a)
  put_onmouseup(a1,a2,a3,a4)
  get_onmouseup(a)
  get_document(a)
  put_title(a)
  get_title(a)
  put_language(a)
  get_language(a)
  put_onselectstart(a1,a2,a3,a4)
  get_onselectstart(a)
  scrollIntoView(a)
  contains(a,b)
  get_sourceIndex(a)
  get_recordNumber(a)
  put_lang(a)
  get_lang(a)
  get_offsetLeft(a)
  get_offsetTop(a)
  get_offsetWidth(a)
  get_offsetHeight(a)
  get_offsetParent(a)
  put_innerHTML(a)
  get_innerHTML(a)
  put_innerText(a)
  get_innerText(a)
  put_outerHTML(a)
  get_outerHTML(a)
  put_outerText(a)
  get_outerText(a)
  insertAdjacentHTML(a,b)
  insertAdjacentText(a,b)
  get_parentTextEdit(a)
  get_isTextEdit(a)
  click()
  get_filters(a)
  put_ondragstart(a1,a2,a3,a4)
  get_ondragstart(a)
  toString(a)
  put_onbeforeupdate(a1,a2,a3,a4)
  get_onbeforeupdate(a)
  put_onafterupdate(a1,a2,a3,a4)
  get_onafterupdate(a)
  put_onerrorupdate(a1,a2,a3,a4)
  get_onerrorupdate(a)
  put_onrowexit(a1,a2,a3,a4)
  get_onrowexit(a)
  put_onrowenter(a1,a2,a3,a4)
  get_onrowenter(a)
  put_ondatasetchanged(a1,a2,a3,a4)
  get_ondatasetchanged(a)
  put_ondataavailable(a1,a2,a3,a4)
  get_ondataavailable(a)
  put_ondatasetcomplete(a1,a2,a3,a4)
  get_ondatasetcomplete(a)
  put_onfilterchange(a1,a2,a3,a4)
  get_onfilterchange(a)
  get_children(a)
  get_all(a)
EndInterface
;
Procedure.l GetBSTRLength(bstr)
  Length = WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, 0, 0, 0, 0)
  ProcedureReturn Length
EndProcedure
;
Procedure.l ReadBSTRMem(*Buffer, bstr, Length)
  Length = WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, *Buffer, Length, 0, 0)   
  ProcedureReturn Length
EndProcedure
;
Procedure WebGadget_GextHTMLText(WebGadget.l)
  Protected WebObject.IWebBrowser2, HTMLDoc.IHTMLDocument2_FIXED, DocDispatch.IDispatch, HTMLElement.IHTMLElement_FIXED
  WebObject = GetWindowLong_(GadgetID(WebGadget), #GWL_USERDATA)
 
  If WebObject\get_document(@DocDispatch) = #S_OK
    If DocDispatch\QueryInterface(?IID_IHTMLDocument2, @HTMLDoc) = #S_OK
      If HTMLDoc\get_body(@HTMLElement) = #S_OK
        If HTMLElement\get_innerHTML(@bstr_code) = #S_OK
         
          bstr_len = GetBSTRLength(bstr_code)
          If bstr_len
            *Buffer = AllocateMemory(bstr_len)
            If *Buffer
              If ReadBSTRMem(*Buffer, bstr_code, bstr_len) ; Get HTML code in *Buffer
                Debug PeekS(*Buffer) ; [warning string size limitation, better use memory functions !]
              EndIf
              FreeMemory(*Buffer)
            EndIf
          EndIf
         
          SysFreeString_(bstr_code)
        EndIf
      EndIf
      DocDispatch\Release()
    EndIf
  EndIf
  ProcedureReturn
 
EndProcedure

DataSection
IID_IHTMLDocument2: ; {332C4425-26CB-11D0-B483-00C04FD90119}
Data.l $332C4425
Data.w $26CB, $11D0
Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19       
EndDataSection
Antworten