Hilfe
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 

Postbox-Sammeldownload ? codipodo !

36 ANTWORTEN

FloHallo
Autor ★
8 Beiträge

soweit ich gelesen habe, kann das mechanize nicht.

außer mit viel Aufwand in dem man den POST/GET simuliert.

Von daher lasse ich das.

 

Der neue Download funktioniert, nur stört er sich an HTML Einträgen, obwohl er ja nach PDFs schaut.

Bsp: 

 

Traceback (most recent call last):
        7: from codipodo.ry:38:in `<main>'
        6: from C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize.rb:466:in `get'
        5: from codipodo.ry:55:in `block in <main>'
        4: from codipodo.ry:55:in `each'
        3: from codipodo.ry:63:in `block (2 levels) in <main>'
        2: from C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize/file.rb:85:in `save!'
        1: from C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize/file.rb:85:in `open'
C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize/file.rb:85:in `initialize': Invalid argument @ rb_sysopen - comdirect-postbox/Wichtige_Steuerinformation_zu_Ihrem_comdirect-Depot623254.html?forceDownload=true (Errno::EINVAL)

Es wird sogar heruntergeladen, dh. wenn er nach der Exception weiter machen würde, wärs gar kein Problem.

dg2210
Legende
6.199 Beiträge

@FloHallo  schrieb:

soweit ich gelesen habe, kann das mechanize nicht.

Was kann mechanize nicht ?

Der neue Download funktioniert, nur stört er sich an HTML Einträgen, obwohl er ja nach PDFs schaut.

Der neue Download schaut nicht nach PDFs, sondern nach URLs mit dem Pfad "dokumentenabruf". Früher waren darunter nur PDFs zu finden.

 

Workaround 1: manuell in die Postbox gehen, das entsprechende Dokument archivieren, danach codipodo aufrufen.

 

Workaround 2:

      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
      end

ersetzen durch

      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
else
next end

 

Workaround 3: Einen richtigen Browser (chrome oder Firefox) nehmen und diesen über ein Script und einen entsprechenden Treiber (z.B. selenium) fernsteuern.

 

 

FloHallo
Autor ★
8 Beiträge

Hier mein aktuelles Script zum Herunterladen von zwei Konten, ich habe bei mir die IDs fest hinterlegt und gebe nur die Passwörter ein.

Die Pfade kann man auch getrennt festlegen.

Quick & Dirty, kann man schöner machen und ruby mecker über gleichnamige Variablen, aber egal 😄

 

# COmDIrect-POstfach-DOwnloader: codipodo
# Dieses Programm holt die PDF-Dokumente der ersten Seite der Postbox
# und legt sie im Ausgabeverzeichenis (s.u.) ab

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

require 'mechanize'

# LOGINDATEN, bitte anpassen
#ID = ""  # Comdirect-Zugangsnummer
#PIN = "123456"  # Comdirect-PIN

require "highline/import"
ID = "12345678" #ask "ID: "
puts "Beschreibung Konto 1: #{ID}"
PIN = ask "Passwort: "

# Ablageort der heruntergeladenen Dateien
DIRECTORY="e:/Pfad1/"

# Feste URLs der Comdirect
LOGINURL="https://kunde.comdirect.de/lp/wt/login"
LOGOUTURL="https://kunde.comdirect.de/lp/wt/logout"
POSTBOX_URL="https://kunde.comdirect.de/itx/posteingangsuche"
SUCCESSPAGE="https://kunde.comdirect.de/itx/persoenlicherbereich/anzeigen?execution=e1s1"

  @agent = Mechanize.new 
  @agent.get(LOGINURL) do |page|
     login_result = page.form_with(:name => 'login') do |log|
       log.add_field!("loginAction", "loginAction")
       log.param1= ID
       log.param3 = PIN
     end.click_button

     # Sind wir auf der richtigen Seite gelandet?"
     if login_result.uri.to_s != SUCCESSPAGE
       puts "Login fehlgeschlagen,  aktuelle URL: #{login_result.uri.to_s}"
       break
     end

    @agent.get(POSTBOX_URL)

     # Nur Eintraege, deren URL "/dokumentenabruf/" enthält, abholen,
    # d.h. Werbung oder andere nicht-downloadbare Elemente überspringen
    @agent.page.links_with(:href => /dokumentenabruf/).each do |link|
      filename = link.href.split('/')[-1]
    
      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
      end

      path = File.join DIRECTORY, filename
      result = link.click.save! path
    end
  end
  @agent.get(LOGOUTURL)
  
  
  
  
  
