AutoIt-Quellcode aus dem Forum heraus ausführen

  • Hallo liebe Community,

    nach langer Zeit möchte ich euch auch mal wieder etwas präsentieren:

    AutoIt from Browser

    Ich weiß, ist ein blöder Name. Damit ist es aber möglich, ein AutoIt-Skript, das im Forum in den AutoIt-Tags

    [autoit]

    ...

    [/autoit]

    gepostet wurde, direkt aus dem Browser heraus auszuführen - durch einen Klick auf dieses Symbol, das sich links über jeder "Codebox" befindet:
     [Blockierte Grafik: http://stayawayknight.square7.ch/5936223522012.jpg].
    Realisiert hab ich das über ein Greasemonkey-Skript.

    Dafür sind leider ein paar Dinge notwendig, die zunächst eingerichtet werden müssen:

    1. Greasemonkey installieren
    Zunächst muss das Addon "Greasemonkey" installiert werden, falls noch nicht getan. Dieses erlaubt, Javascript über die DOM-Schnittstelle einzuschleusen.
    Das gibt es meines Wissens nach leider nur für Firefox und Google Chrome.
    Für Firefox gibt es das hier: Greasemonkey für Firefox von mozilla.org
    Nach der Installation sollte rechts oben im Browser ein kleiner Affe grinsen (sofern GM aktiviert).
    Dieses Javascript weißt den Symbolen einen EventListener zu, der auf Klicks reagiert.

    2. Skript installieren
    Nun muss das Javascript installiert werden. Nach der Installation von Greasemonkey kann durch ein Klick auf den Pfeil neben dem Affen ein Skript hinzugefügt werden.
    Möglicherweise reicht aber auch schon ein Klick auf folgenden Link:
    Installation Skript
    Nach der Installation sollte eine Meldung kommen, dass das Skript erfolgreich installiert wurde.
    Wenn ihr nun autoit.de aufruft und die Liste neben dem Affen aufklickt, sollte es hinzugefügt und "angehakt" sein ;) .

    3. Dateianhang herunterladen
    Im Anhang befindet sich ein Zip-File, in dem die weiteren Utensilien enthalten sind. Außerdem findet sich dort nochmals das Javascript.
    Das File muss natürlich noch entpackt werden. Außerdem ist es sinnvoll, den Ordner an einen festen Platz zu verschieben (C:\Programme z.B.)
    Die Dateinamen sollten dabei möglichst nicht geändert werden. In die Ini-Datei (config.ini) muss der Pfad zur "au3fb.exe" angegeben werden.

    4. Registryeinträge hinzufügen lassen
    Nachdem das alles richtig verschoben und die Ini-Datei entsprechend angepasst wurde, kann nun das "registry.au3" - Skript ausgeführt werden.
    Die Einträge werden benötigt, um die AutoIt-Datei über den Browser aufrufen zu können. Sie können durch das beigelegte Skript "registry_delete.au3" wieder
    entfernt werden.

    5. Fertig & Testen
    Wenn das alles geklappt hat, sollte nun das Programm einsatzbereit sein.
    An folgendem Test-Code kann die Funktionalität getestet werden:

    [autoit]


    MsgBox(0, "Test", "Es funktioniert!")
    MsgBox(0, "", "Viel Spaß mit 'AutoIt from Browser'")

    [/autoit]

    Nach Klick auf das Symbol rechts oben sollte sich ein kleines Fenster öffnen, in dem ihr gefragt werdet, ob der Quellcode in Scite geöffnet oder direkt ausgeführt werden soll.
    Wenn das alles geklappt hat: Viel Spaß damit! Nun können die geposteten Programme direkt aus dem Browser getestet werden (funktioniert auch mit Code in Spoilern).

    [Blockierte Grafik: http://stayawayknight.square7.ch/0841233522012.jpg]


    Quellcode (auch im Anhang enthalten):

    au3fb.au3
    [autoit]


    #cs
    17.12.2012 22:26
    [email='stayawayknight@autoit.de'][/email]
    WARNUNG: In Programmen, in denen mit HTML-Tags gearbeitet wird, kann es zu Problemen kommen!
    #ce

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

    #include <Inet.au3>
    #include <Array.au3>
    #include <String.au3>
    #include <Misc.au3>
    #RequireAdmin

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

    _Singleton("AutoIt from Browser")

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

    If Not IsArray($CMDLINE) Then Exit
    If @Compiled Then
    If UBound($CMDLINE, 1) < 2 Then Exit
    EndIf
    Global $aSplit = StringSplit($CMDLINE[1], "|")
    If Not IsArray($aSplit) Then Exit

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

    Global $sFilePath = @ScriptDir & "\code.au3"

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

    OnAutoItExitRegister("_exit")
    Opt("GuiOnEventMode", 1)

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

    Global $hGui = GUICreate("AutoIt from Browser", 200, 75, Default, Default, 0x00080000)
    GUISetBkColor(0x0000FF, $hGui)
    GUICtrlSetDefColor(0xFFFFFF, $hGui)
    GUICtrlSetDefBkColor(0x2020FF, $hGui)
    GUICtrlCreateButton("Öffnen", 0, 0, 100, 50)
    GUICtrlSetOnEvent(-1, "_open")
    GUICtrlCreateButton("Ausführen", 100, 0, 100, 50)
    GUICtrlSetOnEvent(-1, "_run")
    GUISetOnEvent(-3, "_exit", $hGui)
    GUISetState(@SW_SHOW, $hGui)
    GUISetState(@SW_DISABLE, $hGui)

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

    TrayTip("Suche...", "Suche Code online... .", 5000)

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

    Global $iNumber = StringReplace($aSplit[1], "au3fb://", "") - 1
    Global $sSource = _INetGetSource($aSplit[2])
    $sBetween = _StringBetween($sSource, '<td class="codeLines container-4">', '</td>')

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

    Global $aResult[UBound($sBetween, 1) / 2]

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

    $iCounter = 0
    For $i = 1 To UBound($sBetween, 1) - 1 Step 2
    $aResult[$iCounter] = StringReplace($sBetween[$i], '<pre>', '')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], '</pre>', '')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], '</a>', '')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], '</span>', '')
    $aResult[$iCounter] = StringRegExpReplace($aResult[$iCounter], '<a style=(.+?)>', '')
    $aResult[$iCounter] = StringRegExpReplace($aResult[$iCounter], '<span style=(.+?)>', '')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], '&quot;', '"')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], '&amp;', '&')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], '&lt;', '<')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], '&gt;', '>')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], Chr(196), 'Ä')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], 'Ö', 'Ö')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], Chr(220), 'Ü')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], 'ä', 'ä')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], 'ö', 'ö')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], 'ü', 'ü')
    $aResult[$iCounter] = StringReplace($aResult[$iCounter], 'ß', 'ß')
    $aResult[$iCounter] = StringStripWS($aResult[$iCounter], 1)
    $iCounter += 1
    Next

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

    $hFile = FileOpen($sFilePath, 2)
    FileWrite($hFile, $aResult[$iNumber])
    FileClose($hFile)
    TrayTip("Gefunden", "Code online gefunden." @CRLF & "Skript aufrufbar/ausführbar.", 1000)
    GUISetState(@SW_ENABLE, $hGui)

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

    While Sleep(10)
    WEnd

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

    Func _open()
    ShellExecute($sFilePath)
    EndFunc ;==>_open

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

    Func _run()
    Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sFilePath & '"')
    EndFunc ;==>_run

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

    Func _exit()
    FileDelete($sFilePath)
    Exit
    EndFunc ;==>_exit

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


    Wichtiger Hinweis: Bei Programmen, in denen mit HTML-Tags gearbeitet wird, kann es zu Verfälschungen des Quellcodes kommen!


    Das Programm enthält vermutlich noch einige Bugs etc. Außerdem weiß ich noch nicht, wie ich feststellen kann, ob ein HTML-Tag im Skript in '...' bzw. "..." steht...
    Zum Beispiel wird &gt; immer durch ein '>' ersetzt, egal ob dies gewünscht ist oder nicht (wenn es im geposteten Quellode notwendig ist).


    Über Kritik, Bugmeldungen etc. bin ich sehr dankbar!

    Viele Grüße
    stay