Verschachtelte Frameset auslesen

  • Hi!

    Ich bin neu in der AutoIt Programmierung, aber bsiher klappt es ganz gut. Bisher...
    Folgendes Problem: Ich möchte gerne von einer Website eine URL auslesen, um einen täglichen Download zu automatisieren. Soweit so gut, Login klappt, Weiterleitung auf die entsprechende Seite, nur das Auslesen des Downloadlinks nicht. Problem dabei ist das Frameset.
    Die Seite ist dermassen verschachtelt, dass ich ehrlich gesagt nicht mehr ganz durchblicke. Ich habe mal einen Screenshot aus Firebug angehängt, um das zu verdeutlichen. Die PDFWizardservlet URL ist die die ich brauche, da diese sich täglich ändert.

    Vielleicht hat ja jemand eine Idee.
    Vielen Dank schonmal!

  • haste ma den ganzen quellcode der page als.txt?

    das würds einfacher machen, sich das genauer an zuschauen,per picture is dasn bisschen doof.
    müsstest den source auslesen in arrays speichern.

    aber ohne ganzen quellcode wird das mit den arrays schwierig.

  • Ich vermute jetzt einfach mal, dass der erste Teil des Download-Links immer gleich bleibt und nur die Release-Nummer die Variable ist ;)

    Dann müsste es in etwa so gehen:

    Spoiler anzeigen
    [autoit]

    #include <Inet.au3>
    $page = 'wasauchimmer.de/download/index.html'

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

    $source = _INetGetSource( $page )
    $release = StringRegExp( $source, 'pdfwizardservlet\?release=(.*?)">', 3 )
    If @error Then
    MsgBox( 0, '', 'Nix gefunden' )
    Else
    MsgBox( 0, '', 'Release: ' & $release[0] & @CRLF & 'Download: wasauchimmer.de/servlet/pdfwizardservlet?release=' & $release[0] )
    EndIf

    [/autoit]

    Nicht hauen, hab ja die Seite nicht zum testen... ;)

    Edit: Zorro.
    "Login klappt" - da hätte mir das ja schon auffallen müssen.. naja, wenn du dich mit dem IE automatisiert einloggst kannst du
    dir den Source via _IEBodyReadHtml holen =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • SEuBo:
    IE, sorry. Ist bei uns Standard.

    Ich schau mal dass ich den Quelltext mal anhänge später noch. Bzw. werde den Source von limette mal testen. Melde mich dann nochmal obs geklappt hat.

  • Ok neuer Stand:
    Problem ist dass die Seite wohl hauptsächlich aus JavaScript besteht und über die ursprüngliche URL (digiPaper/servlet/authentificatewithjaasservlet) bekomme ich keinen Quelltext im Script...
    Habe versucht das ganze über LiveHeader die Infos zu bekommen, aber auch das funktioniert nicht.

    Problem ist auch das kopieren des Source. Das wurde wohl alles auf verschiedene Seiten aufgeteilt. Hauptseite sieht so aus:

    Spoiler anzeigen

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <META http-equiv="expires" content="Sat, 01 Jan 2005 00:00:00 GMT">
    <META http-equiv="cache-control" content="no-cache">
    <META http-equiv="pragma" content="no-cache">


    <LINK REL="stylesheet" TYPE="text/css" HREF="../include/meta.include.css">
    <TITLE>DIE RHEINPFALZ - Web:digiPaper</TITLE>
    </HEAD>
    <frameset cols="138, *" frameborder="0" framespacing="0" border="0">

    <frameset rows="0, *, 24" frameborder="0" framespacing="0" border="0" SCROLLING=NO MARGINWIDTH=0 MARGINHEIGHT=0 NORESIZE>
    <frame src="../html/msh/ci_deco_001.html" scrolling="no" marginwidth="0" marginheight="0" name="ci_deco_001">
    <frame src="../html/msh/ci_deco_002.html" scrolling="no" marginwidth="0" marginheight="0" name="ci_deco_002">
    <frame src="../html/msh/ci_deco_003.html" scrolling="no" marginwidth="0" marginheight="0" name="ci_deco_003">
    </frameset>

    <frameset rows="0, *, 24" frameborder="0" framespacing="0" border="0">
    <frame src="../html/msh/ci_deco_004.html" scrolling="no" marginwidth="0" marginheight="0" name="ci_deco_004">
    <FRAMESET COLS="*, 215" FRAMESPACING=0 frameborder="0" BORDER=0>
    <FRAMESET ROWS="60, 24, *" FRAMESPACING=0 frameborder="0" BORDER=0>
    <FRAME SRC="../html/search.html?a" NAME="dP_search" SCROLLING=NO MARGINWIDTH=0 MARGINHEIGHT=0 NORESIZE>
    <FRAME SRC="../html/links.html?a" NAME="dP_links" SCROLLING=NO MARGINWIDTH=0 MARGINHEIGHT=0 NORESIZE>
    <FRAME SRC="../servlet/authentificatewithjaasservlet?showonlyauthinfo=true" NAME="dP_middle" MARGINWIDTH=6 MARGINHEIGHT=3 NORESIZE>
    </FRAMESET>
    <FRAMESET ROWS="84, *" FRAMESPACING=0 frameborder="0" BORDER=0>
    <FRAME SRC="../html/info.html" NAME="dP_info" SCROLLING=NO MARGINWIDTH=0 MARGINHEIGHT=0 NORESIZE>
    <FRAME SRC="../html/navi.html" NAME="dP_navi" MARGINWIDTH=0 MARGINHEIGHT=0 NORESIZE>
    </FRAMESET>
    </FRAMESET>
    <frame src="../html/msh/ci_deco_005.html" scrolling="no" marginwidth="0" marginheight="0" name="ci_deco_005" noresize>
    </frameset>

    <noframes>
    DIE RHEINPFALZ Web:digiPaper verwendet Frames!
    </noframes>

    </frameset>
    </HTML>

  • Irgendwie bin ich jetzt verwirrt -
    Du hast doch 'nen Screen vom Quelltext sogar gepostet ?
    Und an den kommst du nicht dran .. ?

    Wenn ich das jetzt richtig verstanden habe vermutest du das Problem also darin, dass der Inhalt der Seite über JavaScript nachgeladen wird - also Ajax-Style oder wie ? :P

    Hm. Du könntest vielleicht versuchen, den Link über _IELinkGetCollection zu finden:

    [autoit]

    $oIE = _IECreate( 'site.com' )
    $links = _IELinkGetCollection( $oIE )
    For $link in $links
    If StringInStr( $link.href, 'pdfwizardservlet?release' ) Then
    MsgBox( 0, 'Gefunden:', $link.href )
    ExitLoop
    EndIf
    Next

    [/autoit]

    Ungetestet da in "Schnellantwort" geschrieben ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Ja der Screen vom Quelltext ist aus FireBug, aber da kann ich den leider ja nicht abspeichern (sonst hätte ich kein Bild gemacht ;)). Ich versuch das mal.

  • For $link in $links
    For $link in $links^ERROR
    Error: Variable must be of type "Object"

  • Teste bei _IELinkGetCollection mal auf @error.

    Spoiler anzeigen

    Erfolg: Gibt ein Auflistungsobjekt aller (oder des ausgewählten) Links des Dokuments zurück, EXTENDED = Linkanzahl
    Fehler: Gibt 0 zurück und setzt @ERROR
    @Error: 0 ($_IEStatus_Success) = Kein Fehler
    3 ($_IEStatus_InvalidDataType) = Ungültiger Datentyp
    5 ($_IEStatus_InvalidValue) = Ungültiger Wert
    7 ($_IEStatus_NoMatch) = Keine Übereinstimmung gefunden
    @Extended: Nummer des ungültigen Parameters

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Gibt 3 zurück (Ungültiger Datentyp). Vermute mal der kann auf die Website nicht prüfen oder?

  • Kannst du mal Ausschnitte aus deinem Script posten ?
    Also genau, wie du das mit den Links getestet hast .. ?
    Inkl. Erstellen des IE-Objekts etc. ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Spoiler anzeigen

    #include <IE.au3>
    #include <Inet.au3>
    Run("iexplore.exe")
    sleep(2000)
    ;Erstellt eine Instanz (neues Fenster) des InternetExplorers und gibt ein entsprechendes Objekt zurück.
    $oIE = _IECreate ("http://digipaper.rheinpfalz.de/digiPaper/servlet/authentificateformservlet")
    ;Prüfen ob ein Objekt erzeugt wurde
    If IsObj($oIE) Then
    ;warten bis die Seite komplett geladen wurde
    _IELoadWait($oIE)
    ;Erzeugen eines HTML-Formular-Objekts mit Hilfe des Formularnamens
    $oForm = _IEFormGetObjByName($oIE, "UserLogin")
    ;Erzeugen eines Formularfeld-Objekts mit Hilfe des Feldnames
    $oUsername = _IEFormElementGetObjByName($oForm, "user")
    ;Setzen des Formularfeldinhalts
    _IEFormElementSetValue($oUsername, "xxx")
    ;Erzeugen eines Formularfeld-Objekts mit Hilfe des Feldnames
    $oPasswd = _IEFormElementGetObjByName($oForm, "password")
    ;Setzen des Formularfeldinhalts
    _IEFormElementSetValue($oPasswd, "yyyy")
    ;Absenden des Formulars
    $oSubmit = _IEGetObjByName ($oIE, "submit")
    _IEAction ($oSubmit, "click")
    ;_IEFormSubmit($oForm)
    Sleep(2000)
    ;Download-Assistent wählen
    $oIE = 'http://digipaper.rheinpfalz.de/digiPaper/servlet/authentificatewithjaasservlet'
    $links = _IELinkGetCollection( $oIE )
    if @error then MsgBox(0,'',@error)
    $link = ""
    For $link in $links
    If StringInStr( $link.href, 'pdfwizardservlet?release' ) Then
    MsgBox( 0, 'Gefunden:', $link.href )
    ExitLoop
    EndIf
    Next

    Bisher soweit, der Anfang klappt alles ^^

  • Da ist der Fehler !

    $oIE = 'http://digipaper.rheinpfalz.de/digiPaper/servlet/authentificatewithjaasservlet'
    $links = _IELinkGetCollection( $oIE )

    verkehrt ! :D

    Die erste von den beiden Zeilen einfach weglassen, du hast doch vorher schon $oIE als IE-Objekt definiert, mit _IECreate ! ;)
    _IELinkGetCollection benötigt keinen Adressstring sondern ein Internetexplorer-Objekt. Das, welches von _IECreate erstellt wurde :D

    Zusatzfrage: Wozu der "Run("iexplore.exe")" am Anfang ? oO

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Gute Frage mit dem run, das hab ich so aus dem Beispielscript mitgenommen ^^
    Aber ich müsste doch das $oIE Objekt dann anders setzen, also zumindest die aktuelle URL auslesen (da diese sich ja unterscheiden), oder beinhaltet das Objekt immer die aktuelle Adresse?

    Edit: Kommt gar nix zurück bei der Linkliste :(

  • Objekt bleibt Objekt. Und wenn du mit dem IE-Objekt auf eine neue Seite gehst verändern sich auch seine Attribute.. ;)

    Also Text, Quelltext und so.

    Einfach das IE-Objekt beibehalten. ^^

    Edit:

    Zitat

    Edit: Kommt gar nix zurück bei der Linkliste :(


    Keine Ausgabe von meinem Code oder generell ?
    Falls nur ersteres lass dir doch mal @extended und alle $link.href anzeigen..

    Und teste das nochmal mit einer anderen Website, wie google.de, nur um zu sehen, ob es am Script liegt oder an der Site.. ^^

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    Einmal editiert, zuletzt von limette (23. Juni 2010 um 15:35)

  • Wäre das ganze per simulierte Mausklicks auch ein Lösungsanatz? auch wenn es unschön ist...

  • limette
    Es liegt nicht am Script, das funktioniert wunderbar. Ich denke mal es liegt daran dass die einzelnen Frames per JavaScript nachgeladen werden. Ich habe jetzt den Link für den oberen Frame endlich rausbekommen, so dass ich den einzeln nachladen kann (und hoffe drauf dass das ein statischer Link ist 8o ). Somit bin ich auch schon ein ganzes Stück weiter.
    Problematisch wird nur den Download abzufangen, da dieser wohl auf jeden Fall über das Downloadfenster gehen muss, da auch hier ein Servlet hinterlegt ist.... aber auch das krieg ich noch hin :thumbup:

    Edit: Also soweit habe ich das jetzt hinbekommen; auch mit dem Download, das klappt ja relativ einfach. Eins bleibt jetzt noch offen: Gibt es eine Möglichkeit, das Downloadfenster und alles bei Beendigung des Downloads zu schliessen? Wie prüfe ich, ob der Download abgeschlossen ist?

    Einmal editiert, zuletzt von Ph0enix (24. Juni 2010 um 11:04)

  • Wie prüfe ich, ob der Download abgeschlossen ist?


    Falls du dich mit COM Programmierung auskennst:
    http://msdn.microsoft.com/en-us/library/…v=VS.85%29.aspx

    Ich tu es nämlich nicht :D
    Trotzdem kann ich auf der MSDN sehen, dass man dieses Event wohl abfangen kann,

    [autoit]

    ObjEvent()

    [/autoit]


    wäre hier wohl die passende AutoIt Funktion, denke ich.

  • Nein, COM Programmierung ist nicht so mein Spezialgebiet... aber das andere schau ich mir mal an, vielen Dank :)