ID = "987654321" #ask "ID: "
puts "Beschreibung Konto 2: #{ID}"
PIN = ask "Passwort: "

# Ablageort der heruntergeladenen Dateien
DIRECTORY="e:/Pfad2/"

# Feste URLs der Comdirect
LOGINURL="https://kunde.comdirect.de/lp/wt/login"
LOGOUTURL="https://kunde.comdirect.de/lp/wt/logout"
POSTBOX_URL="https://kunde.comdirect.de/itx/posteingangsuche"
SUCCESSPAGE="https://kunde.comdirect.de/itx/persoenlicherbereich/anzeigen?execution=e1s1"

  @agent = Mechanize.new 
  @agent.get(LOGINURL) do |page|
     login_result = page.form_with(:name => 'login') do |log|
       log.add_field!("loginAction", "loginAction")
       log.param1= ID
       log.param3 = PIN
     end.click_button

     # Sind wir auf der richtigen Seite gelandet?"
     if login_result.uri.to_s != SUCCESSPAGE
       puts "Login fehlgeschlagen,  aktuelle URL: #{login_result.uri.to_s}"
       break
     end

    @agent.get(POSTBOX_URL)

     # Nur Eintraege, deren URL "/dokumentenabruf/" enthält, abholen,
    # d.h. Werbung oder andere nicht-downloadbare Elemente überspringen
    @agent.page.links_with(:href => /dokumentenabruf/).each do |link|
      filename = link.href.split('/')[-1]
    
      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
      end

      path = File.join DIRECTORY, filename
      result = link.click.save! path
    end
  end
  @agent.get(LOGOUTURL)

Tarulia
Mentor ★
1.112 Beiträge

Hab mir das ganze heute mal unter nem relativ taufrischen Fedora 29 aufgesetzt und musste so einige packages nachinstallieren, damit mechanize überhaupt installiert werden konnte:

 

  • ruby-devel für die ruby header
  • automake
  • redhat-rpm-config
  • gcc-c++
  • zlib-devel
  • git (oder patch, geht beides, aber Git brauch man eh mal)

Damit habe ich nach und nach die compile-Fehler beseitigt und es funktioniert jetzt.

 

Ich habe mir auf GitHub auch mal das Repo geclont und die bisher geposteten Änderungen reingebracht, hab ein PR geschickt:

https://github.com/dg2210/comdirect/pull/1

 

Bin auch gerade noch selbst am rumbasteln und testen, werde meine Änderungen dann auch zu gegebener Zeit nochmal hier posten.

dg2210
Legende
6.199 Beiträge

@Tarulia  schrieb:

Hab mir das ganze heute mal unter nem relativ taufrischen Fedora 29 aufgesetzt und musste so einige packages nachinstallieren, damit mechanize überhaupt installiert werden konnte:

 

  • ruby-devel für die ruby header
  • automake
  • redhat-rpm-config
  • gcc-c++
  • zlib-devel
  • git (oder patch, geht beides, aber Git brauch man eh mal)

Danke für die interessante Rückmeldung. Ich hätte andere Pakete erwartet. Mechanize hängt ab von nokogiri (XML-Parser) und dieses von libxml2. Offensichtlich installiert Fedora die libxml2-devel / -header Pakete, aber keinen gcc. Ich habe keine Ahnung, woher die Abhängigkeit von git kommt.

 

Zu deinem Pull-Request: ich habe Bedenken, den zweiten hack (Ignorieren aller nicht-pdfs) offiziell zu machen. Die Aufgabe von codipodo ist es, die Postbox möglichst vollständig herunterzuladen. Das stille Ignorieren von wichtigen Dokumenten (z.B. AGB-Änderungen als html)  ist falsch. Das jetzige Verhalten (exception) ist unschön, aber macht den Anwender auf das Problem aufmerksam und daher "weniger falsch" als das Ignorieren.

 

