Schneller Fix von altem Programm

  • Hallo zusammen,
    ich bin über Google auf ein Programm gestossen das genau macht was ich suche, dort gibt es auch den offenen Quellcode zum Download
    http://www.krupik.com/2010/09/18/shu…ten-ubernehmen/

    Allerdings ist das Tool von 2010 und die Struktur der Internetseite die ausgelesen wird hat sich geändert. Die auszulesenden Daten (in diesem Biepsiel "art" und "kunst" sind jetzt nicht mehr so aufgebaut:


    <span id="keywords-listing">

    <a class="middlelink" href="/s/art/search.html" x_shutterstock_keyword="art">art</a>
    <a class="middlelink" href="s/art/search.html" x_shutterstock_keyword="kunst">kunst</a>

    sonder so:

    <div id="image_keyword_container" class="section_content secondary_links">

    <a id="kw_1" href="/de/s/art/search.html">art</a>
    <a id="kw_2" href="/de/s/kunst/search.html">kunst</a>

    Da die Sprache der Website durch Cookies festgelegt wird (bei gleichbleibendem Link) und die Geschwindigkeit von IE zu wünschen übrig lässt wäre es super wenn es evtl. möglich wäre das auslesen über den Firefox statt den IE laufen zu lassen.

    Kann mir jemand weiterhelfen?

    Als Vergütung würde ich mal 50€ vorschlagen
    (da es sich meiner Meinung nach "nur" um einem schnellen Fix handelt für jemand der sich mit dem AutoIt-Syntax auskennt)

    Falls ich mit meiner Schätzung des Aufwands vollkommen daneben liege würde ich mich über eine PN mit realistischeren Preisvorstellungen freuen. Vielen Dank!

  • Ich hab das ganze mal so gelöst. Bei dem verwendeten Beispielbild funktioniert es. Du solltest es einmal testen, ob es auch wirklich so funktioniert, wie du es willst.
    Was die Verwendung des IE angeht: Ich hab ihn dennoch verwendet. Das Problem war im Script. Der IE wurde für jedes Bild neu geöffnet, statt einmal zu öffnen und dann nurnoch zu navigieren (neue Seite aufrufen). Das neustarten des IEs dauert relativ lange ;)

    Spoiler anzeigen
    [autoit]

    #include "IE.au3"
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <String.au3>

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

    Opt('MustDeclareVars', 0)

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

    Global $folderitem, $okbutton, $cancelbutton, $test, $msg, $empty, $status, $statuscheck
    Global $sFilename2 = ''
    Global $sFilename = @UserProfileDir
    Global $sFilename2 = "Pfad Exiftool.exe"
    Global $sCurFilename, $hFile, $folder, $Filelist, $Filelist2, $progressbar, $i, $rows, $exiftool, $hFile2, $sCurFilename2, $sTmpFile, $statusbutton, $progressbar2
    Global $file, $oIE, $oLinks, $keywords, $oLinks2, $bildNAME, $oLinks3, $bildID, $batch, $FertigeBilder, $stopvar, $FertigeBilder2, $rows2, $shutter_num, $shutter_num2, $batch2, $keywords2, $bildNAME2

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

    _Main()

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

    Func _Main()

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

    GuiCreate("Shutterstock EXIF Übernahme", 400, 290)
    GUICtrlCreateLabel("Shutterstock Metadaten übernahme für .jpg und .eps Bilder.", 10, 15, 380, 15)
    GUICtrlCreateLabel("Geben Sie bitte nun den Ordner zu Ihren Shutterstock Bildern an.", 10, 45, 380, 12)
    GUICtrlCreateLabel('(Bilder müssen im Format "shutterstock_XXX.jpg/.eps" beschriftet sein.)', 10, 60, 380, 15)
    $hFile = GUICtrlCreateInput($sFilename, 10, 85, 250, 20, -1, $WS_EX_STATICEDGE)
    $folderitem = GUICtrlCreateButton("Bilder Ordner...", 270, 85, 120, 20)
    ;$statusbutton = GuiCtrlCreateCheckbox("inkl. Unterordner", 280, 105, 120, 25)
    GuiCtrlSetState(-1, $GUI_UNCHECKED)
    GUICtrlCreateLabel("Geben Sie nun den Pfad zur Exiftool.exe bekannt.", 10, 130, 380, 15)
    ;$hFile2 = GUICtrlCreateInput($sFilename2, 10, 140, 250, 20, -1, $WS_EX_STATICEDGE)
    $exiftool = GUICtrlCreateButton($sFilename2, 10, 145, 250, 20)
    $okbutton = GUICtrlCreateButton("Batch starten!", 10, 175, 90, 20)
    $test = GUICtrlCreateButton("Ausgewählte Bilder anzeigen", 105, 175, 155, 20)
    GUICtrlCreateLabel(".Jpg", 10, 206, 30, 20)
    $progressbar = GuiCtrlCreateProgress(50, 206, 340, 20)
    GUICtrlCreateLabel(".Eps", 10, 230, 30, 20)
    $progressbar2 = GuiCtrlCreateProgress(50, 230, 340, 20)
    $cancelbutton = GUICtrlCreateButton("Abbrechen", 150, 260, 100, 20)

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

    GUISetState()

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    While 1
    $msg = GUIGetMsg()
    ; Code below will check if the file is dropped (or selected)

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

    $sCurFilename = GUICtrlRead($hFile)
    If $sCurFilename <> $sFilename Then
    $sFilename = $sCurFilename
    EndIf
    $sCurFilename2 = GUICtrlRead($exiftool)
    If $sCurFilename2 <> $sFilename2 Then
    $sFilename2 = $sCurFilename2
    EndIf
    $statuscheck = GUICtrlRead($statusbutton)
    IF $statuscheck = $GUI_CHECKED Then
    $status = "/s"
    Else
    $status = " "
    EndIf

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

    Select
    Case $msg = $GUI_EVENT_CLOSE
    _Cancel()
    Exit

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

    Case $msg = $cancelbutton
    _Cancel()

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

    Case $msg = $folderitem
    $folder = FileSelectFolder("Ordner wählen...", "")
    If @error Then ContinueLoop
    GUICtrlSetData($hFile, $folder); GUI will be updated at next iteration

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

    Case $msg = $exiftool
    $sTmpFile = FileOpenDialog("Exiftool.exe auswählen:", "", "Exiftool.exe (exiftool.exe;)")
    If @error Then ContinueLoop
    GUICtrlSetData($exiftool, $sTmpFile); GUI will be updated at next iteration

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

    Case $msg = $test
    $Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg; shutterstock_*.eps")
    _ArrayDelete($Filelist, 0)
    _ArrayDisplay($Filelist, 'Bilddaten')

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

    Case $msg = $okbutton
    ;$Filelist = _FileListToArray($sFilename, "shutterstock_*.jpg")
    ;$rows = UBound($Filelist)
    ;$Filelist2 = _FileListToArray($sFilename, "shutterstock_*.eps")
    ;$rows2 = UBound($Filelist2)
    If $sFilename2 = "Pfad Exiftool.exe" Then
    MsgBox(64, "Fehler!", "Bitte geben Sie den Pfad zu Ihrer exiftool.exe bekannt.")
    ;ElseIf $rows <= 0 Then
    ; MsgBox(64, "Fehler!", "Keine passenden Bilder im Ordner vorhanden.")
    Else
    ; If $rows2 <= 0 Then
    ; MsgBox(64, "Fehler!", "Keine passenden Bilder im Ordner vorhanden.")
    ; Else
    _startBatch()
    ; EndIf
    EndIf
    GUICtrlSetData($progressbar, 0)
    GUICtrlSetData($progressbar2, 0)

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

    EndSelect
    WEnd
    EndFunc

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

    Func _startBatch()
    Dim $descript

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

    $Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg")
    _ArrayDelete($Filelist, 0)
    _ArrayTrim($Filelist, 13, 0)
    _ArrayTrim($Filelist, 4, 1)

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

    $Filelist2 = _FileListToArrayEx($sFilename, "shutterstock_*.eps")
    _ArrayDelete($Filelist2, 0)
    _ArrayTrim($Filelist2, 13, 0)
    _ArrayTrim($Filelist2, 4, 1)

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

    $rows = UBound($Filelist)
    $FertigeBilder = 0
    $rows2 = UBound($Filelist2)
    $FertigeBilder2 = 0

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

    $oIE = _IECreate("about:blank",0,0,1,0)
    If $rows > 0 Then
    For $shutter_num In $Filelist
    $msg = GUIGetMsg()
    If $msg = $cancelbutton Then ExitLoop
    $FertigeBilder += 1
    GUICtrlSetData($progressbar,Round(($FertigeBilder / $rows) * 100, 2) )

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

    $file = "http://www.shutterstock.com/pic-" & $shutter_num & ".html"
    _IENavigate($oIE,$file)
    #cs
    $oLinks = _IETagNameGetCollection ($oIE, "a")
    $keywords = ""
    For $oLink In $oLinks
    If $oLink.className <> "0" Then
    If ($oLink.className = "middlelink") Then
    $keywords = $keywords & $oLink.getAttribute("x_shutterstock_keyword") & ', '
    EndIf
    EndIf
    Next
    #ce
    ;von hier
    $keywords = ""
    $html=_IEDocReadHTML($oIE)
    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    $ar2=_StringBetween($ar[0],'>','<')
    for $i=0 to UBound($ar2)-1 step 2
    $keywords=$keywords&$ar2[$i]&', '
    next
    ;bis hier
    $oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
    $bildNAME = _IEPropertyGet($oLinks2, "innertext")

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

    _IEQuit ($oIE)

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

    $batch = $sFilename2 & ' -m -L -overwrite_original -keywords="' & $keywords & '" -title="' & $shutter_num & '" -description="' & $bildNAME & '" "' & $sFilename & '\shutterstock_' & $shutter_num & '.jpg"'
    ClipPut($batch)
    RunWait(@ComSpec & " /c " & $batch & "")
    Sleep(50)

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

    Next
    EndIf

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

    If $rows2 > 0 Then
    For $shutter_num2 In $Filelist2
    $msg = GUIGetMsg()
    If $msg = $cancelbutton Then ExitLoop
    $FertigeBilder2 += 1
    GUICtrlSetData($progressbar2,Round(($FertigeBilder2 / $rows2) * 100, 2) )

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

    $file = "http://www.shutterstock.com/pic-" & $shutter_num2 & ".html"

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

    $keywords2 = ""
    $html=_IEDocReadHTML($oIE)
    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    $ar2=_StringBetween($ar[0],'>','<')
    for $i=0 to UBound($ar2)-1 step 2
    $keywords2=$keywords2&$ar2[$i]&', '
    next
    _IENavigate($oIE,$file)

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

    $oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
    $bildNAME2 = _IEPropertyGet($oLinks2, "innertext")

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

    _IEQuit ($oIE)

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

    $batch2 = $sFilename2 & ' -m -L -overwrite_original -description="' & $keywords2 & '" -title="' & $shutter_num2 & '-' & $bildNAME2 &'" "' & $sFilename & '\shutterstock_' & $shutter_num2 & '.eps"'
    RunWait(@ComSpec & " /c " & $batch2 & "") ; @SW_HIDE
    Sleep(50)

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

    Next
    EndIf

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

    MsgBox(64, "Vorgang Beendet", "Die Bilder wurden erfolgreich bearbeitet.")

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

    EndFunc

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

    Func _Cancel()

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

    EndFunc

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

    Func _FileListToArrayEx($s_path, $s_mask = "*.*", $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = False)

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

    If FileExists($s_path) = 0 Then Return SetError(1, 1, 0)

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

    ; Strip trailing backslash, and add one after to make sure there's only one
    $s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & ""

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

    ; Set all defaults
    If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*"
    If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0
    If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = ""

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

    ; Look for bad chars
    If StringRegExp($s_mask, "[/:><\|]") Or StringRegExp($s_exclude, "[/:><\|]") Then
    Return SetError(2, 2, 0)
    EndIf

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

    ; Strip leading spaces between semi colon delimiter
    $s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";")
    If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";")

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

    ; Confirm mask has something in it
    If StringStripWS($s_mask, 8) = "" Then Return SetError(2, 2, 0)
    If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0)

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

    ; Validate and create path + mask params
    Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = ""
    For $i = 1 To $a_split[0]
    If StringStripWS($a_split[$i], 8) = "" Then ContinueLoop
    If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then
    $a_split[$i] &= "*" & $a_split[$i]
    EndIf
    $s_hold_split &= '"' & $s_path & $a_split[$i] & '" '
    Next
    $s_hold_split = StringTrimRight($s_hold_split, 1)
    If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"'

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

    Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s "
    If $i_flag = 1 Then $s_dir_file_only = ":-d"
    If $i_flag = 2 Then $s_dir_file_only = ":D"
    If Not $f_recurse Then $s_recurse = ""

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

    ; $i_pid = Run(@ComSpec & " /c dir /b " & $s_recurse & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2) - Original

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

    $i_pid = Run(@ComSpec & " /c dir /b " & $status & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2)

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

    While 1
    $s_stdout = StdoutRead($i_pid)
    If @error Then ExitLoop
    $s_hold_out &= $s_stdout
    WEnd

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

    $s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "")
    If Not $s_hold_out Then Return SetError(4, 4, 0)

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

    ; Parse data and find matches based on flags
    Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret
    $s_hold_out = ""

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

    If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|")

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

    For $i = 1 To $a_fsplit[0]
    If $s_exclude And StringRegExp(StringRegExpReplace( _
    $a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)\Q" & $s_exclude & "\E") Then ContinueLoop
    If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i]
    If $f_full_path Then
    $s_hold_ret &= $a_fsplit[$i] & Chr(1)
    Else
    $s_hold_ret &= StringRegExpReplace($a_fsplit[$i], "((?:.*?[\\/]+)*)(.*?\z)", "$2") & Chr(1)
    EndIf
    Next

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

    $s_hold_ret = StringTrimRight($s_hold_ret, 1)
    If $s_hold_ret = "" Then Return SetError(5, 5, 0)

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

    Return StringSplit($s_hold_ret, Chr(1))
    EndFunc

    [/autoit]

    Das ist der Befehl, der an das externe Tool gesendet wird (für das Beispielbild):

    Spoiler anzeigen

    D:\Desktop\dateien\Patrick\autoit\autoit forum\exiftool\exiftool.exe -m -L -overwrite_original -keywords="becken, becker, lache, pfütze, gewässer, gewässer, bild, foto, schutzbrille, schwimmbrille, amüsement, lustig, lustiger, spaß, spaßig, vergnügen, vergnügung, teenager, schwimmen, sommer, unterwasser, wasser, selbstvertrauen, vertrauen, vertraulichkeit, zutrauen, zuversicht, beenden, hautnah, nah, sackgasse, schließen, zumachen, azul, blau, blauem, blaues, bläuen, depressiv, niedergeschlagen, schwermutig, schwermütig, traurig, traurige, kindheit, anpeilen, daheim, eigenheim, elternhaus, hause, heim, heimat, heimwärts, nachhause, nest, ruhestätte, wohnung, zielen, zuhause, mädchen, bild, erscheinungsbild, image, speicherabbild, lichtreflexe, lichtreflexe, reflektionen, reflektionen, reflexionen, zeit zum spielen, " -title="178731845" -description="0" "D:\Desktop\dateien\Patrick\autoit\autoit forum\shutterstock-au3\shutterstock_178731845.jpg"

    Viel Freude (oder Zeitersparnis) mit dem Fix :D

    Die Exe ist im Anhang :)

  • Vielen Dank für deine schnelle Hilfe, allerdings funktioniert irgendwas noch nicht ganz, Fehlermeldung nach dem ersten Bild:
    ---------------------------
    AutoIt Error
    ---------------------------
    Line 9410 (File "C:\shutterstock.exe"):


    Error: Subscript used on non-accessible variable.
    ---------------------------
    OK
    ---------------------------

    Beim Original öffnet sich IE, aktuell öffnet sich gar nix vor der Fehlermeldung

  • Den Fehler hatte ich, weil er Internetexplorer vorher noch nie gestartet hatte. (hab sonst immer andere Browser genutzt)
    Versuch mal Internetexplorer so zu starten und dann alles wegzuklicken, sodass es nicht wiederkommt.
    Ansonsten wäre es gut, wenn du das au3 Script ausführen könntest... Mit der Zeile in der Fehlermeldung kann ich leider nicht viel anfangen ;) (Außer ich Zähl die Include-Zeile und deren Include-Zeilen,... alle zusammen :D)

    Ansonsten probier mal, Zeile 136 von

    [autoit]

    $oIE = _IECreate("about:blank",0,0,1,0)

    [/autoit]

    zu

    [autoit]

    $oIE = _IECreate("about:blank",0,1,1,0)

    [/autoit]

    zu ändern.

  • Jetzt startet zwar der IE und es zeigt keine Fehlermeldung mehr sondern die Meldung "Die Bilder wurden erfolgreich bearbeitet" - aber passiert ist nix. Es startet auch nur der IE in about:blank und läd dann keine anderen Seiten nach.

  • ich hab jetzt mal probiert den alten Code zu nehmen und nur den geänderten Teil für die Keywords von dir übernommen, dann beendet er einfach das Tool ohne Meldung. Beim Syntax-Check merkt er an:

    "C:\exif_tool\shutterstock.au3"(156,111) : error: _StringBetween(): undefined function.
    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')

  • Danke nuts, dann passt der Syntax-Check, dafür kommt jetzt dieser Fehler beim Go:

    "C:\shutter_exif\shutterstock.au3" (158) : ==> Subscript used on non-accessible variable.:
    $ar2=_StringBetween($ar[0],'>','<')
    $ar2=_StringBetween($ar^ ERROR
    >Exit code: 1 Time: 17.05

    Und hier die fehlerhafte Zeile im Code:

    [autoit]

    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    $ar2=_StringBetween($ar[0],'>','<')
    for $i=0 to UBound($ar2)-1 step 2
    $keywords=$keywords&$ar2[$i]&', '

    [/autoit]
  • Ja vor dem Zugriff auf ein Array ist etwas Error-Managment immer angebracht.
    Gerade bei einem Aufruf mit undefiniertem Inhalt wie hier.

    Der Code ist bissle gruselig, du kannst die entsprechende Stelle mal ca. so abändern (ungeprüft)

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

    $keywords = ""
    $html=_IEDocReadHTML($oIE)
    $keywords=_Keywords($html)
    if @error then MsgBox(0, "Error", 'Fehler in Funktion _Stringbetween "No inbetween string found"')

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

    Func _Keywords($s_html)

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

    local $return_keywords = ""
    Local $ar=_StringBetween($s_html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    if @error then Return SetError(1,0,0)
    Local $ar2=_StringBetween($ar[0],'>','<')
    if @error then Return SetError(1,0,0)

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

    for $i=0 to UBound($ar2)-1 step 2
    $return_keywords=$return_keywords&$ar2[$i]&', '
    next

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

    Return $return_keywords

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

    endfunc

    [/autoit]
  • Überprüf mal, was in $html steht... Ich vermute, dass das leer sein wird... (msgbox(48,"",$html).
    Vermutung: Falscher Bildname. Stand auf der Seite... andernfalls sind die Seiten nicht alle gleich aufgebaut.

    Habe ich gerade nochmal händisch überprüft, die Seiten sind alle gleich aufgebaut, nur mit unterschiedlicher Anzahl von Keywords falls das was ausmacht?

  • Die Anzahl der Einträge ist egal. Es wird ja das ganze Array durchgegangen.
    Ich vermute, dass die Seite nicht existiert (am Dateinamen etwas nicht stimmt, etc.)

    Füg hinter der Zeile

    [autoit]

    $batch = $sFilename2 & ' -m -L -overwrite_original -keywords="' & $keywords & '" -title="' & $shutter_num & '" -description="' & $bildNAME & '" "' & $sFilename & '\shutterstock_' & $shutter_num & '.jpg"'

    [/autoit]


    dies hinzu:

    [autoit]

    ClipPut($batch)

    [/autoit]

    Danach kannst du das Notepad öffnen und mit STRG + V (einfügen) den letzten Eintrag auslesen. Jenachdem, ob etwas ausgelesen wurde müsste das dann dort stehen. Mit dem Testbild, dass ich herausgesucht habe standen dann dort die Daten, so wie sie von der Seite ausgelsen wurden.

    Ich vermute, dass die Bildnamen dem hier nicht entsprechen:
    shutterstock_*.jpg
    shutterstock_*.eps

    * ist die Nummer des Bildes.

  • Der Dateinamen stimmt, es wird auch die korrekte Website im Internet Explorer geöffnet, allerdings stürzt dann das Programm ab mit der Fehlermeldung:
    (158) : ==> Subscript used on non-accessible variable.:
    $ar2=_StringBetween($ar[0],'>','<')
    $ar2=_StringBetween($ar^ ERROR

    ClipPut war schon drinnen im Code, nach dem Absturz ist die Zwischenablage aber leer. Kannst du evtl. mal das bei dir funktionierende Programm als EXE zur Verfügung stellen, nicht das es sich hier um einen Compiler-Fehler handelt?

    Es kann wohl tatsächlich vorkommen das es die Seite zu einem Bild nicht gibt ("Dieses Bild ist nicht mehr verfügbar") dann sollte das Programm aber eigentlich die Datei einfach überspringen und mit der nächsten weiter machen.

    Vielen Dank!

  • Ah. Dann ist das das Problem. Das Programm arbeitet alle Bilder ab. Wenn es zu einem Bild kommt, das nicht vorhanden ist, dann stürzt es ab. Ich habe das nun berücksichtigt. Sobald Bildinfos nicht geladen werden können wird das Bild übersprungen. Am Ende des Vorgangs kann man sich die Fehlgeschlagenen Bilder in die Zwischenablage kopieren lassen.

    Quellcode:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=shutterstock.exe
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include "IE.au3"
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <String.au3>

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

    Opt('MustDeclareVars', 0)

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

    Global $folderitem, $okbutton, $cancelbutton, $test, $msg, $empty, $status, $statuscheck
    Global $sFilename2 = ''
    Global $sFilename = @UserProfileDir
    Global $sFilename2 = "Pfad Exiftool.exe"
    Global $sCurFilename, $hFile, $folder, $Filelist, $Filelist2, $progressbar, $i, $rows, $exiftool, $hFile2, $sCurFilename2, $sTmpFile, $statusbutton, $progressbar2
    Global $file, $oIE, $oLinks, $keywords, $oLinks2, $bildNAME, $oLinks3, $bildID, $batch, $FertigeBilder, $stopvar, $FertigeBilder2, $rows2, $shutter_num, $shutter_num2, $batch2, $keywords2, $bildNAME2

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

    _Main()

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

    Func _Main()

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

    GuiCreate("Shutterstock EXIF Übernahme", 400, 290)
    GUICtrlCreateLabel("Shutterstock Metadaten übernahme für .jpg und .eps Bilder.", 10, 15, 380, 15)
    GUICtrlCreateLabel("Geben Sie bitte nun den Ordner zu Ihren Shutterstock Bildern an.", 10, 45, 380, 12)
    GUICtrlCreateLabel('(Bilder müssen im Format "shutterstock_XXX.jpg/.eps" beschriftet sein.)', 10, 60, 380, 15)
    $hFile = GUICtrlCreateInput($sFilename, 10, 85, 250, 20, -1, $WS_EX_STATICEDGE)
    $folderitem = GUICtrlCreateButton("Bilder Ordner...", 270, 85, 120, 20)
    ;$statusbutton = GuiCtrlCreateCheckbox("inkl. Unterordner", 280, 105, 120, 25)
    GuiCtrlSetState(-1, $GUI_UNCHECKED)
    GUICtrlCreateLabel("Geben Sie nun den Pfad zur Exiftool.exe bekannt.", 10, 130, 380, 15)
    ;$hFile2 = GUICtrlCreateInput($sFilename2, 10, 140, 250, 20, -1, $WS_EX_STATICEDGE)
    $exiftool = GUICtrlCreateButton($sFilename2, 10, 145, 250, 20)
    $okbutton = GUICtrlCreateButton("Batch starten!", 10, 175, 90, 20)
    $test = GUICtrlCreateButton("Ausgewählte Bilder anzeigen", 105, 175, 155, 20)
    GUICtrlCreateLabel(".Jpg", 10, 206, 30, 20)
    $progressbar = GuiCtrlCreateProgress(50, 206, 340, 20)
    GUICtrlCreateLabel(".Eps", 10, 230, 30, 20)
    $progressbar2 = GuiCtrlCreateProgress(50, 230, 340, 20)
    $cancelbutton = GUICtrlCreateButton("Abbrechen", 150, 260, 100, 20)

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

    GUISetState()

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    While 1
    $msg = GUIGetMsg()
    ; Code below will check if the file is dropped (or selected)

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

    $sCurFilename = GUICtrlRead($hFile)
    If $sCurFilename <> $sFilename Then
    $sFilename = $sCurFilename
    EndIf
    $sCurFilename2 = GUICtrlRead($exiftool)
    If $sCurFilename2 <> $sFilename2 Then
    $sFilename2 = $sCurFilename2
    EndIf
    $statuscheck = GUICtrlRead($statusbutton)
    IF $statuscheck = $GUI_CHECKED Then
    $status = "/s"
    Else
    $status = " "
    EndIf

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

    Select
    Case $msg = $GUI_EVENT_CLOSE
    _Cancel()
    Exit

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

    Case $msg = $cancelbutton
    _Cancel()

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

    Case $msg = $folderitem
    $folder = FileSelectFolder("Ordner wählen...", "")
    If @error Then ContinueLoop
    GUICtrlSetData($hFile, $folder); GUI will be updated at next iteration

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

    Case $msg = $exiftool
    $sTmpFile = FileOpenDialog("Exiftool.exe auswählen:", "", "Exiftool.exe (exiftool.exe;)")
    If @error Then ContinueLoop
    GUICtrlSetData($exiftool, $sTmpFile); GUI will be updated at next iteration

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

    Case $msg = $test
    $Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg; shutterstock_*.eps")
    _ArrayDelete($Filelist, 0)
    _ArrayDisplay($Filelist, 'Bilddaten')

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

    Case $msg = $okbutton
    ;$Filelist = _FileListToArray($sFilename, "shutterstock_*.jpg")
    ;$rows = UBound($Filelist)
    ;$Filelist2 = _FileListToArray($sFilename, "shutterstock_*.eps")
    ;$rows2 = UBound($Filelist2)
    If $sFilename2 = "Pfad Exiftool.exe" Then
    MsgBox(64, "Fehler!", "Bitte geben Sie den Pfad zu Ihrer exiftool.exe bekannt.")
    ;ElseIf $rows <= 0 Then
    ; MsgBox(64, "Fehler!", "Keine passenden Bilder im Ordner vorhanden.")
    Else
    ; If $rows2 <= 0 Then
    ; MsgBox(64, "Fehler!", "Keine passenden Bilder im Ordner vorhanden.")
    ; Else
    _startBatch()
    ; EndIf
    EndIf
    GUICtrlSetData($progressbar, 0)
    GUICtrlSetData($progressbar2, 0)

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

    EndSelect
    WEnd
    EndFunc

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

    Func _startBatch()
    Dim $descript

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

    $Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg")
    _ArrayDelete($Filelist, 0)
    _ArrayTrim($Filelist, 13, 0)
    _ArrayTrim($Filelist, 4, 1)

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

    $Filelist2 = _FileListToArrayEx($sFilename, "shutterstock_*.eps")
    _ArrayDelete($Filelist2, 0)
    _ArrayTrim($Filelist2, 13, 0)
    _ArrayTrim($Filelist2, 4, 1)

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

    $rows = UBound($Filelist)
    $FertigeBilder = 0
    $rows2 = UBound($Filelist2)
    $FertigeBilder2 = 0
    $failedPictures=""

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

    $oIE = _IECreate("about:blank",0,0,1,0)
    If $rows > 0 Then
    For $shutter_num In $Filelist
    $msg = GUIGetMsg()
    If $msg = $cancelbutton Then ExitLoop
    $FertigeBilder += 1
    GUICtrlSetData($progressbar,Round(($FertigeBilder / $rows) * 100, 2) )

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

    $file = "http://www.shutterstock.com/pic-" & $shutter_num & ".html"
    $tmp=_IENavigate($oIE,$file)
    #cs
    $oLinks = _IETagNameGetCollection ($oIE, "a")
    $keywords = ""
    For $oLink In $oLinks
    If $oLink.className <> "0" Then
    If ($oLink.className = "middlelink") Then
    $keywords = $keywords & $oLink.getAttribute("x_shutterstock_keyword") & ', '
    EndIf
    EndIf
    Next
    #ce
    ;von hier
    $keywords = ""
    $html=_IEDocReadHTML($oIE)
    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    if IsArray($ar) then
    $ar2=_StringBetween($ar[0],'>','<')
    for $i=0 to UBound($ar2)-1 step 2
    $keywords=$keywords&$ar2[$i]&', '
    next
    ;bis hier
    $oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
    $bildNAME = _IEPropertyGet($oLinks2, "innertext")

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

    $batch = $sFilename2 & ' -m -L -overwrite_original -keywords="' & $keywords & '" -title="' & $shutter_num & '" -description="' & $bildNAME & '" "' & $sFilename & '\shutterstock_' & $shutter_num & '.jpg"'
    ClipPut($batch)
    RunWait(@ComSpec & " /c " & $batch & "")
    Sleep(50)
    else
    $failedPictures&="Failed: shutterstock_"&$shutter_num&".jpg"&@crlf
    endif

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

    Next
    _IEQuit ($oIE)
    EndIf

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

    If $rows2 > 0 Then
    For $shutter_num2 In $Filelist2
    $msg = GUIGetMsg()
    If $msg = $cancelbutton Then ExitLoop
    $FertigeBilder2 += 1
    GUICtrlSetData($progressbar2,Round(($FertigeBilder2 / $rows2) * 100, 2) )

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

    $file = "http://www.shutterstock.com/pic-" & $shutter_num2 & ".html"

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

    $keywords2 = ""
    $html=_IEDocReadHTML($oIE)
    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    if IsArray($ar) then
    $ar2=_StringBetween($ar[0],'>','<')
    for $i=0 to UBound($ar2)-1 step 2
    $keywords2=$keywords2&$ar2[$i]&', '
    next
    $tmp=_IENavigate($oIE,$file)

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

    $oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
    $bildNAME2 = _IEPropertyGet($oLinks2, "innertext")

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

    $batch2 = $sFilename2 & ' -m -L -overwrite_original -description="' & $keywords2 & '" -title="' & $shutter_num2 & '-' & $bildNAME2 &'" "' & $sFilename & '\shutterstock_' & $shutter_num2 & '.eps"'
    RunWait(@ComSpec & " /c " & $batch2 & "") ; @SW_HIDE
    Sleep(50)
    else
    $failedPictures&="Failed: shutterstock_"&$shutter_num&".esp"&@crlf
    endif
    Next
    _IEQuit ($oIE)
    EndIf

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

    MsgBox(64, "Vorgang Beendet", "Die Bilder wurden erfolgreich bearbeitet.")
    if $failedPictures<>"" then
    if MsgBox(4, "Vorgang Beendet", "Möchten sie die Info, welche Bilder nicht erfolgreich bearbeitet werden konnten in die Zwischenablage kopieren lassen?")=6 then
    ClipPut($failedPictures)
    endif
    else
    MsgBox(64, "Vorgang Beendet", "Die Bilder wurden erfolgreich bearbeitet.")
    endif

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

    EndFunc

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

    Func _Cancel()

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

    EndFunc

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

    Func _FileListToArrayEx($s_path, $s_mask = "*.*", $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = False)

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

    If FileExists($s_path) = 0 Then Return SetError(1, 1, 0)

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

    ; Strip trailing backslash, and add one after to make sure there's only one
    $s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & ""

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

    ; Set all defaults
    If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*"
    If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0
    If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = ""

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

    ; Look for bad chars
    If StringRegExp($s_mask, "[/:><\|]") Or StringRegExp($s_exclude, "[/:><\|]") Then
    Return SetError(2, 2, 0)
    EndIf

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

    ; Strip leading spaces between semi colon delimiter
    $s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";")
    If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";")

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

    ; Confirm mask has something in it
    If StringStripWS($s_mask, 8) = "" Then Return SetError(2, 2, 0)
    If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0)

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

    ; Validate and create path + mask params
    Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = ""
    For $i = 1 To $a_split[0]
    If StringStripWS($a_split[$i], 8) = "" Then ContinueLoop
    If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then
    $a_split[$i] &= "*" & $a_split[$i]
    EndIf
    $s_hold_split &= '"' & $s_path & $a_split[$i] & '" '
    Next
    $s_hold_split = StringTrimRight($s_hold_split, 1)
    If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"'

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

    Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s "
    If $i_flag = 1 Then $s_dir_file_only = ":-d"
    If $i_flag = 2 Then $s_dir_file_only = ":D"
    If Not $f_recurse Then $s_recurse = ""

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

    ; $i_pid = Run(@ComSpec & " /c dir /b " & $s_recurse & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2) - Original

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

    $i_pid = Run(@ComSpec & " /c dir /b " & $status & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2)

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

    While 1
    $s_stdout = StdoutRead($i_pid)
    If @error Then ExitLoop
    $s_hold_out &= $s_stdout
    WEnd

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

    $s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "")
    If Not $s_hold_out Then Return SetError(4, 4, 0)

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

    ; Parse data and find matches based on flags
    Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret
    $s_hold_out = ""

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

    If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|")

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

    For $i = 1 To $a_fsplit[0]
    If $s_exclude And StringRegExp(StringRegExpReplace( _
    $a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)\Q" & $s_exclude & "\E") Then ContinueLoop
    If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i]
    If $f_full_path Then
    $s_hold_ret &= $a_fsplit[$i] & Chr(1)
    Else
    $s_hold_ret &= StringRegExpReplace($a_fsplit[$i], "((?:.*?[\\/]+)*)(.*?\z)", "$2") & Chr(1)
    EndIf
    Next

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

    $s_hold_ret = StringTrimRight($s_hold_ret, 1)
    If $s_hold_ret = "" Then Return SetError(5, 5, 0)

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

    Return StringSplit($s_hold_ret, Chr(1))
    EndFunc

    [/autoit]
  • Irgendwie stimmt da immernoch etwas nicht. Ich hab jetzt 3 Bilder in einem Testordner, die Bilder können händisch alle nach diesem Schema aufgerufen werden:
    http://www.shutterstock.com/pic-"BILDNUMMER".html"

    Ich glaube der Fehler steckt in dieser Zeile:
    $oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
    $bildNAME = _IEPropertyGet($oLinks2, "innertext")

    Da es auf der Seite kein <div> mit der id="display-pic-description" gibt schlägt der Vorgang fehl

    tatsächlich müsste es wohl irgendwie so sein:
    $oLinks2 = _IEGetObjById ($oIE, "kw_*WILDCARD-starte mit 1 und zähle hoch bis Ende*")
    $bildNAME = _IEPropertyGet($oLinks2, "innertext")

    da der Tag den er auslesen muss so aussieht, das gesuchte keyword habe ich rot markiert:
    <a id="kw_1" href="/de/s/vektor/search.html">vektor</a>
    und dann kommt der nächste tag mit der kw_2
    <a id="kw_2" href="/de/s/fahrzeuge/search.html">fahrzeuge</a>

    und das müsste er machen bis alle kws abgefragt sind. Bei der alten Website hatten alle Keywords die selbe ID, das ist hier leider nicht mehr der Fall.

    Ich hab dir hier mal 3 Testbilder reingepackt, schau mal ob das bei dir mit denen durchläuft:

  • So. Ich habs mal angepasst:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=shutterstock.exe
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include "IE.au3"
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <String.au3>

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

    Opt('MustDeclareVars', 0)

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

    Global $folderitem, $okbutton, $cancelbutton, $test, $msg, $empty, $status, $statuscheck
    Global $sFilename2 = ''
    Global $sFilename = @UserProfileDir
    Global $sFilename2 = "Pfad Exiftool.exe"
    Global $sCurFilename, $hFile, $folder, $Filelist, $Filelist2, $progressbar, $i, $rows, $exiftool, $hFile2, $sCurFilename2, $sTmpFile, $statusbutton, $progressbar2
    Global $file, $oIE, $oLinks, $keywords, $oLinks2, $bildNAME, $oLinks3, $bildID, $batch, $FertigeBilder, $stopvar, $FertigeBilder2, $rows2, $shutter_num, $shutter_num2, $batch2, $keywords2, $bildNAME2

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

    _Main()

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

    Func _Main()

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

    GuiCreate("Shutterstock EXIF Übernahme", 400, 290)
    GUICtrlCreateLabel("Shutterstock Metadaten übernahme für .jpg und .eps Bilder.", 10, 15, 380, 15)
    GUICtrlCreateLabel("Geben Sie bitte nun den Ordner zu Ihren Shutterstock Bildern an.", 10, 45, 380, 12)
    GUICtrlCreateLabel('(Bilder müssen im Format "shutterstock_XXX.jpg/.eps" beschriftet sein.)', 10, 60, 380, 15)
    $hFile = GUICtrlCreateInput($sFilename, 10, 85, 250, 20, -1, $WS_EX_STATICEDGE)
    $folderitem = GUICtrlCreateButton("Bilder Ordner...", 270, 85, 120, 20)
    ;$statusbutton = GuiCtrlCreateCheckbox("inkl. Unterordner", 280, 105, 120, 25)
    GuiCtrlSetState(-1, $GUI_UNCHECKED)
    GUICtrlCreateLabel("Geben Sie nun den Pfad zur Exiftool.exe bekannt.", 10, 130, 380, 15)
    ;$hFile2 = GUICtrlCreateInput($sFilename2, 10, 140, 250, 20, -1, $WS_EX_STATICEDGE)
    $exiftool = GUICtrlCreateButton($sFilename2, 10, 145, 250, 20)
    $okbutton = GUICtrlCreateButton("Batch starten!", 10, 175, 90, 20)
    $test = GUICtrlCreateButton("Ausgewählte Bilder anzeigen", 105, 175, 155, 20)
    GUICtrlCreateLabel(".Jpg", 10, 206, 30, 20)
    $progressbar = GuiCtrlCreateProgress(50, 206, 340, 20)
    GUICtrlCreateLabel(".Eps", 10, 230, 30, 20)
    $progressbar2 = GuiCtrlCreateProgress(50, 230, 340, 20)
    $cancelbutton = GUICtrlCreateButton("Abbrechen", 150, 260, 100, 20)

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

    GUISetState()

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    While 1
    $msg = GUIGetMsg()
    ; Code below will check if the file is dropped (or selected)

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

    $sCurFilename = GUICtrlRead($hFile)
    If $sCurFilename <> $sFilename Then
    $sFilename = $sCurFilename
    EndIf
    $sCurFilename2 = GUICtrlRead($exiftool)
    If $sCurFilename2 <> $sFilename2 Then
    $sFilename2 = $sCurFilename2
    EndIf
    $statuscheck = GUICtrlRead($statusbutton)
    IF $statuscheck = $GUI_CHECKED Then
    $status = "/s"
    Else
    $status = " "
    EndIf

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

    Select
    Case $msg = $GUI_EVENT_CLOSE
    _Cancel()
    Exit

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

    Case $msg = $cancelbutton
    _Cancel()

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

    Case $msg = $folderitem
    $folder = FileSelectFolder("Ordner wählen...", "")
    If @error Then ContinueLoop
    GUICtrlSetData($hFile, $folder); GUI will be updated at next iteration

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

    Case $msg = $exiftool
    $sTmpFile = FileOpenDialog("Exiftool.exe auswählen:", "", "Exiftool.exe (exiftool.exe;)")
    If @error Then ContinueLoop
    GUICtrlSetData($exiftool, $sTmpFile); GUI will be updated at next iteration

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

    Case $msg = $test
    $Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg; shutterstock_*.eps")
    _ArrayDelete($Filelist, 0)
    _ArrayDisplay($Filelist, 'Bilddaten')

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

    Case $msg = $okbutton
    ;$Filelist = _FileListToArray($sFilename, "shutterstock_*.jpg")
    ;$rows = UBound($Filelist)
    ;$Filelist2 = _FileListToArray($sFilename, "shutterstock_*.eps")
    ;$rows2 = UBound($Filelist2)
    If $sFilename2 = "Pfad Exiftool.exe" Then
    MsgBox(64, "Fehler!", "Bitte geben Sie den Pfad zu Ihrer exiftool.exe bekannt.")
    ;ElseIf $rows <= 0 Then
    ; MsgBox(64, "Fehler!", "Keine passenden Bilder im Ordner vorhanden.")
    Else
    ; If $rows2 <= 0 Then
    ; MsgBox(64, "Fehler!", "Keine passenden Bilder im Ordner vorhanden.")
    ; Else
    _startBatch()
    ; EndIf
    EndIf
    GUICtrlSetData($progressbar, 0)
    GUICtrlSetData($progressbar2, 0)

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

    EndSelect
    WEnd
    EndFunc

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

    Func _startBatch()
    Dim $descript

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

    $Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg")
    _ArrayDelete($Filelist, 0)
    _ArrayTrim($Filelist, 13, 0)
    _ArrayTrim($Filelist, 4, 1)

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

    $Filelist2 = _FileListToArrayEx($sFilename, "shutterstock_*.eps")
    _ArrayDelete($Filelist2, 0)
    _ArrayTrim($Filelist2, 13, 0)
    _ArrayTrim($Filelist2, 4, 1)

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

    $rows = UBound($Filelist)
    $FertigeBilder = 0
    $rows2 = UBound($Filelist2)
    $FertigeBilder2 = 0
    $failedPictures=""

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

    $oIE = _IECreate("about:blank",0,0,1,0)
    If $rows > 0 Then
    For $shutter_num In $Filelist
    $msg = GUIGetMsg()
    If $msg = $cancelbutton Then ExitLoop
    $FertigeBilder += 1
    GUICtrlSetData($progressbar,Round(($FertigeBilder / $rows) * 100, 2) )

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

    $file = "http://www.shutterstock.com/pic-" & $shutter_num & ".html"
    $tmp=_IENavigate($oIE,$file)
    #cs
    $oLinks = _IETagNameGetCollection ($oIE, "a")
    $keywords = ""
    For $oLink In $oLinks
    If $oLink.className <> "0" Then
    If ($oLink.className = "middlelink") Then
    $keywords = $keywords & $oLink.getAttribute("x_shutterstock_keyword") & ', '
    EndIf
    EndIf
    Next
    #ce
    ;von hier
    $keywords = ""
    $html=_IEDocReadHTML($oIE)
    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    if IsArray($ar) then
    $ar2=_StringBetween($ar[0],'>','<')
    for $i=0 to UBound($ar2)-1 step 2
    $keywords=$keywords&$ar2[$i]&', '
    next
    ;bis hier

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

    $bildNAME = _StringBetween($html,'<title>',' Stock Foto '&$shutter_num&' : Shutterstock</title>')
    if IsArray($bildNAME) then
    $bildNAME=$bildNAME[0]
    Else
    $bildNAME="unknown"
    endif

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

    $batch = $sFilename2 & ' -m -L -overwrite_original -keywords="' & $keywords & '" -title="' & $shutter_num & '" -description="' & $bildNAME & '" "' & $sFilename & '\shutterstock_' & $shutter_num & '.jpg"'
    ;msgbox(48,"",$batch)
    RunWait(@ComSpec & " /c " & $batch & "")
    Sleep(50)
    else
    $failedPictures&="Failed: shutterstock_"&$shutter_num&".jpg"&@crlf
    endif

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

    Next
    _IEQuit ($oIE)
    EndIf

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

    If $rows2 > 0 Then
    For $shutter_num2 In $Filelist2
    $msg = GUIGetMsg()
    If $msg = $cancelbutton Then ExitLoop
    $FertigeBilder2 += 1
    GUICtrlSetData($progressbar2,Round(($FertigeBilder2 / $rows2) * 100, 2) )

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

    $file = "http://www.shutterstock.com/pic-" & $shutter_num2 & ".html"

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

    $keywords2 = ""
    $html=_IEDocReadHTML($oIE)
    $ar=_StringBetween($html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
    if IsArray($ar) then
    $ar2=_StringBetween($ar[0],'>','<')
    for $i=0 to UBound($ar2)-1 step 2
    $keywords2=$keywords2&$ar2[$i]&', '
    next
    $tmp=_IENavigate($oIE,$file)

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

    $bildNAME2 = _StringBetween($html,'<title>',' Stock Foto '&$shutter_num&' : Shutterstock</title>')
    if IsArray($bildNAME2) then
    $bildNAME2=$bildNAME2[0]
    Else
    $bildNAME2="unknown"
    endif

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

    $batch2 = $sFilename2 & ' -m -L -overwrite_original -description="' & $keywords2 & '" -title="' & $shutter_num2 & '-' & $bildNAME2 &'" "' & $sFilename & '\shutterstock_' & $shutter_num2 & '.eps"'
    ;msgbox(48,"",$batch2)
    RunWait(@ComSpec & " /c " & $batch2 & "") ; @SW_HIDE
    Sleep(50)
    else
    $failedPictures&="Failed: shutterstock_"&$shutter_num&".esp"&@crlf
    endif
    Next
    _IEQuit ($oIE)
    EndIf

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

    MsgBox(64, "Vorgang Beendet", "Die Bilder wurden erfolgreich bearbeitet.")
    if $failedPictures<>"" then
    if MsgBox(4, "Vorgang Beendet", "Möchten sie die Info, welche Bilder nicht erfolgreich bearbeitet werden konnten in die Zwischenablage kopieren lassen?")=6 then
    ClipPut($failedPictures)
    endif
    else
    MsgBox(64, "Vorgang Beendet", "Die Bilder wurden erfolgreich bearbeitet.")
    endif

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

    EndFunc

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

    Func _Cancel()

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

    EndFunc

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

    Func _FileListToArrayEx($s_path, $s_mask = "*.*", $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = False)

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

    If FileExists($s_path) = 0 Then Return SetError(1, 1, 0)

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

    ; Strip trailing backslash, and add one after to make sure there's only one
    $s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & ""

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

    ; Set all defaults
    If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*"
    If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0
    If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = ""

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

    ; Look for bad chars
    If StringRegExp($s_mask, "[/:><\|]") Or StringRegExp($s_exclude, "[/:><\|]") Then
    Return SetError(2, 2, 0)
    EndIf

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

    ; Strip leading spaces between semi colon delimiter
    $s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";")
    If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";")

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

    ; Confirm mask has something in it
    If StringStripWS($s_mask, 8) = "" Then Return SetError(2, 2, 0)
    If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0)

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

    ; Validate and create path + mask params
    Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = ""
    For $i = 1 To $a_split[0]
    If StringStripWS($a_split[$i], 8) = "" Then ContinueLoop
    If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then
    $a_split[$i] &= "*" & $a_split[$i]
    EndIf
    $s_hold_split &= '"' & $s_path & $a_split[$i] & '" '
    Next
    $s_hold_split = StringTrimRight($s_hold_split, 1)
    If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"'

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

    Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s "
    If $i_flag = 1 Then $s_dir_file_only = ":-d"
    If $i_flag = 2 Then $s_dir_file_only = ":D"
    If Not $f_recurse Then $s_recurse = ""

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

    ; $i_pid = Run(@ComSpec & " /c dir /b " & $s_recurse & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2) - Original

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

    $i_pid = Run(@ComSpec & " /c dir /b " & $status & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2)

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

    While 1
    $s_stdout = StdoutRead($i_pid)
    If @error Then ExitLoop
    $s_hold_out &= $s_stdout
    WEnd

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

    $s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "")
    If Not $s_hold_out Then Return SetError(4, 4, 0)

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

    ; Parse data and find matches based on flags
    Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret
    $s_hold_out = ""

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

    If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|")

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

    For $i = 1 To $a_fsplit[0]
    If $s_exclude And StringRegExp(StringRegExpReplace( _
    $a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)\Q" & $s_exclude & "\E") Then ContinueLoop
    If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i]
    If $f_full_path Then
    $s_hold_ret &= $a_fsplit[$i] & Chr(1)
    Else
    $s_hold_ret &= StringRegExpReplace($a_fsplit[$i], "((?:.*?[\\/]+)*)(.*?\z)", "$2") & Chr(1)
    EndIf
    Next

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

    $s_hold_ret = StringTrimRight($s_hold_ret, 1)
    If $s_hold_ret = "" Then Return SetError(5, 5, 0)

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

    Return StringSplit($s_hold_ret, Chr(1))
    EndFunc

    [/autoit]


    So. Bei deinen Beispielen kommt jetzt immer das richtige heraus. Wenn das exiftool funktioniert dürfte es keine Schwierigkeiten mehr geben.

  • Bei mir passiert mit den Beispieldateien gerade gar nichts obwohl das Tool anzeigt "Die Bilder wurden erfolgreich bearbeitet". Evtl. läd sich irgendein String bei meinem Compiler nicht richtig, kannst du mir evtl. deine Exe zur Verfügung stellen? Danke!