Fehler in StringSplit (DynDNS updater)

  • Also, hai leuts,
    ich habe mal angefangen einen DynDNS Updater zu schreiben, womit ich dann ganz einfach einen ausweichserver einlinken kann... nun leider hackt es ein wenig beim auslesen der DNS namen, also der hosts... stringsplit will da irgendwie nicht mitmachen...
    ich habs unter windows xp noch nicht getestet aber win 7 sollte ja nicht zum problem werden...
    bitte schaut mal ob ihr etwas fehlerhaftes von mir findet, ist sicher ein doofer fehler...

    Spoiler anzeigen
    [autoit]

    #include "dnsupd_gui.au3"
    #include <IE.au3>
    #include <Inet.au3>
    #include <String.au3>
    Global $mpar = "go"
    _onEvent("start") ; This must be the first!!!
    savedata("start")
    GUIcontrol("start")
    account_login("start")
    server_set("serverlist")
    While True
    Sleep(300)
    loopcommand("loop")
    WEnd
    Func GUIcontrol($mpar, $par1="", $par2="")
    Switch $mpar
    Case "start"
    Global $gui
    Global $gui_l_loggedon, $gui_i_username, $gui_i_password, $gui_b_acconect
    Global $gui_i_aservadd, $gui_l_aservstate, $gui_b_aservload, $gui_b_aservact
    Global $gui_l_acclink, $gui_b_sendip, $gui_b_getaccstate
    Global $gui_l_myip, $gui_b_loadip, $gui_b_startservice
    GenerateGUI()
    GUICtrlSetData($gui_i_username, $sav_username)
    GUICtrlSetData($gui_i_password, $sav_password)
    GUICtrlSetData($gui_i_aservadd, $sav_aserv)
    server_set("getmyip")
    _onEvent("create", $gui, -3, "GUIcontrol", "disappear")
    _onEvent("create", $gui, $gui_b_acconect, "account_login", "userlogin")
    _onEvent("create", $gui, $gui_b_loadip, "server_set", "getmyip")
    Case "disappear"
    GUISetState(@SW_HIDE, $gui)
    EndSwitch
    EndFunc
    Func account_login($mpar, $par1="")
    Switch $mpar
    Case "start"
    Global $active = False
    _IELoadWaitTimeout(23000);23 sec.
    Global $oIE = _IECreate("https://www.dyndns.com/account/")
    account_login("login")
    Case "checklogin"
    _IENavigate($oIE, "https://www.dyndns.com/account/")
    $DOM = _IEDocReadHTML($oIE)
    If StringInStr($DOM, "Lost&nbsp;Password?") <> 0 Then
    Return False
    EndIf
    Return True
    Case "login"
    GUICtrlSetData($gui_l_loggedon, "Überprufen...")
    If not account_login("checklogin") Then
    GUICtrlSetData($gui_l_loggedon, "Einloggen...")
    _IENavigate($oIE, "https://www.dyndns.com/account/")
    $DOM = _IEDocReadHTML($oIE)
    $ar = StringSplit($DOM, "toplogin", 1)
    $ar2 = StringSplit($ar[2], "login", 1)
    $ar3 = StringSplit($ar2[2], "' ")
    $gObjNum = $ar3[1]
    _IEFormElementSetValue(_IEGetObjById($oIE, "login"&$gObjNum&"_username"), $sav_username)
    _IEFormElementSetValue(_IEGetObjById($oIE, "login"&$gObjNum&"_password"), $sav_password)
    _IEAction(_IEGetObjById($oIE, "login"&$gObjNum&"_submit"), "click")
    _IELoadWait($oIE)
    If StringInStr(_IEDocReadHTML($oIE), "Username or password did not match.") <> 0 Then
    GUICtrlSetData($gui_l_loggedon, "Fehler!")
    Return 0
    EndIf
    EndIf
    GUICtrlSetData($gui_l_loggedon, "Ja")
    Case "logout"
    ;Logout
    Case "userlogin"
    savedata("saveusr", GUICtrlRead($gui_i_username))
    savedata("savepwd", GUICtrlRead($gui_i_password))
    account_login("login")
    EndSwitch
    EndFunc
    Func server_set($mpar, $par1="")
    Switch $mpar
    Case "sendmyip"
    Case "sendaserv"
    Case "getlink"
    Case "serverlist"
    _IENavigate($oIE, "https://www.dyndns.com/account/services/hosts/")
    _IELoadWait($oIE, 100)
    $DOM = _IEDocReadHTML($oIE)
    $ar = StringSplit($DOM, "table", 1)
    $ar2 = StringSplit($ar[2], 'tr', 1)
    Dim $aRet[$ar2[0]]
    For $count = 3 To $ar2[0] Step 2
    $ar3 = StringSplit($ar2[$count], '"')
    $aRet[$count-1] = $ar3[4]
    Next
    $aRet[0] = $ar2[0]-1
    ;debug-s
    $string = ""
    For $count = 1 To $aRet[0]
    $string &= $aRet[$count]&"; "
    Next
    MsgBox(0, "debug check - server list", $string)
    ;debug-e
    Return $aRet
    Case "getmyip"
    $localIP = _GetIP()
    GUICtrlSetData($gui_l_myip, $localIP)
    Case "exit"
    If $active Then
    server_set("sendaserv")
    EndIf
    account_login("logout")
    Exit
    EndSwitch
    EndFunc
    Func loopcommand($mpar, $par1="")
    Switch $mpar
    Case "start"
    ;Nothing
    Case "loop"
    If $active Then
    server_set("loopgetip")
    EndIf
    Case "activate"
    If $active Then
    $active = False
    GUICtrlSetData($gui_b_startservice, "Dienst STARTen")
    Else
    $active = True
    GUICtrlSetData($gui_b_startservice, "Dienst STOPPen")
    EndIf
    EndSwitch
    EndFunc
    Func savedata($mpar, $par1="")
    Switch $mpar
    Case "start"
    Global $sav_username = IniRead("dnsupd.ini", "account", "username", "Unbekannt")
    Global $sav_password = _StringEncrypt(0, IniRead("dnsupd.ini", "account", "userid", "48F32E4F79617F3B3E2FE7CC30CDA50955DD"), "AHE36AGFDG36XGSDF756")
    Global $sav_aserv = IniRead("dnsupd.ini", "account", "sec_server", "dein.ausweichserver.com")
    Case "saveusr"
    IniWrite("dnsupd.ini", "account", "username", $par1)
    $sav_username = $par1
    Case "savepwd"
    IniWrite("dnsupd.ini", "account", "userid", _StringEncrypt(1, $par1, "AHE36AGFDG36XGSDF756"))
    $sav_password = $par1
    Case "saveserv"
    IniWrite("dnsupd.ini", "account", "sec_server", $par1)
    $sav_aserv = $par1
    EndSwitch
    EndFunc
    Func _onEvent($mpar="go", $par0="0x0", $par1="0x0", $par2="", $par3="", $par4="")
    Switch $mpar
    Case "go"
    For $count = 1 To $_onEvent_events[0][0]
    If Not $_onEvent_loopTimeout Then
    If $_onEvent_events[$count][0] = @GUI_CtrlId Or ($_onEvent_events[$count][4] = @GUI_WinHandle And $_onEvent_events[$count][0] = @GUI_CtrlId) Then
    Call($_onEvent_events[$count][1], $_onEvent_events[$count][2], $_onEvent_events[$count][3])
    Return 1
    EndIf
    Else
    $_onEvent_loopTimeout = False
    Return 0
    EndIf
    Next
    Case "create"
    $_onEvent_events[0][0] += 1
    ReDim $_onEvent_events[$_onEvent_events[0][0]+1][5]
    $_onEvent_events[$_onEvent_events[0][0]][4] = $par0 ;Fenster
    $_onEvent_events[$_onEvent_events[0][0]][0] = $par1 ;ControlId
    $_onEvent_events[$_onEvent_events[0][0]][1] = $par2 ;Funktion
    $_onEvent_events[$_onEvent_events[0][0]][2] = $par3 ;Par1
    $_onEvent_events[$_onEvent_events[0][0]][3] = $par4 ;Par2
    GUISwitch($par0)
    If $par1 > 0 Then
    GUICtrlSetOnEvent($par1, "_onEvent")
    Else
    GUISetOnEvent($par1, "_onEvent")
    EndIf
    If @error Then
    MsgBox(16, "fatal error", "onevent failed")
    EndIf
    Case "destruct"
    For $count = 1 To $_onEvent_events[0][0]
    If $_onEvent_events[$count][4] = $par0 And $_onEvent_events[$count][0] = $par1 Then
    $_onEvent_events[$count][4] = $_onEvent_events[$_onEvent_events[0][0]][4]
    $_onEvent_events[$count][0] = $_onEvent_events[$_onEvent_events[0][0]][0]
    $_onEvent_events[$count][1] = $_onEvent_events[$_onEvent_events[0][0]][1]
    $_onEvent_events[$count][2] = $_onEvent_events[$_onEvent_events[0][0]][2]
    $_onEvent_events[$count][3] = $_onEvent_events[$_onEvent_events[0][0]][3]
    ReDim $_onEvent_events[$_onEvent_events[0][0]][5]
    $_onEvent_events[0][0] -= 1
    $_onEvent_loopTimeout = True
    ExitLoop
    EndIf
    Next
    Case "start"
    Opt("GUIOnEventMode", 1)
    Opt("TrayOnEventMode", 1)
    Global $_onEvent_events[1][5]
    $_onEvent_events[0][0] = 0
    Global $_onEvent_loopTimeout = False
    EndSwitch
    EndFunc

    [/autoit]

    EDIT: im bereich der linie 86 hackt es...

    Dies ist ein Arzeneimittel.
    Bei Risiken und Haluzinationen fressen sie die Packungsbeilage und schlagen Sie ihren Arzt oder Apotheker.
    Jede Haftung wird abgelent.

    Vielen Dank für Ihre Kundentreue.
    mfg. TimBlo

    Aperture Science

    http://www.youtube.com/watch?v=Y6ljFaKRTrI

  • ich nehm nur das, was mir am nächsten kommt, ich hatte nie lust zu lernen was ne api is, oder wie man die verwendet... ausserdem arbeitet diese ja auch über http oder was?
    und ich glaub nich dass das was mit ie zu tun hat, dass es nicht funktioniert,
    # wenn doch, dann erklärs mir, dann find ich ne lösung oder schau mir die api an
    # wenn nich, dann schau dir bitte mal den stringsplit an, wenn der funktioniert, hab ich kein problem das programm fertig zu stellen.

    EDIT: hab nochmal ne alternativlösung gefunden, solange es funktioniert is an _IE nichts auszusetzen!

    Spoiler anzeigen
    [autoit]

    #include "dnsupd_gui.au3"
    #include <IE.au3>
    #include <Inet.au3>
    #include <String.au3>
    #include <Array.au3>
    Global $mpar = "go"
    _onEvent("start") ; This must be the first!!!
    savedata("start")
    GUIcontrol("start")
    account_login("start")
    server_set("serverlist")
    While True
    Sleep(300)
    loopcommand("loop")
    WEnd
    Func GUIcontrol($mpar, $par1="", $par2="")
    Switch $mpar
    Case "start"
    Global $gui
    Global $gui_l_loggedon, $gui_i_username, $gui_i_password, $gui_b_acconect
    Global $gui_i_aservadd, $gui_l_aservstate, $gui_b_aservload, $gui_b_aservact
    Global $gui_l_acclink, $gui_b_sendip, $gui_b_getaccstate
    Global $gui_l_myip, $gui_b_loadip, $gui_b_startservice
    GenerateGUI()
    GUICtrlSetData($gui_i_username, $sav_username)
    GUICtrlSetData($gui_i_password, $sav_password)
    GUICtrlSetData($gui_i_aservadd, $sav_aserv)
    server_set("getmyip")
    _onEvent("create", $gui, -3, "GUIcontrol", "disappear")
    _onEvent("create", $gui, $gui_b_acconect, "account_login", "userlogin")
    _onEvent("create", $gui, $gui_b_loadip, "server_set", "getmyip")
    Case "disappear"
    GUISetState(@SW_HIDE, $gui)
    EndSwitch
    EndFunc
    Func account_login($mpar, $par1="")
    Switch $mpar
    Case "start"
    Global $active = False
    _IELoadWaitTimeout(23000);23 sec.
    Global $oIE = _IECreate("https://www.dyndns.com/account/")
    account_login("login")
    Case "checklogin"
    _IENavigate($oIE, "https://www.dyndns.com/account/")
    $DOM = _IEDocReadHTML($oIE)
    If StringInStr($DOM, "Lost&nbsp;Password?") <> 0 Then
    Return False
    EndIf
    Return True
    Case "login"
    GUICtrlSetData($gui_l_loggedon, "Überprufen...")
    If not account_login("checklogin") Then
    GUICtrlSetData($gui_l_loggedon, "Einloggen...")
    _IENavigate($oIE, "https://www.dyndns.com/account/")
    $DOM = _IEDocReadHTML($oIE)
    $ar = StringSplit($DOM, "toplogin", 1)
    $ar2 = StringSplit($ar[2], "login", 1)
    $ar3 = StringSplit($ar2[2], "' ")
    $gObjNum = $ar3[1]
    _IEFormElementSetValue(_IEGetObjById($oIE, "login"&$gObjNum&"_username"), $sav_username)
    _IEFormElementSetValue(_IEGetObjById($oIE, "login"&$gObjNum&"_password"), $sav_password)
    _IEAction(_IEGetObjById($oIE, "login"&$gObjNum&"_submit"), "click")
    _IELoadWait($oIE)
    If StringInStr(_IEDocReadHTML($oIE), "Username or password did not match.") <> 0 Then
    GUICtrlSetData($gui_l_loggedon, "Fehler!")
    Return 0
    EndIf
    EndIf
    GUICtrlSetData($gui_l_loggedon, "Ja")
    Case "logout"
    ;Logout
    Case "userlogin"
    savedata("saveusr", GUICtrlRead($gui_i_username))
    savedata("savepwd", GUICtrlRead($gui_i_password))
    account_login("login")
    EndSwitch
    EndFunc
    Func server_set($mpar, $par1="")
    Switch $mpar
    Case "sendmyip"
    Case "sendaserv"
    Case "getlink"
    Case "serverlist"
    _IENavigate($oIE, "https://www.dyndns.com/account/services/hosts/")
    _IELoadWait($oIE, 100)
    $ar = _IETableWriteToArray(_IETableGetCollection($oIE, 0))
    $string = UBound($ar, 2)
    Dim $aRet[$string]
    For $count = 1 To $string-1
    $aRet[$count] = $ar[0][$count]
    Next
    $aRet[0] = $string-1
    Return $aRet
    Case "getmyip"
    $localIP = _GetIP()
    GUICtrlSetData($gui_l_myip, $localIP)
    Case "exit"
    If $active Then
    server_set("sendaserv")
    EndIf
    account_login("logout")
    Exit
    EndSwitch
    EndFunc
    Func loopcommand($mpar, $par1="")
    Switch $mpar
    Case "start"
    ;Nothing
    Case "loop"
    If $active Then
    server_set("loopgetip")
    EndIf
    Case "activate"
    If $active Then
    $active = False
    GUICtrlSetData($gui_b_startservice, "Dienst STARTen")
    Else
    $active = True
    GUICtrlSetData($gui_b_startservice, "Dienst STOPPen")
    EndIf
    EndSwitch
    EndFunc
    Func savedata($mpar, $par1="")
    Switch $mpar
    Case "start"
    Global $sav_username = IniRead("dnsupd.ini", "account", "username", "Unbekannt")
    Global $sav_password = _StringEncrypt(0, IniRead("dnsupd.ini", "account", "userid", "48F32E4F79617F3B3E2FE7CC30CDA50955DD"), "AHE36AGFDG36XGSDF756")
    Global $sav_aserv = IniRead("dnsupd.ini", "account", "sec_server", "dein.ausweichserver.com")
    Case "saveusr"
    IniWrite("dnsupd.ini", "account", "username", $par1)
    $sav_username = $par1
    Case "savepwd"
    IniWrite("dnsupd.ini", "account", "userid", _StringEncrypt(1, $par1, "AHE36AGFDG36XGSDF756"))
    $sav_password = $par1
    Case "saveserv"
    IniWrite("dnsupd.ini", "account", "sec_server", $par1)
    $sav_aserv = $par1
    EndSwitch
    EndFunc
    Func _onEvent($mpar="go", $par0="0x0", $par1="0x0", $par2="", $par3="", $par4="")
    Switch $mpar
    Case "go"
    For $count = 1 To $_onEvent_events[0][0]
    If Not $_onEvent_loopTimeout Then
    If $_onEvent_events[$count][0] = @GUI_CtrlId Or ($_onEvent_events[$count][4] = @GUI_WinHandle And $_onEvent_events[$count][0] = @GUI_CtrlId) Then
    Call($_onEvent_events[$count][1], $_onEvent_events[$count][2], $_onEvent_events[$count][3])
    Return 1
    EndIf
    Else
    $_onEvent_loopTimeout = False
    Return 0
    EndIf
    Next
    Case "create"
    $_onEvent_events[0][0] += 1
    ReDim $_onEvent_events[$_onEvent_events[0][0]+1][5]
    $_onEvent_events[$_onEvent_events[0][0]][4] = $par0 ;Fenster
    $_onEvent_events[$_onEvent_events[0][0]][0] = $par1 ;ControlId
    $_onEvent_events[$_onEvent_events[0][0]][1] = $par2 ;Funktion
    $_onEvent_events[$_onEvent_events[0][0]][2] = $par3 ;Par1
    $_onEvent_events[$_onEvent_events[0][0]][3] = $par4 ;Par2
    GUISwitch($par0)
    If $par1 > 0 Then
    GUICtrlSetOnEvent($par1, "_onEvent")
    Else
    GUISetOnEvent($par1, "_onEvent")
    EndIf
    If @error Then
    MsgBox(16, "fatal error", "onevent failed")
    EndIf
    Case "destruct"
    For $count = 1 To $_onEvent_events[0][0]
    If $_onEvent_events[$count][4] = $par0 And $_onEvent_events[$count][0] = $par1 Then
    $_onEvent_events[$count][4] = $_onEvent_events[$_onEvent_events[0][0]][4]
    $_onEvent_events[$count][0] = $_onEvent_events[$_onEvent_events[0][0]][0]
    $_onEvent_events[$count][1] = $_onEvent_events[$_onEvent_events[0][0]][1]
    $_onEvent_events[$count][2] = $_onEvent_events[$_onEvent_events[0][0]][2]
    $_onEvent_events[$count][3] = $_onEvent_events[$_onEvent_events[0][0]][3]
    ReDim $_onEvent_events[$_onEvent_events[0][0]][5]
    $_onEvent_events[0][0] -= 1
    $_onEvent_loopTimeout = True
    ExitLoop
    EndIf
    Next
    Case "start"
    Opt("GUIOnEventMode", 1)
    Opt("TrayOnEventMode", 1)
    Global $_onEvent_events[1][5]
    $_onEvent_events[0][0] = 0
    Global $_onEvent_loopTimeout = False
    EndSwitch
    EndFunc
    Func onAutoItExit()
    _IEQuit($oIE)
    EndFunc

    [/autoit]

    Dies ist ein Arzeneimittel.
    Bei Risiken und Haluzinationen fressen sie die Packungsbeilage und schlagen Sie ihren Arzt oder Apotheker.
    Jede Haftung wird abgelent.

    Vielen Dank für Ihre Kundentreue.
    mfg. TimBlo

    Aperture Science

    http://www.youtube.com/watch?v=Y6ljFaKRTrI

    Einmal editiert, zuletzt von TimBlo (25. Januar 2010 um 21:13)