Möglicherweise liegt die Lösung darin, nicht nach ".pdf" zu suchen und den Dateinamen danach abzuschneiden, sondern nach /.(pdf|html)/ zu schauen und den Dateinamen am ersten Fragezeichen nach diesem Muster abzuschneiden.

 

Kannst du mir bitte einen Pull-Request schicken, der nur die erste Änderung (vom 12.11.2018) umfasst?

 

 

 

 

 

 

 

Tarulia
Mentor ★
1.112 Beiträge

@dg2210  schrieb:

Danke für die interessante Rückmeldung. Ich hätte andere Pakete erwartet. Mechanize hängt ab von nokogiri (XML-Parser) und dieses von libxml2. Offensichtlich installiert Fedora die libxml2-devel / -header Pakete, aber keinen gcc. Ich habe keine Ahnung, woher die Abhängigkeit von git kommt.

nokogiri und libxml2 werden vom Gem mit geladen, brauchen also anscheinend keine Systemlib. Für libxml2 brauchte es aber anscheinend zlib... vermute mal zum entpacken? Habe mir das ehrlich gesagt nicht so genau durchgelesen 🙂

Git wird nicht zwingend benötigt, in der Meldung steht entweder patch oder git. Beide sind um binärpatches auf eine Datei zu legen, warum das Gem das macht hab ich aber nicht weiter nachgeforscht 🙂

 

Zu deinem Pull-Request: ich habe Bedenken, den zweiten hack (Ignorieren aller nicht-pdfs) offiziell zu machen. Die Aufgabe von codipodo ist es, die Postbox möglichst vollständig herunterzuladen. Das stille Ignorieren von wichtigen Dokumenten (z.B. AGB-Änderungen als html)  ist falsch. Das jetzige Verhalten (exception) ist unschön, aber macht den Anwender auf das Problem aufmerksam und daher "weniger falsch" als das Ignorieren.

Ja, den Einwand versteh ich. An dem Problem arbeite ich gerade noch mit und hab das auch soweit raus (config Option), sollte dann vielleicht noch einen dicken Hinweis drantackern 🙂

 

Möglicherweise liegt die Lösung darin, nicht nach ".pdf" zu suchen und den Dateinamen danach abzuschneiden, sondern nach /.(pdf|html)/ zu schauen und den Dateinamen am ersten Fragezeichen nach diesem Muster abzuschneiden.

Das hatte ich auch schon überlegt, aber war nicht die Anfrage, dass die HTML Dateien Probleme machen? Ich hatte den zweiten Hack übrigens am Anfang vergessen und das funktionierte auch, wird das überhaupt noch gebraucht?

Kannst du mir bitte einen Pull-Request schicken, der nur die erste Änderung (vom 12.11.2018) umfasst?

Erledigt: https://github.com/dg2210/comdirect/pull/2

 

PS: Gibt es in diesem Forum eine einfachere Variante Teile eines Beitrags zu zitieren, als in den HTML Modus zu gehen? 😕

dg2210
Legende
6.199 Beiträge

@Tarulia  schrieb:

Das hatte ich auch schon überlegt, aber war nicht die Anfrage, dass die HTML Dateien Probleme machen? Ich hatte den zweiten Hack übrigens am Anfang vergessen und das funktionierte auch, wird das überhaupt noch gebraucht?


Die Fehlermeldung beim Schreiben der heruntergeladenen Datei war  "invalid parameter". Ob man das noch braucht, kann ich dir sagen, sobald ich wieder einmal einen  HTML-Datei in meiner Postbox habe.

 

 

Tarulia
Mentor ★
1.112 Beiträge

Habe ich noch und das ging ohne Probleme 🙂

dg2210
Legende
6.199 Beiträge

@Tarulia  schrieb:

Habe ich noch und das ging ohne Probleme 🙂


Der Dateiname war korrekt?

Tarulia
Mentor ★
1.112 Beiträge

Naja, der Dateiname war korrekt, aber ich habe eben 2 Dateien (einmal noch mit dem forceDownload parameter)

Denke mit (pdf|html) sollte es funktionieren, das Downloaden geht. Nur dass der Zeichensatz wohl falsch ist. Der HTML head sagt charset=ISO-8859-15, und direkt aus der PostBox abrufen funktioniert auch, wenn ich die lokale Datei öffne ist der Zeichensatz aber kaputt... Umlaute sind eben falsch