• Hallo,

    ich weiß nicht ob es jemandem schon aufgefallen ist oder ob Stilgar dieser Bug bekannt ist. Das Übergeben von Umlauten (z.B. ä,ß,Ö...) innerhalb der URL funktioniert nicht:

    [autoit]

    _FFOpenURL($i_ffsocket, "http://www.cinefacts.de/suche/suche.php?type=&name=Bärenbrüder", -1, False)

    [/autoit]

    Kennt jemand einen Workaround?

  • lol, das ist wirlich uncool. Nichts desto Trotz bringt es

    [autoit]

    _INetExplorerCapable()

    [/autoit]

    natürlich mal voll. Solltes vielleicht standardmäßig für alle Adressen gemacht werden im nächsten Release der FF.au3, falls es einen gibt.

    [gelöst]

  • Hallo,

    wie ich sehe wird gerade fleißig an der FF.au3 gewerkelt. Ich bin gestern in einem Skript, dass ich benutze auf die neue Version umgestiegen und mir sind ein paar Dinge aufgefallen:
    1. DIe Änderungen an den UDFs halte ich durchweg für sinnvoll, aber
    2. Umlaute sollten wirklich standardmäßig akzeptiert werden.
    3. Mehr oder weniger alle UDFs sollten die Angabe des Tabs erlauben, auf den die Funktion angewandt werden soll und damit zu:
    4. UDF zum Auslesen der aktuelle URL implementieren:

    Spoiler anzeigen
    [autoit]

    Func _FFTabGetLocationURL(ByRef $iFFSocket, Const $iTIMEOUT = 10000, Const $vTAB = 0, Const $sMODE = "index")
    _FFTabSetSelected($iFFSocket, $vTAB, $sMODE)
    If @error Then Return SetError(1, 0, "")
    Local Const $sLOCATION = _FFSetGet($iFFSocket, ".location.href", $iTIMEOUT)
    If @error Then Return SetError(2, 0, "")
    Return $sLOCATION
    EndFunc ;==>_FFTabGetLocationURL

    [/autoit]


    Hier sieht man nochmal, was ich mit Angabe des Tabs meine. Ein weiteres Beispiel wäre:

    Spoiler anzeigen
    [autoit]

    Func _FFTabReadHTML(ByRef $iFFSocket, Const $vTAB = 0, Const $sMODE = "index", Const $iFILTER = 0)
    _FFTabSetSelected($iFFSocket, $vTAB, $sMODE)
    If @error Then Return SetError(1, 0, "")
    Local Const $sHTML = _FFReadHTML($iFFSocket, $iFILTER)
    If @error Then Return SetError(2, 0, "")
    Return $sHTML
    EndFunc ;==>_FFTabReadHTML

    [/autoit]


    Am kritischsten sehe ich aber wirklich die Umlaute! Ansonsten super Bibliothek! Weiter so!

  • Erstmal danke für das Lob! :)

    Die Tab-Parameter habe ich absichtlich wieder entfernt, oder wendest du jeden Befehl auf ein anderem Tab an? Also im Normalfall?
    Man kann doch jederzeit selbst zu einem anderen wechseln, also sorry die baue ich nicht wieder rein. Das werden sonst einfach zu viel Parameter bei den Funktionen und zu viele spezielle Funktionen. Aber du kannst gerne eine Erweiterung für die UDF erstellen :), so wie die _FF_FireFM.au3 oder so.
    Ich überlege mir gerade eh schon bei jeder Funktionen ob diese wirklich notwendig ist, sind eh schon einige Einzeiler drinn, die eine andere Funktion nur wieder mit anderen Parametern aufurfen.

    Das mit den Umlauten ist noch nicht vergessen, am einfachsten wäre einfach die _INetExplorerCapable zu verwenden, aber dafür ne UDF einbinden? Ich werde wohl was ähnliches nachbauen.

    Um die URL eines anderen als des aktiven Tabs auszulesen reicht:

    [autoit]

    _FFSetGet($Socket,"getBrowser().getBrowserAtIndex(0).currentURI.spec")

    [/autoit]

    Titel:

    [autoit]

    _FFSetGet($Socket,"getBrowser().getBrowserAtIndex(0).contentTitle")

    [/autoit]

    HTML-Quelle:

    [autoit]

    _FFSetGet($Socket,"getBrowser().getBrowserAtIndex(0).contentDocument.body.innerHTML")

    [/autoit]

    usw.:
    tabbrowser - MDC

    Vielleicht baue ich zumindest bei diesen Read-Funktionen wieder was dazu. :)

    Grüße
    Stilgar

  • Hallo Stilgar,

    stimmt. Das es nicht unbedingt Standard ist einen Befehl auf einen Tab anzuwenden und dann zu wechseln sehe ich ein. (ist nur in meinem Skript so, daher bei mir höherer Schreibaufwand.)
    Die Inet.au3 würde ich auch auf keinen Fall inkludieren. Ich hätte da auch eher an eine kleine Helper-Funktion extra für den Firefox gedacht.
    Der _FFGetSet würde ich jedoch zusätzliche Methoden wie deiner spendieren und diese dann in eine FFGet.au3 und FFSet.au3 auslagern (die der Benutzer dann inkludieren kann. Ich habe mich noch nicht mit den FF-Properties beschäftigt, aber damit könnte man die Gängisten (wenn nicht alle sogar alle sinnvollen) Properties in Get & Set Funktionen verpacken und somit Syntax-Fehler ausschließen. Die Frage ist, wie generisch man das hinbekommt. Die Set-UDFs wären dann Synonym dazu zu sehen.

  • Hallo teh_hahn,

    Man könnte ja so Zusatz UDFs machen, wie in AutoIT ja anscheinend üblich. Die Standard Funktionen übernimmt die FF.au3 und den Rest etwas _FFTab.au3, _FFBrowser.au3 oder sonstirgendwie. Das "Problem" man kann über die Schnittstelle wirklich alles im Browser ansprechen, was eingebaut ist, also alles was du dort siehst:
    https://developer.mozilla.org/En
    nicht nur die HTMl-Webseite, sondern die komplette XUL-Oberfläche, XML-Dateien auswerten, AddOns ...
    Den Möglichkeiten sind fast keine Grenzen gesetzt.

    Du brauchst nur mal die Funktion

    $a = _FFGetObject($Socket)
    _ArrayDisplay($a)

    aufrufen, dann siehst du schon mal einen Teil der Möglichkeiten - und das sind nur die Eigenschaften, Methoden und Objekte im Objekt "window", von den anderen Schnittstellen, die man dort nicht sieht, ganz zu schweigen :D

    Kannst ja ein neues Thema mit "Wunschfunktionen" aufmachen :)

    Grüße
    Stilgar

  • Ja, ich sehe schon das sich das nicht wirklich abdecken lässt. Eine Frage noch: Wie kann ich das HTML des gesamten Documents eines Tabs auslesen?

    [autoit]

    Func _FFGetInnerHTML(ByRef $iFFSocket, Const $vTAB = 0, Const $iTIMEOUT = 10000)
    Local Const $sURI = _FFSetGet($iFFSocket, "getBrowser().getBrowserAtIndex(" & $vTAB & ").contentDocument.html.innerHTML", $iTIMEOUT)
    If @error Then Return SetError(@error, 0, "")
    Return $sURI
    EndFunc ;==>_FFGetHTML

    [/autoit]


    funktioniert nicht. Ich will quasi den gleichen Text zurückbekommen, wie mit _FFReadHTML, bloß das ich nicht die Tabs wechseln möchte.

  • So gehts:

    "getBrowser().getBrowserAtIndex(0).contentDocument.documentElement.innerHTML"

    document, hat nun leider keine Eigenschaft um alles abzufragen, deswegen: documentElement
    https://developer.mozilla.org/en/DOM/document.documentElement

    So macht es _FFReadHTML aber auch :D :
    _FFSetGet($Socket, "try{content.document.documentElement.innerHTML;}catch(e){'_FFReadText_HTML'};", 10000)

    ich würde es allerdings ganz anderst machen:
    URL abfragen und per _InetGetSource holen - ist vieeeel schneller.


  • ich würde es allerdings ganz anderst machen:
    URL abfragen und per _InetGetSource holen - ist vieeeel schneller.


    Da ist dann aber kein von JS generierter Code drin... und wenn Cookies benötigt werden, geht es auch nicht.

    //Edit: POST #2000

    Einmal editiert, zuletzt von progandy (21. Februar 2009 um 15:34)

  • Ob ein Script drin ist bekommt man so raus:

    _FFGetValueByXPath($Socket,"//script","count")

    Wer geht schon auf Seiten die Cookies brauchen ? :D - muß man eben auf den Bedarf ausrichten, Seiten über MozRepl zu holen dauert schon seeehr lange.

  • Ich weiss, Thread ist alt und so, aber wenn ich per Google schon mal was dazu finde >p...

    Iwie scheint _INetExplorerCapable() keine allround-loesung zu sein... Wollte die z.B. auch nutzen, um Pakete fuer WinHTTP umzuwandeln... URIEncode ist da auch nicht optimal(macht Faxen bei Zahlen)...

    Bei Capable aendert er halt nicht alle Zeichen, scheinbar UND wandelt Leerstellen nicht in "+" UM...

    Gibts da ne gute Loesung fuer? Sonst muss ich mir selbst mal was zusammen hacken aber nyo...

    Und Frage dazu -> Muesste die Funktion nicht eig. in allen 3 Anwendungsfaellen richtig arbeiten?! Beim Mailen, fuer den Browser und bei WinHTTP?! Sind doch alles "Pakete"...

    LG

    *edit*
    Hab noch was gefunden, wo die Funktion wieder nicht gereicht hat -> [ offen ] bit.ly
    Sind aber ueberall auch nicht Leerstellen mit bedacht, weil zB in Foren, wen Threadtitel Leerstellen haben, muessen die ja mit + getrennt werden. Waer ja einfach zu ergaenzen, aber ist das dann auch ALLES >p?

  • Hey...^^

    Also, habe das Script auch in all meinen Scripten gehabt... Lief bei mir auch bisher immer fein...
    Allerdings habe ich von jemandem, der n Script von mir ausprobiert hat, die Meldung bekommen, dass es nicht klappt...

    Das lag daran, dass sein Name Zahlen enthielt und diese auch umgewandelt wurden. Was aber in den Paketen nicht der Fall ist...

    Ich habe es selbst auch noch mal probiert und Tatsache, ging nichts... Nutze das halt in Zusammenarbeit mit WinHttp (kennste dich ja gut mit aus >p)...


    Bei der Nutzung von Zahlen kam es immer zu Problemen...
    Dann habe ich mal rumgesucht und die INetExploreCapable() gefunden und dachte, dass das ja perfekt ist, da ich dafuer keinen "Fremd-Include" brauche...
    Da ist aber das Problem mit Leerstellen und wie ich jetzte via Google gefunden habe, auch mit einigen Sonderzeichen noch...


    LG

  • Dann gib doch mal eine Beispiel-URL, die nicht funktioniert.
    Äh, klar. Ich hab in der FUnktion einen Fehler gefunden: Ich hatte 48-57 statt 48 To 25 :( Die korrigierte Fassung:

    "_URIEncode / _URIDecode"
    [autoit]

    Func _URIEncode($sData)
    ; Author: Prog@ndy
    Local $aData = StringSplit(BinaryToString(StringToBinary($sData,4),1),"")
    Local $nChar
    $sData=""
    For $i = 1 To $aData[0]
    ;ConsoleWrite($aData[$i] & @CRLF)
    $nChar = Asc($aData[$i])
    Switch $nChar
    Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
    $sData &= $aData[$i]
    Case 32
    $sData &= "+"
    Case Else
    $sData &= "%" & Hex($nChar,2)
    EndSwitch
    Next
    Return $sData
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _URIDecode($sData)
    ; Author: Prog@ndy
    Local $aData = StringSplit(StringReplace($sData,"+"," ",0,1),"%")
    $sData = ""
    For $i = 2 To $aData[0]
    $aData[1] &= Chr(Dec(StringLeft($aData[$i],2))) & StringTrimLeft($aData[$i],2)
    Next
    Return BinaryToString(StringToBinary($aData[1],1),4)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;~ MsgBox(0, '', _URIDecode(_URIEncode("testäöü fv")))

    [/autoit]

    Einmal editiert, zuletzt von progandy (23. März 2010 um 14:06)

  • Problem ist, dass ich dienstlich in Holland bin >D Bin grade nur an nem NATO-Rechner und daher habe ich hier keine privaten Daten drauf >p... Und in meiner Unterkunft gibts kein Internet...
    Es ging aber um einen einfachen Login, bei dem zB der Username, kA... "Acanis 666" ist...
    Und dann wird da als Paket ja draus username=Acanis+666 zB...
    Dein Code verwandelt das aber auch wieder in Hex und amcht dann aus dem 666 %(kA jetzt, wie der Hex dafuer ist)...

    Beispiel explizieren kann sicher auch dsgamer, ich leider erst am WE...

    Aber denke, dass du verstehst, was ich sagen will?! Hoffe ich xD


    LG


    *edit* asoooo xD Brauch ich doch nichts selbst zu machen >D? *hehe* Das ist wunderbar, teste ich dann bei Zeiten, danke >D... Muss ich am WE ja wieder alle Scripte und so zurueckaendern, wenns geht >p *grml* :p Thx...^^
    Uri-Decode braucht man doch eig. nicht? Wofuer?^^ Ich meine, das Ergebnis ist ja eig. immer ne HMTL? Da ist es ja eh nicht mehr dekodiert...

    Einmal editiert, zuletzt von Acanis (23. März 2010 um 14:06)